diff --git a/.gitignore b/.gitignore
index 4e5fa33f..614e95b2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,6 +47,7 @@ targetConfigs/
Debug/
Release/
Spy/
+QSpy/
lib/
obj/
diff --git a/doxygen/metrics.dox b/doxygen/metrics.dox
index 32fc10fb..6c9ded2b 100644
--- a/doxygen/metrics.dox
+++ b/doxygen/metrics.dox
@@ -9,7 +9,7 @@
License Type: Windows Single User License
Licensed To : Quantum Leaps, LLC
License No. : WS2975 License Date: Dec 15, 2013
- Build Date : Sep 2 2009 Run Date: Nov 01, 2016
+ Build Date : Sep 2 2009 Run Date: Nov 02, 2016
(C)1996-2009 M Squared Technologies LLC
________________________________________________________________________
@@ -150,7 +150,7 @@
~~ Total File Summary ~~
- LOC 254 eLOC 222 lLOC 130 Comment 311 Lines 651
+ LOC 255 eLOC 223 lLOC 131 Comment 311 Lines 652
------------------------------------------------------------------------
~~ File Functional Summary ~~
@@ -826,8 +826,9 @@
Loops for / foreach : 1
Conditional if / else if: 5
Logical or ( || ) : 1
- Complexity Param 1 Return 1 Cyclo Vg 13 Total 15
- LOC 111 eLOC 98 lLOC 63 Comment 67 Lines 152
+ Logical and ( && ) : 1
+ Complexity Param 1 Return 1 Cyclo Vg 14 Total 16
+ LOC 112 eLOC 99 lLOC 63 Comment 68 Lines 154
Function: QP::QHsm::hsm_tran
Parameters: (QStateHandler (&path)[MAX_NEST_DEPTH_])
@@ -860,27 +861,27 @@
~~ Total File Summary ~~
- LOC 339 eLOC 292 lLOC 166 Comment 282 Lines 599
+ LOC 340 eLOC 293 lLOC 166 Comment 283 Lines 601
------------------------------------------------------------------------
~~ File Functional Summary ~~
File Function Count....: 7
- Total Function LOC.....: 288 Total Function Pts LOC : 6.4
- Total Function eLOC....: 244 Total Function Pts eLOC: 5.5
+ Total Function LOC.....: 289 Total Function Pts LOC : 6.4
+ Total Function eLOC....: 245 Total Function Pts eLOC: 5.5
Total Function lLOC....: 160 Total Function Pts lLOC: 3.1
Total Function Params .: 8 Total Function Return .: 7
- Total Cyclo Complexity : 41 Total Function Complex.: 56
+ Total Cyclo Complexity : 42 Total Function Complex.: 57
------ ----- ----- ------ ------ -----
- Max Function LOC ......: 111 Average Function LOC ..: 41.14
- Max Function eLOC .....: 98 Average Function eLOC .: 34.86
+ Max Function LOC ......: 112 Average Function LOC ..: 41.29
+ Max Function eLOC .....: 99 Average Function eLOC .: 35.00
Max Function lLOC .....: 63 Average Function lLOC .: 22.86
------ ----- ----- ------ ------ -----
Max Function Parameters: 2 Avg Function Parameters: 1.14
Max Function Returns ..: 1 Avg Function Returns ..: 1.00
Max Interface Complex. : 3 Avg Interface Complex. : 2.14
- Max Cyclomatic Complex.: 15 Avg Cyclomatic Complex.: 5.86
- Max Total Complexity ..: 17 Avg Total Complexity ..: 8.00
+ Max Cyclomatic Complex.: 15 Avg Cyclomatic Complex.: 6.00
+ Max Total Complexity ..: 17 Avg Total Complexity ..: 8.14
________________________________________________________________________
End of File: ..\source\qep_hsm.cpp
@@ -1002,12 +1003,12 @@
LOC 15 eLOC 14 lLOC 8 Comment 17 Lines 20
Function: QP::QF::remove_
- Parameters: (QMActive const * const a)
+ Parameters: (QMActive * const a)
Cyclomatic Complexity Vg Detail
Function Base : 1
Logical and ( && ) : 2
Complexity Param 1 Return 1 Cyclo Vg 3 Total 5
- LOC 15 eLOC 14 lLOC 8 Comment 17 Lines 20
+ LOC 16 eLOC 15 lLOC 9 Comment 18 Lines 21
Function: QP::QF::bzero
Parameters: (void * const start, uint_fast16_t len)
@@ -1021,21 +1022,21 @@
~~ Total File Summary ~~
- LOC 146 eLOC 140 lLOC 22 Comment 104 Lines 255
+ LOC 147 eLOC 141 lLOC 23 Comment 105 Lines 256
------------------------------------------------------------------------
~~ File Functional Summary ~~
File Function Count....: 3
- Total Function LOC.....: 38 Total Function Pts LOC : 2.8
- Total Function eLOC....: 34 Total Function Pts eLOC: 2.6
- Total Function lLOC....: 20 Total Function Pts lLOC: 0.4
+ Total Function LOC.....: 39 Total Function Pts LOC : 2.8
+ Total Function eLOC....: 35 Total Function Pts eLOC: 2.7
+ Total Function lLOC....: 21 Total Function Pts lLOC: 0.4
Total Function Params .: 4 Total Function Return .: 3
Total Cyclo Complexity : 8 Total Function Complex.: 15
------ ----- ----- ------ ------ -----
- Max Function LOC ......: 15 Average Function LOC ..: 12.67
- Max Function eLOC .....: 14 Average Function eLOC .: 11.33
- Max Function lLOC .....: 8 Average Function lLOC .: 6.67
+ Max Function LOC ......: 16 Average Function LOC ..: 13.00
+ Max Function eLOC .....: 15 Average Function eLOC .: 11.67
+ Max Function lLOC .....: 9 Average Function lLOC .: 7.00
------ ----- ----- ------ ------ -----
Max Function Parameters: 2 Avg Function Parameters: 1.33
Max Function Returns ..: 1 Avg Function Returns ..: 1.00
@@ -2551,9 +2552,9 @@
~~ Total Project Summary ~~
- LOC 5657 eLOC 4949 lLOC 2330 Comment 6658 Lines 12599
+ LOC 5660 eLOC 4952 lLOC 2332 Comment 6660 Lines 12603
Average per File, metric/41 files
- LOC 137 eLOC 120 lLOC 56 Comment 162 Lines 307
+ LOC 138 eLOC 120 lLOC 56 Comment 162 Lines 307
------------------------------------------------------------------------
@@ -2903,8 +2904,8 @@
Function: QP::QHsm::dispatch
Parameters: (QEvt const * const e)
- Complexity Param 1 Return 1 Cyclo Vg 13 Total 15
- LOC 111 eLOC 98 lLOC 63 Comment 67 Lines 152
+ Complexity Param 1 Return 1 Cyclo Vg 14 Total 16
+ LOC 112 eLOC 99 lLOC 63 Comment 68 Lines 154
Function: QP::QHsm::hsm_tran
Parameters: (QStateHandler (&path)[MAX_NEST_DEPTH_])
@@ -2972,9 +2973,9 @@
LOC 15 eLOC 14 lLOC 8 Comment 17 Lines 20
Function: QP::QF::remove_
- Parameters: (QMActive const * const a)
+ Parameters: (QMActive * const a)
Complexity Param 1 Return 1 Cyclo Vg 3 Total 5
- LOC 15 eLOC 14 lLOC 8 Comment 17 Lines 20
+ LOC 16 eLOC 15 lLOC 9 Comment 18 Lines 21
Function: QP::QF::bzero
Parameters: (void * const start, uint_fast16_t len)
@@ -3581,26 +3582,26 @@
LOC 14 eLOC 11 lLOC 7 Comment 2 Lines 16
Total: Functions
- LOC 3492 eLOC 2895 lLOC 1769 InCmp 404 CycloCmp 573
+ LOC 3494 eLOC 2897 lLOC 1770 InCmp 404 CycloCmp 574
Function Points FP(LOC) 61.1 FP(eLOC) 51.2 FP(lLOC) 31.6
------------------------------------------------------------------------
~~ Project Functional Analysis ~~
- Total Functions .......: 200 Total Physical Lines ..: 4517
- Total LOC .............: 3492 Total Function Pts LOC : 61.1
- Total eLOC ............: 2895 Total Function Pts eLOC: 51.2
- Total lLOC.............: 1769 Total Function Pts lLOC: 31.6
- Total Cyclomatic Comp. : 573 Total Interface Comp. .: 404
+ Total Functions .......: 200 Total Physical Lines ..: 4520
+ Total LOC .............: 3494 Total Function Pts LOC : 61.1
+ Total eLOC ............: 2897 Total Function Pts eLOC: 51.2
+ Total lLOC.............: 1770 Total Function Pts lLOC: 31.6
+ Total Cyclomatic Comp. : 574 Total Interface Comp. .: 404
Total Parameters ......: 204 Total Return Points ...: 200
- Total Comment Lines ...: 2816 Total Blank Lines .....: 533
+ Total Comment Lines ...: 2818 Total Blank Lines .....: 533
------ ----- ----- ------ ------ -----
- Avg Physical Lines ....: 22.59
- Avg LOC ...............: 17.46 Avg eLOC ..............: 14.48
+ Avg Physical Lines ....: 22.60
+ Avg LOC ...............: 17.47 Avg eLOC ..............: 14.48
Avg lLOC ..............: 8.85 Avg Cyclomatic Comp. ..: 2.87
Avg Interface Comp. ...: 2.02 Avg Parameters ........: 1.02
- Avg Return Points .....: 1.00 Avg Comment Lines .....: 14.08
+ Avg Return Points .....: 1.00 Avg Comment Lines .....: 14.09
------ ----- ----- ------ ------ -----
Max LOC ...............: 260
Max eLOC ..............: 202 Max lLOC ..............: 125
diff --git a/examples/arm-cm/dpp_efm32-slstk3401a/win32-qv/main.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/win32-qv/main.cpp
index c5569b48..159cb9e7 100644
--- a/examples/arm-cm/dpp_efm32-slstk3401a/win32-qv/main.cpp
+++ b/examples/arm-cm/dpp_efm32-slstk3401a/win32-qv/main.cpp
@@ -1,13 +1,13 @@
//****************************************************************************
-// DPP example
-// Last updated for version 5.6.0
-// Last updated on 2015-12-26
+// DPP example for Windows
+// Last updated for version 5.7.5
+// Last updated on 2016-11-08
//
// Q u a n t u m L e a P s
// ---------------------------
// innovating embedded systems
//
-// Copyright (C) Quantum Leaps, www.state-machine.com.
+// 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
@@ -28,24 +28,25 @@
// along with this program. If not, see .
//
// Contact information:
-// Web: www.state-machine.com
-// Email: info@state-machine.com
+// http://www.state-machine.com
+// mailto:info@state-machine.com
//****************************************************************************
#include "qpcpp.h"
#include "dpp.h"
#include "bsp.h"
+// "fudge factor" for Windows, see NOTE1
+enum { WIN_FUDGE_FACTOR = 10 };
+
//............................................................................
int main() {
- static QP::QEvt const *tableQueueSto[N_PHILO];
- static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO];
+ static QP::QEvt const *tableQueueSto[N_PHILO*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO*WIN_FUDGE_FACTOR];
+ static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO*WIN_FUDGE_FACTOR];
+
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
// object dictionaries...
@@ -76,3 +77,24 @@ int main() {
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/arm-cm/dpp_efm32-slstk3401a/win32/main.cpp b/examples/arm-cm/dpp_efm32-slstk3401a/win32/main.cpp
index c5569b48..159cb9e7 100644
--- a/examples/arm-cm/dpp_efm32-slstk3401a/win32/main.cpp
+++ b/examples/arm-cm/dpp_efm32-slstk3401a/win32/main.cpp
@@ -1,13 +1,13 @@
//****************************************************************************
-// DPP example
-// Last updated for version 5.6.0
-// Last updated on 2015-12-26
+// DPP example for Windows
+// Last updated for version 5.7.5
+// Last updated on 2016-11-08
//
// Q u a n t u m L e a P s
// ---------------------------
// innovating embedded systems
//
-// Copyright (C) Quantum Leaps, www.state-machine.com.
+// 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
@@ -28,24 +28,25 @@
// along with this program. If not, see .
//
// Contact information:
-// Web: www.state-machine.com
-// Email: info@state-machine.com
+// http://www.state-machine.com
+// mailto:info@state-machine.com
//****************************************************************************
#include "qpcpp.h"
#include "dpp.h"
#include "bsp.h"
+// "fudge factor" for Windows, see NOTE1
+enum { WIN_FUDGE_FACTOR = 10 };
+
//............................................................................
int main() {
- static QP::QEvt const *tableQueueSto[N_PHILO];
- static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO];
+ static QP::QEvt const *tableQueueSto[N_PHILO*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO*WIN_FUDGE_FACTOR];
+ static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO*WIN_FUDGE_FACTOR];
+
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
// object dictionaries...
@@ -76,3 +77,24 @@ int main() {
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/arm-cm/game_efm32-slstk3401a/win32-qv/main.cpp b/examples/arm-cm/game_efm32-slstk3401a/win32-qv/main.cpp
new file mode 100644
index 00000000..9e1cf348
--- /dev/null
+++ b/examples/arm-cm/game_efm32-slstk3401a/win32-qv/main.cpp
@@ -0,0 +1,113 @@
+//****************************************************************************
+// Product: "Fly 'n' Shoot" game example for Windows
+// Last updated for version 5.7.5
+// Last updated on 2016-11-08
+//
+// 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
+//****************************************************************************
+#include "qpcpp.h"
+#include "bsp.h"
+#include "game.h"
+
+// "fudge factor" for Windows, see NOTE1
+enum { WIN_FUDGE_FACTOR = 10 };
+
+//............................................................................
+int main() {
+ static QP::QEvt const *missileQueueSto[2*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *shipQueueSto[3*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *tunnelQueueSto[(GAME_MINES_MAX + 5)*WIN_FUDGE_FACTOR];
+
+ static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10*WIN_FUDGE_FACTOR];
+ static QF_MPOOL_EL(GAME::ObjectImageEvt)
+ medPoolSto[(2*GAME_MINES_MAX + 10)*WIN_FUDGE_FACTOR];
+
+ static QP::QSubscrList subscrSto[GAME::MAX_PUB_SIG];
+
+ QP::QF::init(); // initialize the framework and the underlying RT kernel
+ GAME::BSP_init(); // initialize the Board Support Package
+
+ // initialize the event pools...
+ QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0]));
+ QP::QF::poolInit(medPoolSto, sizeof(medPoolSto), sizeof(medPoolSto[0]));
+
+ // init publish-subscribe
+ QP::QF::psInit(subscrSto, Q_DIM(subscrSto));
+
+ // send object dictionaries for event queues...
+ QS_OBJ_DICTIONARY(missileQueueSto);
+ QS_OBJ_DICTIONARY(shipQueueSto);
+ QS_OBJ_DICTIONARY(tunnelQueueSto);
+
+ // send object dictionaries for event pools...
+ QS_OBJ_DICTIONARY(smlPoolSto);
+ QS_OBJ_DICTIONARY(medPoolSto);
+
+ // send signal dictionaries for globally published events...
+ QS_SIG_DICTIONARY(GAME::TIME_TICK_SIG, static_cast(0));
+ QS_SIG_DICTIONARY(GAME::PLAYER_TRIGGER_SIG, static_cast(0));
+ QS_SIG_DICTIONARY(GAME::PLAYER_QUIT_SIG, static_cast(0));
+ QS_SIG_DICTIONARY(GAME::GAME_OVER_SIG, static_cast(0));
+
+ // start the active objects...
+ GAME::AO_Tunnel ->start(1U, // priority
+ tunnelQueueSto, Q_DIM(tunnelQueueSto), // evt queue
+ static_cast(0), 0U); // no per-thread stack
+ GAME::AO_Ship ->start(2U, // priority
+ shipQueueSto, Q_DIM(shipQueueSto), // evt queue
+ static_cast(0), 0U); // no per-thread stack
+ GAME::AO_Missile->start(3U, // priority
+ missileQueueSto, Q_DIM(missileQueueSto), // evt queue
+ static_cast(0), 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/arm-cm/game_efm32-slstk3401a/win32/main.cpp b/examples/arm-cm/game_efm32-slstk3401a/win32/main.cpp
new file mode 100644
index 00000000..9e1cf348
--- /dev/null
+++ b/examples/arm-cm/game_efm32-slstk3401a/win32/main.cpp
@@ -0,0 +1,113 @@
+//****************************************************************************
+// Product: "Fly 'n' Shoot" game example for Windows
+// Last updated for version 5.7.5
+// Last updated on 2016-11-08
+//
+// 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
+//****************************************************************************
+#include "qpcpp.h"
+#include "bsp.h"
+#include "game.h"
+
+// "fudge factor" for Windows, see NOTE1
+enum { WIN_FUDGE_FACTOR = 10 };
+
+//............................................................................
+int main() {
+ static QP::QEvt const *missileQueueSto[2*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *shipQueueSto[3*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *tunnelQueueSto[(GAME_MINES_MAX + 5)*WIN_FUDGE_FACTOR];
+
+ static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10*WIN_FUDGE_FACTOR];
+ static QF_MPOOL_EL(GAME::ObjectImageEvt)
+ medPoolSto[(2*GAME_MINES_MAX + 10)*WIN_FUDGE_FACTOR];
+
+ static QP::QSubscrList subscrSto[GAME::MAX_PUB_SIG];
+
+ QP::QF::init(); // initialize the framework and the underlying RT kernel
+ GAME::BSP_init(); // initialize the Board Support Package
+
+ // initialize the event pools...
+ QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0]));
+ QP::QF::poolInit(medPoolSto, sizeof(medPoolSto), sizeof(medPoolSto[0]));
+
+ // init publish-subscribe
+ QP::QF::psInit(subscrSto, Q_DIM(subscrSto));
+
+ // send object dictionaries for event queues...
+ QS_OBJ_DICTIONARY(missileQueueSto);
+ QS_OBJ_DICTIONARY(shipQueueSto);
+ QS_OBJ_DICTIONARY(tunnelQueueSto);
+
+ // send object dictionaries for event pools...
+ QS_OBJ_DICTIONARY(smlPoolSto);
+ QS_OBJ_DICTIONARY(medPoolSto);
+
+ // send signal dictionaries for globally published events...
+ QS_SIG_DICTIONARY(GAME::TIME_TICK_SIG, static_cast(0));
+ QS_SIG_DICTIONARY(GAME::PLAYER_TRIGGER_SIG, static_cast(0));
+ QS_SIG_DICTIONARY(GAME::PLAYER_QUIT_SIG, static_cast(0));
+ QS_SIG_DICTIONARY(GAME::GAME_OVER_SIG, static_cast(0));
+
+ // start the active objects...
+ GAME::AO_Tunnel ->start(1U, // priority
+ tunnelQueueSto, Q_DIM(tunnelQueueSto), // evt queue
+ static_cast(0), 0U); // no per-thread stack
+ GAME::AO_Ship ->start(2U, // priority
+ shipQueueSto, Q_DIM(shipQueueSto), // evt queue
+ static_cast(0), 0U); // no per-thread stack
+ GAME::AO_Missile->start(3U, // priority
+ missileQueueSto, Q_DIM(missileQueueSto), // evt queue
+ static_cast(0), 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/win32-qv/dpp/main.cpp b/examples/win32-qv/dpp/main.cpp
index b6e28d91..36a2a918 100644
--- a/examples/win32-qv/dpp/main.cpp
+++ b/examples/win32-qv/dpp/main.cpp
@@ -1,13 +1,13 @@
//****************************************************************************
-// DPP example
-// Last updated for version 5.4.0
-// Last updated on 2015-04-29
+// DPP example for Windows
+// Last updated for version 5.7.5
+// Last updated on 2016-11-08
//
// Q u a n t u m L e a P s
// ---------------------------
// innovating embedded systems
//
-// Copyright (C) Quantum Leaps, www.state-machine.com.
+// 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
@@ -28,20 +28,23 @@
// along with this program. If not, see .
//
// Contact information:
-// Web: www.state-machine.com
-// Email: info@state-machine.com
+// http://www.state-machine.com
+// mailto:info@state-machine.com
//****************************************************************************
#include "qpcpp.h"
#include "dpp.h"
#include "bsp.h"
+// "fudge factor" for Windows, see NOTE1
+enum { WIN_FUDGE_FACTOR = 10 };
+
//............................................................................
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 QP::QEvt const *tableQueueSto[N_PHILO*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO*WIN_FUDGE_FACTOR];
+ static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO*WIN_FUDGE_FACTOR];
- static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO];
+ static QP::QSubscrList subscrSto[DPP::MAX_PUB_SIG];
QP::QF::init(); // initialize the framework and the underlying RT kernel
@@ -75,3 +78,24 @@ int main() {
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/win32/dpp/main.cpp b/examples/win32/dpp/main.cpp
index b6e28d91..739462f4 100644
--- a/examples/win32/dpp/main.cpp
+++ b/examples/win32/dpp/main.cpp
@@ -1,13 +1,13 @@
//****************************************************************************
-// DPP example
-// Last updated for version 5.4.0
-// Last updated on 2015-04-29
+// DPP example for Windows
+// Last updated for version 5.7.5
+// Last updated on 2016-11-08
//
// Q u a n t u m L e a P s
// ---------------------------
// innovating embedded systems
//
-// Copyright (C) Quantum Leaps, www.state-machine.com.
+// 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
@@ -28,24 +28,25 @@
// along with this program. If not, see .
//
// Contact information:
-// Web: www.state-machine.com
-// Email: info@state-machine.com
+// http://www.state-machine.com
+// mailto:info@state-machine.com
//****************************************************************************
#include "qpcpp.h"
#include "dpp.h"
#include "bsp.h"
+// "fudge factor" for Windows, see NOTE1
+enum { WIN_FUDGE_FACTOR = 10 };
+
//............................................................................
int main() {
- static QP::QEvt const *tableQueueSto[N_PHILO];
- static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO];
+ static QP::QEvt const *tableQueueSto[N_PHILO*WIN_FUDGE_FACTOR];
+ static QP::QEvt const *philoQueueSto[N_PHILO][N_PHILO*WIN_FUDGE_FACTOR];
+ static QF_MPOOL_EL(DPP::TableEvt) smlPoolSto[2*N_PHILO*WIN_FUDGE_FACTOR];
+
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
// object dictionaries...
@@ -75,3 +76,24 @@ int main() {
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/ports/win32-qv/QSpy/vc120.pdb b/ports/win32-qv/QSpy/vc120.pdb
index 6ccc4d40..e5b3b860 100644
Binary files a/ports/win32-qv/QSpy/vc120.pdb and b/ports/win32-qv/QSpy/vc120.pdb differ
diff --git a/ports/win32-qv/qf_port.cpp b/ports/win32-qv/qf_port.cpp
index 4c83e4b6..5c29d6e7 100644
--- a/ports/win32-qv/qf_port.cpp
+++ b/ports/win32-qv/qf_port.cpp
@@ -2,14 +2,14 @@
/// \brief QF/C++ port to Win32 API with cooperative QV scheduler (win32-qv)
/// \cond
///***************************************************************************
-/// Last updated for version 5.7.1
-/// Last updated on 2016-09-23
+/// Last updated for version 5.7.5
+/// Last updated on 2016-11-08
///
/// Q u a n t u m L e a P s
/// ---------------------------
/// innovating embedded systems
///
-/// Copyright (C) Quantum Leaps, www.state-machine.com.
+/// 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
@@ -155,18 +155,8 @@ void QMActive::start(uint_fast8_t prio,
m_prio = prio; // set the QF priority of this AO
QF::add_(this); // make QF aware of this AO
- // ignore the original storage for the event queue 'qSto' and
- // instead allocate an oversized "fudged" storage for the queue.
- // See also NOTE2 in qf_port.h.
- Q_ASSERT_ID(710, static_cast(qLen) * QF_WIN32_FUDGE_FACTOR
- < USHRT_MAX);
- // fudged the queue length
- uint_fast16_t fudgedQLen = qLen * QF_WIN32_FUDGE_FACTOR;
- // fudged queue storage
- void *fudgedQSto = new QEvt*[fudgedQLen];
- // allocation must succeed
- Q_ASSERT_ID(720, fudgedQSto != static_cast(0));
- m_eQueue.init(static_cast(fudgedQSto), fudgedQLen);
+ m_eQueue.init(qSto, qLen);
+
this->init(ie); // execute initial transition (virtual call)
QS_FLUSH(); // flush the QS trace buffer to the host
@@ -175,7 +165,6 @@ void QMActive::start(uint_fast8_t prio,
void QMActive::stop(void) {
unsubscribeAll();
QF::remove_(this);
- delete[] m_eQueue.m_ring; // free the fudged queue storage
}
//****************************************************************************
diff --git a/ports/win32-qv/qf_port.h b/ports/win32-qv/qf_port.h
index cc09ba75..725e56db 100644
--- a/ports/win32-qv/qf_port.h
+++ b/ports/win32-qv/qf_port.h
@@ -2,8 +2,8 @@
/// \brief QF/C++ port to Win32 API with cooperative QV scheduler (win32-qv)
/// \cond
///***************************************************************************
-/// Last updated for version 5.7.2
-/// Last updated on 2016-09-28
+/// Last updated for version 5.7.5
+/// Last updated on 2016-11-08
///
/// Q u a n t u m L e a P s
/// ---------------------------
@@ -67,8 +67,8 @@
#ifdef _MSC_VER // Microsoft C/C++ compiler?
// use built-in intrinsic function for fast LOG2
- #define QF_LOG2(x_) ((uint_fast8_t)(32U - __lzcnt(x_)))
- #include /* VC++ intrinsic functions */
+ #define QF_LOG2(x_) (static_cast(32U - __lzcnt(x_)))
+ #include // VC++ intrinsic functions
#elif __GNUC__ // GNU C/C++ compiler?
// use built-in intrinsic function for fast LOG2
#define QF_LOG2(x_) ((uint_fast8_t)(32U - __builtin_clz(x_)))
@@ -163,13 +163,8 @@ void QF_onClockTick(void);
// Win32-QV specific event pool operations
#define QF_EPOOL_TYPE_ QMPool
- #define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) do { \
- uint_fast32_t fudgedSize = (poolSize_) * QF_WIN32_FUDGE_FACTOR; \
- uint8_t *fudgedSto = new uint8_t[(poolSize_)*QF_WIN32_FUDGE_FACTOR]; \
- Q_ASSERT_ID(210, fudgedSto != (uint8_t *)0); \
- (void)(poolSto_); \
- (p_).init(fudgedSto, fudgedSize, evtSize_); \
- } while (false)
+ #define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) \
+ (p_).init((poolSto_), (poolSize_), (evtSize_))
#define QF_EPOOL_EVENT_SIZE_(p_) ((p_).getBlockSize())
#define QF_EPOOL_GET_(p_, e_, m_) \
@@ -182,11 +177,6 @@ void QF_onClockTick(void);
namespace QP {
extern QPSet QV_readySet_; // QV-ready set of active objects
extern HANDLE QV_win32Event_; // Win32 event to signal events
-
- // Windows "fudge factor" for oversizing the resources, see NOTE2
- enum {
- QF_WIN32_FUDGE_FACTOR = 100
- };
} // namespace QP
#endif // QP_IMPL
@@ -225,24 +215,5 @@ void QF_onClockTick(void);
// Scheduler locking (used inside QF_publish_()) is not needed in the single-
// threaded Win32-QV port, because event multicasting is already atomic.
//
-// NOTE3:
-// 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 QF_WIN32_FUDGE_FACTOR is used to oversize the
-// event queues and event pools.
-//
#endif // qf_port_h
diff --git a/ports/win32/QSpy/vc120.pdb b/ports/win32/QSpy/vc120.pdb
index 489bc5ab..f5972bdb 100644
Binary files a/ports/win32/QSpy/vc120.pdb and b/ports/win32/QSpy/vc120.pdb differ
diff --git a/ports/win32/qf_port.cpp b/ports/win32/qf_port.cpp
index c24f8a15..f960f2c2 100644
--- a/ports/win32/qf_port.cpp
+++ b/ports/win32/qf_port.cpp
@@ -2,14 +2,14 @@
/// \brief QF/C++ port to Win32 API
/// \cond
///***************************************************************************
-/// Last updated for version 5.6.2
-/// Last updated on 2016-01-22
+/// Last updated for version 5.7.5
+/// Last updated on 2016-11-08
///
/// Q u a n t u m L e a P s
/// ---------------------------
/// innovating embedded systems
///
-/// Copyright (C) Quantum Leaps, www.state-machine.com.
+/// 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
@@ -94,7 +94,6 @@ void QF::thread_(QMActive *act) {
act->unsubscribeAll(); // make sure that no events are subscribed
QF::remove_(act); // remove this object from any subscriptions
CloseHandle(act->m_osObject); // cleanup the OS event
- delete[] act->m_eQueue.m_ring; // free the fudged queue storage
}
//****************************************************************************
// helper function to match the signature expeced by CreateThread() Win32 API
@@ -122,7 +121,6 @@ int_t QF::run(void) {
onCleanup(); // cleanup callback
QS_EXIT(); // cleanup the QSPY connection
//DeleteCriticalSection(&l_win32CritSect);
- //free all "fudged" event pools...
return static_cast(0); // return success
}
//****************************************************************************
@@ -154,25 +152,14 @@ void QMActive::start(uint_fast8_t prio,
m_prio = prio; // set the QF priority of this AO
QF::add_(this); // make QF aware of this AO
- // ignore the original storage for the event queue 'qSto' and
- // instead allocate an oversized "fudged" storage for the queue.
- // See also NOTE2 in qf_port.h.
- //
- Q_ASSERT_ID(710, static_cast(qLen) * QF_WIN32_FUDGE_FACTOR
- < USHRT_MAX);
- // fudge the queue length
- uint_fast16_t fudgedQLen = qLen * QF_WIN32_FUDGE_FACTOR;
- QEvt const **fudgedQSto = new QEvt const *[fudgedQLen]; // fudged queue storage
- // allocation must succeed
- Q_ASSERT_ID(720, fudgedQSto != static_cast(0));
- m_eQueue.init(fudgedQSto, fudgedQLen);
+ m_eQueue.init(qSto, qLen);
// save osObject as integer, in case it contains the Win32 priority
int win32Prio = (m_osObject != static_cast(0))
? reinterpret_cast(m_osObject)
: THREAD_PRIORITY_NORMAL;
- /* create the Win32 "event" to throttle the AO's event queue */
+ // create the Win32 "event" to throttle the AO's event queue
m_osObject = CreateEvent(NULL, FALSE, FALSE, NULL);
this->init(ie); // execute initial transition (virtual call)
@@ -182,10 +169,16 @@ void QMActive::start(uint_fast8_t prio,
if (stkSize == 0U) {
stkSize = 1024U; // NOTE: will be rounded up to the nearest page
}
- m_thread = CreateThread(NULL, stkSize, &ao_thread, this, 0, NULL);
- Q_ASSERT_ID(730, m_thread != NULL); // thread must be created
- SetThreadPriority(m_thread, win32Prio);
+ // create a Win32 thread for the AO;
+ // The thread is created with THREAD_PRIORITY_NORMAL
+ m_thread = CreateThread(NULL, stkSize, &ao_thread, this, 0, NULL);
+ Q_ASSERT_ID(730, m_thread != static_cast(0)); // must succeed
+
+ // was the thread priority provided?
+ if (win32Prio != 0) {
+ SetThreadPriority(m_thread, win32Prio);
+ }
}
//****************************************************************************
void QMActive::stop(void) {
diff --git a/ports/win32/qf_port.h b/ports/win32/qf_port.h
index a4a5a634..5b2ac044 100644
--- a/ports/win32/qf_port.h
+++ b/ports/win32/qf_port.h
@@ -2,8 +2,8 @@
/// \brief QF/C++ port to Win32 API
/// \cond
///***************************************************************************
-/// Last updated for version 5.7.2
-/// Last updated on 2016-09-28
+/// Last updated for version 5.7.5
+/// Last updated on 2016-11-08
///
/// Q u a n t u m L e a P s
/// ---------------------------
@@ -172,13 +172,8 @@ void QF_onClockTick(void);
// Win32-specific event pool operations
#define QF_EPOOL_TYPE_ QMPool
- #define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) do { \
- uint_fast32_t fudgedSize = (poolSize_) * QF_WIN32_FUDGE_FACTOR; \
- uint8_t *fudgedSto = new uint8_t[(poolSize_)*QF_WIN32_FUDGE_FACTOR]; \
- Q_ASSERT_ID(210, fudgedSto != (uint8_t *)0); \
- (void)(poolSto_); \
- (p_).init(fudgedSto, fudgedSize, evtSize_); \
- } while (false)
+ #define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) \
+ (p_).init((poolSto_), (poolSize_), (evtSize_))
#define QF_EPOOL_EVENT_SIZE_(p_) ((p_).getBlockSize())
#define QF_EPOOL_GET_(p_, e_, m_) \
@@ -188,13 +183,6 @@ void QF_onClockTick(void);
#define WIN32_LEAN_AND_MEAN
#include // Win32 API
- namespace QP {
- // Windows "fudge factor" for oversizing the resources, see NOTE2
- enum {
- QF_WIN32_FUDGE_FACTOR = 100
- };
- } // namespace QP
-
#endif // QP_IMPL
// NOTES: ====================================================================
@@ -233,24 +221,5 @@ void QF_onClockTick(void);
// will appear atomic, in the sense that no thread will be able to post
// events during multicasting.
//
-// NOTE3:
-// 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 QF_WIN32_FUDGE_FACTOR is used to oversize the
-// event queues and event pools.
-//
#endif // qf_port_h