amended
3
.gitignore
vendored
@ -32,12 +32,11 @@
|
||||
*.Debug
|
||||
*.Release
|
||||
*.bak
|
||||
*.qlc
|
||||
JLink*.*
|
||||
version-*
|
||||
|
||||
3rd_party/
|
||||
html/
|
||||
cert-pack/
|
||||
test_priv/
|
||||
dbg/
|
||||
rel/
|
||||
|
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "3rd_party"]
|
||||
path = 3rd_party
|
||||
url = https://github.com/QuantumLeaps/3rd_party.git
|
1
3rd_party
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 8a2ebb9e76a63a2f46b8ad906657154ab21a15e8
|
26
LICENSES/LicenseRef-QL-dual.qlc
Normal file
@ -0,0 +1,26 @@
|
||||
Any user of the QP/C++ real-time embedded framework
|
||||
qpcpp
|
||||
2023-12-31
|
||||
|
||||
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 top-level comment block.
|
||||
Plagiarizing this software to sidestep the license obligations is illegal.
|
||||
|
||||
Contact information:
|
||||
<www.state-machine.com/licensing>
|
||||
<info@state-machine.com>
|
||||
#0EDBEBE8223119BF5BAB0ECFC1C52D7A75E3B97C
|
25
LICENSES/QM-EVAL-QPCPP.qlc
Normal file
@ -0,0 +1,25 @@
|
||||
Users of QP/C++ Real-Time Embedded Framework (RTEF)
|
||||
qpcpp
|
||||
2023-12-31
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
This generated code is free software: you can redistribute it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
NOTE:
|
||||
Alternatively, this generated code may be distributed under the terms
|
||||
of Quantum Leaps commercial licenses, which expressly supersede the GNU
|
||||
General Public License and are specifically designed for licensees
|
||||
interested in retaining the proprietary status of their code.
|
||||
|
||||
Contact information:
|
||||
<www.state-machine.com/licensing>
|
||||
<info@state-machine.com>
|
||||
#57F9DACB138813B26105022C8852763EB8EE4CDB
|
46
LICENSES/QP-Arduino_GPL_Exception.txt
Normal file
@ -0,0 +1,46 @@
|
||||
QP/C++ and QP-nano FRAMEWORK EXCEPTION FOR ARDUINO
|
||||
|
||||
Version 3.0, December 22, 2021
|
||||
|
||||
Copyright (c) 2005-2021 Quantum Leaps, LLC. <https://www.state-machine.com/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
This QP/C++ and QP-nano Framework Exception for Arduino ("Exception")
|
||||
is an additional permission under section 7 of the GNU General Public
|
||||
License, version 3 ("GPLv3"). It applies to the QP/C++ and QP-nano
|
||||
source code (the "QP Frameworks") that is distributed as part of the
|
||||
QP-Arduino Support Package.
|
||||
|
||||
When you use QP Frameworks inside your program, the QP Frameworks' code
|
||||
is combined with your code of the program. The purpose of this Exception
|
||||
is to allow non-GPL (including proprietary) programs to use, in this way,
|
||||
the QP Frameworks' code covered by this Exception.
|
||||
|
||||
0. Definitions.
|
||||
"QP Frameworks" are lightweight real-time embedded frameworks (RTEFs)
|
||||
as well as all supporting ports and examples, as distributed from:
|
||||
<https://www.state-machine.com> and
|
||||
<https://github.com/QuantumLeaps>
|
||||
|
||||
"Arduino-Certified Board" means any board with an Arduino-supported
|
||||
CPU that bears an official Arduino logo and/or is officially certified
|
||||
under the Arduino Certified Program
|
||||
(see <https://www.arduino.cc/en/hardware>).
|
||||
|
||||
"Target Code" refers to output from any compiler and linker in
|
||||
executable form suitable for execution by an embedded microcontroller.
|
||||
|
||||
|
||||
1. Grant of Additional Permission
|
||||
As a special Exception, the copyright holder of QP Frameworks gives you
|
||||
permission to propagate a work of Target Code formed by combining
|
||||
the QP Frameworks with your own source code without the requirement
|
||||
to expose your proprietary source code, provided that all Target Code
|
||||
will execute on Arduino-Certified Board(s).
|
||||
|
||||
2. No Weakening of GPL
|
||||
The availability of this Exception does not imply any general
|
||||
presumption that third-party software linking to the QP Framework is
|
||||
unaffected by the copyleft requirements of the GPLv3 license.
|
48
LICENSES/QP-RasPi_GPL_Exception.txt
Normal file
@ -0,0 +1,48 @@
|
||||
QP/C and QP/C++ FRAMEWORKS EXCEPTION FOR RASPBERRY PI
|
||||
|
||||
Version 2.0, 2 August 2022
|
||||
|
||||
Copyright (c) 2005-2021 Quantum Leaps, LLC. <https://www.state-machine.com/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
This QP/C++ and QP-nano Framework Exception for Arduino ("Exception")
|
||||
is an additional permission under section 7 of the GNU General Public
|
||||
License, version 3 ("GPLv3"). It applies to the QP/C++ and QP-nano
|
||||
source code (the "QP Frameworks") that is distributed as part of the
|
||||
QP-Arduino Support Package.
|
||||
|
||||
When you use QP Frameworks inside your program, the QP Frameworks' code
|
||||
is combined with your code of the program. The purpose of this Exception
|
||||
is to allow non-GPL (including proprietary) programs to use, in this way,
|
||||
the QP Frameworks' code covered by this Exception.
|
||||
|
||||
0. Definitions.
|
||||
"QP Frameworks" are lightweight real-time embedded frameworks (RTEFs)
|
||||
as well as all supporting ports and examples, as distributed from:
|
||||
<https://www.state-machine.com> and
|
||||
<https://github.com/QuantumLeaps>
|
||||
|
||||
"Raspberry Pi" is a low cost, credit-card sized computer that is
|
||||
designed by the Raspberry Pi Foundation based in the UK and registered
|
||||
as UK educational charity under the number 1129409. For the purpose of
|
||||
this license, Raspberry Pi means only genuine Raspberry Pi computer
|
||||
bearing the Raspberry Pi logo, as described at
|
||||
<https://www.raspberrypi.com/trademark-rules>.
|
||||
|
||||
"Target Code" refers to output from any compiler and linker in
|
||||
executable form suitable for execution by Raspberry Pi.
|
||||
|
||||
|
||||
1. Grant of Additional Permission
|
||||
As a special Exception, the copyright holder of QP Frameworks gives you
|
||||
permission to propagate a work of Target Code formed by combining the QP
|
||||
Frameworks with your own source code without the requirement to expose
|
||||
your propriatory source code, provided that all Target Code will execute
|
||||
on a genuine Raspberry Pi computer(s).
|
||||
|
||||
2. No Weakening of GPL
|
||||
The availability of this Exception does not imply any general
|
||||
presumption that third-party software linking to the QP Framework is
|
||||
unaffected by the copyleft requirements of the GPLv3 license.
|
42
LICENSES/QP-mbed_GPL_Exception.txt
Normal file
@ -0,0 +1,42 @@
|
||||
QP/C and QP/C++ FRAMEWORKS EXCEPTION FOR ARM mbed
|
||||
|
||||
Version 2.0, August 2022
|
||||
|
||||
Copyright (c) 2005-2014 Quantum Leaps, LLC. <https://www.state-machine.com/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
This QP/C++ and QP-nano Framework Exception for Arduino ("Exception")
|
||||
is an additional permission under section 7 of the GNU General Public
|
||||
License, version 3 ("GPLv3"). It applies to the QP/C++ and QP-nano
|
||||
source code (the "QP Frameworks") that is distributed as part of the
|
||||
QP-Arduino Support Package.
|
||||
|
||||
When you use QP Frameworks inside your program, the QP Frameworks' code
|
||||
is combined with your code of the program. The purpose of this Exception
|
||||
is to allow non-GPL (including proprietary) programs to use, in this way,
|
||||
the QP Frameworks' code covered by this Exception.
|
||||
|
||||
0. Definitions.
|
||||
"QP Frameworks" are lightweight real-time embedded frameworks (RTEFs)
|
||||
as well as all supporting ports and examples, as distributed from:
|
||||
<https://www.state-machine.com> and
|
||||
<https://github.com/QuantumLeaps>
|
||||
|
||||
"mbed-Enabled Board" means any board with an ARM Cortex-M CPU that is
|
||||
listed on the official "mbed platforms" website
|
||||
<https://os.mbed.com/platforms>.
|
||||
|
||||
|
||||
1. Grant of Additional Permission
|
||||
As a special Exception, the copyright holder of QP Frameworks gives you
|
||||
permission to propagate a work of Target Code formed by combining
|
||||
the QP Frameworks with your own source code without the requirement
|
||||
to expose your proprietary source code, provided that all Target Code will
|
||||
execute on an "mbed-Enabled Board".
|
||||
|
||||
2. No Weakening of GPL
|
||||
The availability of this Exception does not imply any general
|
||||
presumption that third-party software linking to the QP Framework is
|
||||
unaffected by the copyleft requirements of the GPLv3 license.
|
@ -88,7 +88,7 @@ products ranging from implantable medical devices to complex weapon systems.
|
||||
|
||||
|
||||
# QP/C++ Licensing
|
||||
QP/C++ is licensed under the increasingly popular [dual licensing model][Lic],
|
||||
QP/C++ is licensed under the sustainable [dual licensing model][Lic],
|
||||
in which both the open source software distribution mechanism and
|
||||
traditional closed source software distribution models are combined.
|
||||
|
||||
@ -114,6 +114,13 @@ open the file [html/index.html](html/index.html) in your web browser.
|
||||
- [Quantum Leaps licensing](https://www.state-machine.com/licensing)
|
||||
- [info@state-machine.com](mailto:info@state-machine.com)
|
||||
|
||||
|
||||
# How to Help this Project?
|
||||
If you like this project, please give it a star (in the upper-right corner of your browser window):
|
||||
|
||||
![GitHub star](doxygen/images/github-star.jpg)
|
||||
|
||||
|
||||
[RTEF]: <https://www.state-machine.com/rtef>
|
||||
[QP]: <https://www.state-machine.com/products/qp>
|
||||
[QP/C]: <https://www.state-machine.com/qpc>
|
||||
|
@ -1,17 +1,18 @@
|
||||
# Doxyfile 1.9.3
|
||||
# Doxyfile 1.9.4
|
||||
|
||||
@INCLUDE = ../../ql-doxygen/Doxyfile-QL
|
||||
@INCLUDE = ../../ql-doxygen/ql-doxyfile
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = QP/C++
|
||||
PROJECT_NAME = "QP/C++"
|
||||
PROJECT_NUMBER = 7.0.1
|
||||
PROJECT_BRIEF = "Real-Time Embedded Framework"
|
||||
PROJECT_LOGO = images/logo_ql.png
|
||||
PROJECT_LOGO = ../../ql-doxygen/images/logo_ql.png
|
||||
OUTPUT_DIRECTORY =
|
||||
CREATE_SUBDIRS = NO
|
||||
CREATE_SUBDIRS_LEVEL = 6
|
||||
ALLOW_UNICODE_NAMES = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
@ -41,7 +42,7 @@ PYTHON_DOCSTRING = YES
|
||||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 4
|
||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
OPTIMIZE_FOR_FORTRAN = NO
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
@ -116,6 +117,7 @@ WARN_IF_INCOMPLETE_DOC = YES
|
||||
WARN_NO_PARAMDOC = NO
|
||||
WARN_AS_ERROR = NO
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_LINE_FORMAT = "at line $line of file $file"
|
||||
WARN_LOGFILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the input files
|
||||
@ -142,24 +144,9 @@ INPUT = main.dox \
|
||||
../../cert-pack/autosar.dox \
|
||||
../../cert-pack/tr.dox \
|
||||
metrics.dox \
|
||||
dir.dox \
|
||||
macros.h \
|
||||
../include/qpc.hpp \
|
||||
../include/qep.hpp \
|
||||
../include/qf.hpp \
|
||||
../include/qequeue.hpp \
|
||||
../include/qmpool.hpp \
|
||||
../include/qpset.hpp \
|
||||
../include/qv.hpp \
|
||||
../include/qk.hpp \
|
||||
../include/qxk.hpp \
|
||||
../include/qxthread.hpp \
|
||||
../include/qs.hpp \
|
||||
config.hpp \
|
||||
../include \
|
||||
../src \
|
||||
../ports/arm-cm/qv/gnu \
|
||||
../ports/arm-cm/qk/gnu \
|
||||
../ports/arm-cm/qxk/gnu
|
||||
../src
|
||||
|
||||
INPUT_ENCODING = UTF-8
|
||||
FILE_PATTERNS = *.dox \
|
||||
@ -222,18 +209,24 @@ IGNORE_PREFIX =
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = ../html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER = ../../ql-doxygen/header-awesome.html
|
||||
HTML_FOOTER = ../../ql-doxygen/footer-awesome.html
|
||||
HTML_HEADER = ../../ql-doxygen/ql-header-awesome.html
|
||||
HTML_FOOTER = ../../ql-doxygen/ql-footer-awesome.html
|
||||
HTML_STYLESHEET =
|
||||
HTML_EXTRA_STYLESHEET = ../../ql-doxygen/doxygen-awesome.css \
|
||||
../../ql-doxygen/doxygen-awesome-sidebar-only.css \
|
||||
../../ql-doxygen/doxygen-awesome-sidebar-only-darkmode-toggle.css \
|
||||
../../ql-doxygen/ql-awesome.css
|
||||
|
||||
HTML_EXTRA_FILES = ../../ql-doxygen/doxygen-awesome-darkmode-toggle.js \
|
||||
../../ql-doxygen/preview.js
|
||||
../../ql-doxygen/doxygen-awesome-fragment-copy-button.js \
|
||||
../../ql-doxygen/doxygen-awesome-paragraph-link.js \
|
||||
../../ql-doxygen/ql-preview.js
|
||||
|
||||
HTML_COLORSTYLE_HUE = 209
|
||||
HTML_COLORSTYLE_SAT = 255
|
||||
HTML_COLORSTYLE_GAMMA = 113
|
||||
HTML_TIMESTAMP = NO
|
||||
HTML_DYNAMIC_MENUS = NO
|
||||
HTML_DYNAMIC_MENUS = YES
|
||||
HTML_DYNAMIC_SECTIONS = NO
|
||||
HTML_INDEX_NUM_ENTRIES = 100
|
||||
GENERATE_DOCSET = NO
|
||||
@ -259,11 +252,11 @@ QHP_SECT_FILTER_ATTRS =
|
||||
QHG_LOCATION =
|
||||
GENERATE_ECLIPSEHELP = NO
|
||||
ECLIPSE_DOC_ID = com.state-machine.qp
|
||||
DISABLE_INDEX = YES
|
||||
DISABLE_INDEX = NO
|
||||
GENERATE_TREEVIEW = YES
|
||||
FULL_SIDEBAR = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
TREEVIEW_WIDTH = 300
|
||||
TREEVIEW_WIDTH = 335
|
||||
EXT_LINKS_IN_WINDOW = NO
|
||||
OBFUSCATE_EMAILS = NO
|
||||
HTML_FORMULA_FORMAT = png
|
||||
@ -297,15 +290,15 @@ PREDEFINED = Q_SPY \
|
||||
Q_UTEST \
|
||||
QK_ON_CONTEXT_SW \
|
||||
QXK_ON_CONTEXT_SW \
|
||||
QF_MAX_ACTIVE \
|
||||
QF_MAX_TICK_RATE \
|
||||
QF_MAX_EPOOL \
|
||||
QF_EVENT_SIZ_SIZE \
|
||||
QF_EQUEUE_CTR_SIZE \
|
||||
QF_MPOOL_SIZ_SIZE \
|
||||
QF_MPOOL_CTR_SIZE \
|
||||
QF_TIMEEVT_CTR_SIZE \
|
||||
QF_ACTIVE_STOP \
|
||||
QS_TIME_SIZE
|
||||
QF_MAX_ACTIVE=32 \
|
||||
QF_MAX_TICK_RATE=2 \
|
||||
QF_MAX_EPOOL=3 \
|
||||
QF_EVENT_SIZ_SIZE=2 \
|
||||
QF_EQUEUE_CTR_SIZE=2 \
|
||||
QF_MPOOL_SIZ_SIZE=2 \
|
||||
QF_MPOOL_CTR_SIZE=2 \
|
||||
QF_TIMEEVT_CTR_SIZE=4 \
|
||||
QF_ACTIVE_STOP=0 \
|
||||
QS_TIME_SIZE=4
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
|
@ -6,5 +6,6 @@
|
||||
# Configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
ENABLED_SECTIONS += CERT
|
||||
ENABLED_SECTIONS += CERT
|
||||
HTML_OUTPUT = ../cert-pack
|
||||
|
||||
|
@ -8,8 +8,8 @@
|
||||
PROJECT_LOGO = images/logo_ql-comp.png
|
||||
|
||||
HTML_OUTPUT = tmp
|
||||
HTML_HEADER = ../../ql-doxygen/header.html
|
||||
HTML_FOOTER = ../../ql-doxygen/footer.html
|
||||
HTML_HEADER = ../../ql-doxygen/ql-header.html
|
||||
HTML_FOOTER = ../../ql-doxygen/ql-footer.html
|
||||
HTML_EXTRA_STYLESHEET = ../../ql-doxygen/ql.css
|
||||
HTML_EXTRA_FILES = ../../ql-doxygen/preview.js
|
||||
HTML_EXTRA_FILES = ../../ql-doxygen/ql-preview.js
|
||||
GENERATE_HTMLHELP = YES
|
||||
|
@ -4,7 +4,7 @@
|
||||
<navindex>
|
||||
<tab type="mainpage" visible="yes" title=""/>
|
||||
<tab type="pages" visible="yes" title="" intro=""/>
|
||||
<tab type="modules" visible="yes" title="Certification Pack" intro="List of documents comprising the Certification Pack:"/>
|
||||
<tab type="modules" visible="yes" title="Certification Pack" intro="List of modules comprising the QP/C++ Certification Pack:"/>
|
||||
<tab type="namespaces" visible="yes" title="">
|
||||
<tab type="namespacelist" visible="yes" title="" intro=""/>
|
||||
<tab type="namespacemembers" visible="yes" title="" intro=""/>
|
||||
|
@ -1,7 +1,4 @@
|
||||
@namespace QP {
|
||||
|
||||
/*! @page api API Reference
|
||||
@tableofcontents
|
||||
@nav_next{deprecated}
|
||||
|
||||
@section api_qep QEP (Hierarchical State Machines)
|
||||
@ -44,7 +41,7 @@ QF is a portable, event-driven, real-time framework for execution of active obje
|
||||
|
||||
@subsection api_qf_ps Publish-Subscribe
|
||||
- ::QSubscrList (Subscriber List struct)
|
||||
- QF::psInit()
|
||||
- QActive::psInit()
|
||||
- %QF:: PUBLISH()
|
||||
- QActive::subscribe()
|
||||
- QActive::unsubscribe()
|
||||
@ -240,7 +237,77 @@ QXK is a small, preemptive, priority-based, dual-mode **blocking** kernel that e
|
||||
/*! @page deprecated Deprecated APIs
|
||||
|
||||
__The following QP/C++ APIs are now deprecated:__
|
||||
|
||||
*/
|
||||
|
||||
} // namespace QP
|
||||
/*##########################################################################*/
|
||||
/*! @namespace QP
|
||||
@brief QP/C++ framework
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @namespace QP::QF
|
||||
@brief hierarchical event processor and active object framework
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @namespace QP::QS
|
||||
@brief "QP/Spy" software tracing (target-resident components)
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @namespace QP::QV
|
||||
@brief cooperative, non-preemptive kernel
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @namespace QP::QK
|
||||
@brief preemptive, non-blocking kernel
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @namespace QP::QXK
|
||||
@brief preemptive, dual-mode (non-blocking / blocking) kernel
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir include
|
||||
@brief Platform-independent QP™/C++ API
|
||||
|
||||
@attention
|
||||
The QP™/C++ <span class="img folder">include</span> directory needs to be added to the compiler's include path in the applications using QP™/C++.
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir src
|
||||
@brief Platform-independent QP™/C++ source code
|
||||
|
||||
Files from this directory need to be added to the project, to build the QP™/C++ framework from source code.
|
||||
|
||||
@attention
|
||||
The QP™/C++ <span class="img folder">src</span> directory needs to be added to the compiler's include path in the applications that build QP™/C++ framework from sources (as opposed to using QP as a pre-built library).
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir src/qf
|
||||
@brief Platform-independent implementation of the QEP and QF components.
|
||||
|
||||
@note
|
||||
Typically, files in this directory need to be added to the application build, but some QP ports might not need all the files in this directory. For example, a QP port to a 3rd-party RTOS kernel might be using a message queue of the RTOS instead of the native QP event queue, in which case the file qf_actq.cpp would not be needed and should be excluded from the build.
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir src/qv
|
||||
@brief Platform-independent implementation of the @ref srs_qv built-in kernel.
|
||||
|
||||
@attention
|
||||
Files in this directory need to be included in the QP application build only if the application uses the @ref srs_qv kernel.
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir src/qk
|
||||
@brief Platform-independent implementation of the @ref srs_qk built-in kernel.
|
||||
|
||||
@attention
|
||||
Files in this directory need to be included in the QP application build only if the application uses the @ref srs_qk kernel.
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir src/qxk
|
||||
@brief Platform-independent implementation of the @ref srs_qxk built-in kernel.
|
||||
|
||||
@attention
|
||||
Files in this directory need to be included in the QP application build only if the application uses the @ref srs_qxk kernel.
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir src/qs
|
||||
@brief Platform-independent implementation of the @ref qs component (software tracing).
|
||||
*/
|
||||
|
390
doxygen/config.hpp
Normal file
@ -0,0 +1,390 @@
|
||||
//! @file
|
||||
//! @brief Various macros for configuring and porting QP/C++
|
||||
|
||||
//! The preprocessor switch to disable checking assertions
|
||||
//!
|
||||
//! @description
|
||||
//! When defined, Q_NASSERT disables the following macros #Q_ASSERT,
|
||||
//! #Q_REQUIRE, #Q_ENSURE, #Q_INVARIANT, #Q_ERROR as well as
|
||||
//! #Q_ASSERT_ID, #Q_REQUIRE_ID, #Q_ENSURE_ID, #Q_INVARIANT_ID, and
|
||||
//! #Q_ERROR_ID do NOT evaluate the test condition passed as the
|
||||
//! argument to these macros.
|
||||
//!
|
||||
//! @note One notable exception is the macro #Q_ALLEGE, that still
|
||||
//! evaluates the test condition, but does not report assertion
|
||||
//! failures when the switch Q_NASSERT is defined.
|
||||
#define Q_NASSERT
|
||||
|
||||
//! The maximum number of active objects in the application.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro *must* be defined in the QF port and should be in range
|
||||
//! of 1U..64U, inclusive. The value of this macro determines the maximum
|
||||
//! priority level of an active object in the system. Not all priority
|
||||
//! levels must be used, but the maximum priority cannot exceed
|
||||
//! #QF_MAX_ACTIVE.
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_MAX_ACTIVE, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.hpp header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_MAX_ACTIVE 32U
|
||||
|
||||
//! The maximum number of clock tick rates in the application.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro can be defined in the QF ports and should be in range
|
||||
//! of 1U..15U, inclusive. The value of this macro determines the maximum
|
||||
//! number of clock tick rates for time events (::QTimeEvt).
|
||||
//!
|
||||
//! If the macro is not defined, the default value is 1U.
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_MAX_TICK_RATE, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.h header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_MAX_TICK_RATE 1U
|
||||
|
||||
//! The maximum number of event pools in the application.
|
||||
//!
|
||||
//! This macro should be defined in the QF port and should be in range
|
||||
//! of 1..255, inclusive. The value of this macro determines the maximum
|
||||
//! number of event pools in the system. Not all all these event pools must
|
||||
//! actually be used by the applications, but the maximum number of pools
|
||||
//! cannot exceed #QF_MAX_EPOOL.
|
||||
//!
|
||||
//! If the macro is not defined, the default value is 3
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_MAX_EPOOL, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.hpp header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_MAX_EPOOL 3U
|
||||
|
||||
//! The size (in bytes) of the event-size representation in the QF.
|
||||
//! Valid values: 1U, 2U, or 4U; default 2U
|
||||
//!
|
||||
//! @description
|
||||
//! This macro can be defined in the QF ports to configure the size
|
||||
//! of the event-size.
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_EVENT_SIZ_SIZE, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.hpp header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_EVENT_SIZ_SIZE 2U
|
||||
|
||||
//! The size (in bytes) of the ring-buffer counters used in the native
|
||||
//! QF event queue implementation. Valid values: 1U, 2U, or 4U; default 1U
|
||||
//!
|
||||
//! @description
|
||||
//! This macro can be defined in the QF ports to configure the QP::QEQueueCtr
|
||||
//! type. If the macro is not defined, the default of 1 byte will be chosen
|
||||
//! in qequeue.hpp. The valid #QF_EQUEUE_CTR_SIZE values of 1U, 2U, or 4U,
|
||||
//! correspond to QP::QEQueueCtr of uint8_t, uint16_t, and uint32_t,
|
||||
//! respectively. The QP::QEQueueCtr data type determines the dynamic range
|
||||
//! of numerical values of ring-buffer counters inside event queues, or,
|
||||
//! in other words, the maximum number of events that the native QF event
|
||||
//! queue can manage.
|
||||
//! @sa QP::QEQueue
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_EQUEUE_CTR_SIZE, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.hpp header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_EQUEUE_CTR_SIZE 1U
|
||||
|
||||
//! The size (in bytes) of the block-size representation in the
|
||||
//! native QF event pool. Valid values: 1U, 2U, or 4U; default 2U.
|
||||
//! #QF_EVENT_SIZ_SIZE.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro can be defined in the QF ports to configure the QP::QMPoolSize
|
||||
//! type. If the macro is not defined, the default of #QF_EVENT_SIZ_SIZE
|
||||
//! will be chosen in qmpool.hpp, because the memory pool is primarily used for
|
||||
//! implementing event pools.
|
||||
//!
|
||||
//! The valid #QF_MPOOL_SIZ_SIZE values of 1U, 2U, or 4U, correspond to
|
||||
//! QP::QMPoolSize of uint8_t, uint16_t, and uint32_t, respectively. The
|
||||
//! QP::QMPoolSize data type determines the dynamic range of block-sizes that
|
||||
//! the native QP::QMPool can hanle.
|
||||
//! @sa #QF_EVENT_SIZ_SIZE, QP::QMPool
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_MPOOL_SIZ_SIZE, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.hpp header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_MPOOL_SIZ_SIZE 2U
|
||||
|
||||
//! The size (in bytes) of the block-counter representation in the
|
||||
//! native QF event pool. Valid values: 1U, 2U, or 4U; default 2U.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro can be defined in the QF ports to configure the QP::QMPoolCtr
|
||||
//! type. If the macro is not defined, the default of 2 bytes will be chosen
|
||||
//! in qmpool.hpp. The valid #QF_MPOOL_CTR_SIZE values of 1, 2, or 4, correspond
|
||||
//! to QP::QMPoolSize of uint8_t, uint16_t, and uint32_t, respectively. The
|
||||
//! QP::QMPoolCtr data type determines the dynamic range of block-counters that
|
||||
//! the native QP::QMPool can handle, or, in other words, the maximum number
|
||||
//! of blocks that the native QF event pool can manage.
|
||||
//! @sa QP::QMPool
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_MPOOL_CTR_SIZE, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.hpp header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_MPOOL_CTR_SIZE 2U
|
||||
|
||||
//! The size (in bytes) of the time event -counter representation
|
||||
//! in the QP::QTimeEvt class. Valid values: 1U, 2U, or 4U; default 2U.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro can be defined in the QF ports to configure the internal tick
|
||||
//! counters of Time Events. If the macro is not defined, the default of 2
|
||||
//! bytes will be chosen in qf.hpp. The valid #QF_TIMEEVT_CTR_SIZE values of
|
||||
//! 1U, 2U, or 4U, correspond to tick counters of uint8_t, uint16_t, and
|
||||
//! uint32_t, respectively. The tick counter representation determines the
|
||||
//! dynamic range of time delays that a Time Event can handle.
|
||||
//! @sa QP::QTimeEvt
|
||||
//!
|
||||
//! @note Once you choose a certain value of #QF_TIMEEVT_CTR_SIZE, you must
|
||||
//! consistently use the same value in building all the QP component libraries
|
||||
//! and your own application code. The consistency is guaranteed if you define
|
||||
//! this macro only once in the qf_port.hpp header file and henceforth include
|
||||
//! this header file in all builds.
|
||||
#define QF_TIMEEVT_CTR_SIZE 2U
|
||||
|
||||
//! Size (in bytes) of the QS time stamp
|
||||
//!
|
||||
//! @description
|
||||
//! This macro can be defined in the QS port file (qs_port.hpp) to configure
|
||||
//! the QP::QSTimeCtr type. Valid values 1U, 2U, 4U. Default 4U.
|
||||
#define QS_TIME_SIZE 4U
|
||||
|
||||
//! Define the interrupt disabling policy.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro encapsulates platform-specific way of disabling interrupts
|
||||
//! from C++ for a given CPU and compiler.
|
||||
//!
|
||||
//! @note the #QF_INT_DISABLE macro should always be used in pair with the
|
||||
//! macro #QF_INT_ENABLE.
|
||||
//!
|
||||
#define QF_INT_DISABLE() intDisable()
|
||||
|
||||
//! Define the interrupt enabling policy.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro encapsulates platform-specific way of enabling interrupts
|
||||
//! from "C" for a given CPU and compiler.
|
||||
//!
|
||||
//! @note the #QF_INT_DISABLE macro should always be used in pair with the
|
||||
//! macro #QF_INT_ENABLE.
|
||||
//!
|
||||
#define QF_INT_ENABLE() intEnable()
|
||||
|
||||
//! Define the type of the critical section status.
|
||||
//!
|
||||
//! @description
|
||||
//! Defining this macro configures the "saving and restoring critical section
|
||||
//! status" policy. Conversely, if this macro is not defined, the simple
|
||||
//! "unconditional critical section exit" is used.
|
||||
//!
|
||||
#define QF_CRIT_STAT_TYPE unsigned
|
||||
|
||||
//! Define the critical section entry policy.
|
||||
//!
|
||||
//! This macro enters a critical section (often by means of disabling
|
||||
//! interrupts). When the "saving and restoring critical section status"
|
||||
//! policy is used, the macro sets the \a status_ argument to the critical
|
||||
//! section status just before the entry. When the policy of "unconditional
|
||||
//! critical section exit" is used, the macro does not use the \a status_
|
||||
//! argument.
|
||||
//!
|
||||
//! @note the #QF_CRIT_ENTRY macro should always be used in pair with the
|
||||
//! macro #QF_CRIT_EXIT.
|
||||
//!
|
||||
#define QF_CRIT_ENTRY(stat_) ((stat_) = critEntry())
|
||||
|
||||
//! Define the critical section exit policy.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro enters a critical section (often by means of disabling
|
||||
//! interrupts). When the "saving and restoring critical section status"
|
||||
//! policy is used, the macro restores the critical section status from the
|
||||
//! @a status_ argument. When the policy of "unconditional critical section
|
||||
//! exit" is used, the macro does not use the \a status argument and
|
||||
//! exits the critical section unconditionally (often by means of enabling
|
||||
//! interrupts).
|
||||
//!
|
||||
//! @note the #QF_CRIT_ENTRY macro should always be used in pair with the
|
||||
//! macro #QF_CRIT_EXIT.
|
||||
//!
|
||||
#define QF_CRIT_EXIT(stat_) critExit(stat_)
|
||||
|
||||
//! Enable the QActive::stop() API in the QF port.
|
||||
//!
|
||||
//! @description
|
||||
//! Defining this macro enables the QActive::stop() API in a given port.
|
||||
//! This feature should be used with caution, as stopping and re-starting
|
||||
//! active objects **cleanly** can be tricky.
|
||||
//!
|
||||
#define QF_ACTIVE_STOP
|
||||
|
||||
//! The preprocessor switch to activate the constructor in QP::QEvt.
|
||||
//!
|
||||
//! @description
|
||||
//! When #Q_EVT_CTOR is defined (typically in the qep_port.hpp header file),
|
||||
//! QP::QEvt becomes a class with constructor. More importantly, the
|
||||
//! subclasses of QP::QEvt (custom events) can have non-default constructors.
|
||||
//! These constructors are then called when events are created (e.g.,
|
||||
//! with Q_NEW())
|
||||
//!
|
||||
//! @sa #Q_EVT_VIRTUAL
|
||||
#define Q_EVT_CTOR
|
||||
|
||||
//! The preprocessor switch to activate the virtual destructor in QP::QEvt.
|
||||
//!
|
||||
//! @description
|
||||
//! This macro only works when #Q_EVT_CTOR is also defined. When also
|
||||
//! #Q_EVT_VIRTUAL is defined (typically in the qep_port.hpp header
|
||||
//! file), QP::QEvt becomes a class with a constructor and a virtual
|
||||
//! destructor. More importantly, the subclasses of QP::QEvt (custom events)
|
||||
//! can have (virtual) destructors. These destructors are then invoked
|
||||
//! before recycling the event with QP::QF::gc().
|
||||
#define Q_EVT_VIRTUAL
|
||||
|
||||
//! The preprocessor switch to activate the QS software tracing
|
||||
//! instrumentation in the code
|
||||
//!
|
||||
//! @description
|
||||
//! When defined, Q_SPY activates the QS software tracing instrumentation.
|
||||
//! When Q_SPY is not defined, the QS instrumentation in the code does
|
||||
//! not generate any code.
|
||||
#define Q_SPY
|
||||
|
||||
//! The preprocessor switch to activate the QUTest unit testing
|
||||
//! instrumentation in the code
|
||||
//!
|
||||
//! @note
|
||||
//! This macro requires that #Q_SPY be defined as well.
|
||||
#define Q_UTEST
|
||||
|
||||
//! This macro defines the type of the thread handle used for AOs
|
||||
#define QF_THREAD_TYPE void*
|
||||
|
||||
//! This macro defines the type of the event-queue used for AOs
|
||||
#define QF_EQUEUE_TYPE QEQueue
|
||||
|
||||
//! This macro defines the type of the OS-Object used for blocking
|
||||
//! the native ::QEQueue when the queue is empty
|
||||
//!
|
||||
//! @description
|
||||
//! This macro is used when ::QEQueue is used as the event-queue for AOs
|
||||
//! but also the AO queue must *block* when the queue is empty.
|
||||
//! In that case, #QF_OS_OBJECT_TYPE specifies the blocking mechanism.
|
||||
//! For examle, in the POSIX port, the blocking mechanism is a condition
|
||||
//! variable.
|
||||
//!
|
||||
#define QF_OS_OBJECT_TYPE pthread_cond_t
|
||||
|
||||
//! Platform-dependent macro defining how QF should block the calling
|
||||
//! task when the QF native queue is empty
|
||||
//!
|
||||
//! @note
|
||||
//! This is just an example of #QACTIVE_EQUEUE_WAIT_ for the QK-port
|
||||
//! of QF. QK never activates a task that has no events to process, so in this
|
||||
//! case the macro asserts that the queue is not empty. In other QF ports you
|
||||
//! need to define the macro appropriately for the underlying kernel/OS you're
|
||||
//! using.
|
||||
#define QACTIVE_EQUEUE_WAIT_(me_) \
|
||||
Q_ASSERT((me_)->m_eQueue.m_frontEvt != nullptr)
|
||||
|
||||
//! Platform-dependent macro defining how QF should signal the
|
||||
//! active object task that an event has just arrived.
|
||||
//!
|
||||
//! @description
|
||||
//! The macro is necessary only when the native QF event queue is used.
|
||||
//! The signaling of task involves unblocking the task if it is blocked.
|
||||
//!
|
||||
//! @note #QACTIVE_EQUEUE_SIGNAL_ is called from a critical section.
|
||||
//! It might leave the critical section internally, but must restore
|
||||
//! the critical section before exiting to the caller.
|
||||
//!
|
||||
//! @note This is just an example of #QACTIVE_EQUEUE_SIGNAL_ for the QK-port
|
||||
//! of QF. In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QACTIVE_EQUEUE_SIGNAL_(me_) do { \
|
||||
QF::readySet_.insert((me_)->m_prio); \
|
||||
if (QF::intNest_ == 0U) { \
|
||||
uint8_t p = QK_schedPrio_(); \
|
||||
if (p != 0U) { \
|
||||
QK_sched_(p); \
|
||||
} \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
//! This macro defines the type of the event pool used in this QF port.
|
||||
//!
|
||||
//! @note
|
||||
//! This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_TYPE_ QMPool
|
||||
|
||||
//! This macro enables calling the QK context-switch callback
|
||||
//! QK_onContextSw()
|
||||
#define QK_ON_CONTEXT_SW
|
||||
|
||||
//! This macro enables calling the QXK context-switch callback
|
||||
//! QXK_onContextSw()
|
||||
#define QXK_ON_CONTEXT_SW
|
||||
|
||||
//! Platform-dependent macro defining the event pool initialization
|
||||
//!
|
||||
//! @note
|
||||
//! This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) \
|
||||
(p_).init((poolSto_), (poolSize_), static_cast<QMPoolSize>(evtSize_))
|
||||
|
||||
//! Platform-dependent macro defining how QF should obtain the
|
||||
//! event pool block-size
|
||||
//!
|
||||
//! @note
|
||||
//! This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_EVENT_SIZE_(p_) static_cast<uint32_t>((p_).getBlockSize())
|
||||
|
||||
//! Platform-dependent macro defining how QF should obtain an event
|
||||
//! @a e_ from the event pool @a p_
|
||||
//!
|
||||
//! @note
|
||||
//! This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_GET_(p_, e_, m_, qs_id_) \
|
||||
((e_) = static_cast<QEvt *>((p_).get((m_), (qs_id_))))
|
||||
|
||||
//! Platform-dependent macro defining how QF should return an event
|
||||
//! @a e_ to the event pool @a p_
|
||||
//!
|
||||
//! @note
|
||||
//! This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_PUT_(p_, e_, qs_id_) ((p_).put((e_), (qs_id_)))
|
||||
|
||||
//! Macro that should be defined (typically on the compiler's command line)
|
||||
//! in the Win32-GUI applications that use the @ref win32 or @ref win32-qv
|
||||
//! ports.
|
||||
#define WIN32_GUI
|
@ -1,5 +1,4 @@
|
||||
/*! @page exa Examples
|
||||
@tableofcontents
|
||||
|
||||
@section exa_gen General Comments
|
||||
The QP/C++ distribution contains many @subpage exa_ref "example projects" to demonstrate various QP/C++ features. Each example project is described on its own dedicated page that you can find using several criteria (see @ref exa_ref). The example projects have the following main goals:
|
||||
@ -302,9 +301,6 @@ To work with QP/C++ effectively, you need to learn a bit more about active objec
|
||||
/*##########################################################################*/
|
||||
/*! @page exa_ref Cross-Reference
|
||||
|
||||
@tableofcontents
|
||||
|
||||
|
||||
@section exa_ref_kernel Native Examples (by Built-in Kernel)
|
||||
- @ref exa_qv
|
||||
- @ref exa_qk
|
||||
@ -312,8 +308,6 @@ To work with QP/C++ effectively, you need to learn a bit more about active objec
|
||||
|
||||
|
||||
@section exa_ref_tool Native Examples (by Development Toolchain)
|
||||
@n
|
||||
|
||||
|
||||
@subsection exa_ref_arm-clang ARM-Clang Toolchain (ARM Compiler 6)
|
||||
- @ref arm-cm_blinky_efm32-slstk3401a <a class="preview board" href="bd_EFM32-SLSTK3401A.jpg" title="EFM32-SLSTK3401A"></a> (Cortex-M4)
|
||||
@ -340,7 +334,6 @@ To work with QP/C++ effectively, you need to learn a bit more about active objec
|
||||
- @ref arm-cm_game_efm32-slstk3401a <a class="preview board" href="bd_EFM32-SLSTK3401A.jpg" title="EFM32-SLSTK3401A"></a> (Cortex-M4)
|
||||
- @ref arm-cm_dpp_stm32f4-discovery <a class="preview board" href="bd_STM32F4-Disco.jpg" title="STM32F4-Discovery"></a>
|
||||
- @ref lwip_ek-lm3s6965 <a class="preview board" href="bd_EK-LM3S6965.jpg" title="EK-LM3S6965"></a> (Cortex-M3)
|
||||
- @ref arm7-9_dpp_at91sam7s-ek <a class="preview board" href="bd_AT91SAM7S-EK.jpg" title="AT91SAM7S-EK"></a> (ARM7TDMI)
|
||||
|
||||
|
||||
@subsection exa_ref_gnu-ccs GNU-ARM with TI CCS IDE
|
||||
@ -359,7 +352,6 @@ To work with QP/C++ effectively, you need to learn a bit more about active objec
|
||||
- @ref arm-cr_blinky_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a> (Cortex-R4)
|
||||
- @ref arm-cr_dpp_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a> (Cortex-R4)
|
||||
- @ref lwip_ek-lm3s6965 <a class="preview board" href="bd_EK-LM3S6965.jpg" title="EK-LM3S6965"></a> (Cortex-M3)
|
||||
- @ref arm7-9_dpp_at91sam7s-ek <a class="preview board" href="bd_AT91SAM7S-EK.jpg" title="AT91SAM7S-EK"></a> (ARM7TDMI)
|
||||
|
||||
|
||||
@subsection exa_ref_ccs-430 CCS for MSP430
|
||||
@ -375,7 +367,6 @@ To work with QP/C++ effectively, you need to learn a bit more about active objec
|
||||
@section exa_ref_native Native Examples (by Processor)
|
||||
- @ref exa_arm-cm
|
||||
- @ref exa_arm-cr
|
||||
- @ref exa_arm7-9 ("classic ARM")
|
||||
- @ref exa_msp430 ("classic" MSP430 and "extended" MSP430x)
|
||||
|
||||
|
||||
@ -395,7 +386,6 @@ The examples in the "workstation" directory are designed for workstations (runni
|
||||
- @ref exa_os "Windows" — multi-threaded examples for Windows
|
||||
|
||||
|
||||
|
||||
@section exa_ref_mware Examples for Third-Party Middleware
|
||||
- @ref exa_lwip (open source, see http://lwip.wikia.com/wiki/LwIP_Wiki )
|
||||
- @ref exa_emwin (SEGGER, a.k.a. uC/GUI by Micrium)
|
||||
@ -475,12 +465,6 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
- @ref arm-cr_dpp_launchxl2-tms57012 (QV, QK kernels; CCS-TI-ARM, IAR-EWARM toolchains)
|
||||
|
||||
|
||||
@subsection exa_ref_arm7-9 ARM7 Boards:
|
||||
@anchor AT91SAM7S-EK
|
||||
![AT91SAM7S-EK](bd_AT91SAM7S-EK.jpg)
|
||||
- @ref arm7-9_dpp_at91sam7s-ek (QV, QK kernels; IAR-EWARM toolchains)
|
||||
|
||||
|
||||
@subsection exa_ref_msp430 MSP430 Boards:
|
||||
@anchor MSP-EXP430F5529LP
|
||||
![MSP-EXP430F5529LP](bd_MSP-EXP430F5529LP.jpg)
|
||||
@ -509,16 +493,12 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
- ARM Cortex-R
|
||||
- @ref arm-cr_blinky_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a>
|
||||
- @ref arm-cr_dpp_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a>
|
||||
- ARM7 / ARM9
|
||||
- @ref arm7-9_dpp_at91sam7s-ek <a class="preview board" href="bd_AT91SAM7S-EK.jpg" title="AT91SAM7S-EK"></a>
|
||||
|
||||
- MSP430
|
||||
- @ref msp430_blinky_msp-exp430f5529lp <a class="preview board" href="bd_MSP-EXP430F5529LP.jpg" title="MSP-EXP430F5529LP"></a>
|
||||
- @ref msp430_dpp_msp-exp430f5529lp <a class="preview board" href="bd_MSP-EXP430F5529LP.jpg" title="MSP-EXP430F5529LP"></a>
|
||||
|
||||
@section exa_ref_vendor Examples by MCU Vendor
|
||||
- Atmel
|
||||
- @ref arm7-9_dpp_at91sam7s-ek <a class="preview board" href="bd_AT91SAM7S-EK.jpg" title="AT91SAM7S-EK"></a>
|
||||
- NXP
|
||||
- @ref arm-cm_dpp_mbed-lpc1768 <a class="preview board" href="bd_mbed-LPC1768.jpg" title="mbed-LPC1768"></a>
|
||||
- Silicon Labs
|
||||
|
@ -1,327 +0,0 @@
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_low-power Low-Power Example
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>The main principle of low-power design for software is to keep the hardware in the most appropriate low-power sleep mode for as long as possible. Most commonly, the software enters a low-power sleep mode from the **idle callback** (a.k.a. "idle hook"), which is called when the software has nothing left to do and is waiting for an interrupt to deliver more work. The QP/C and QP/C++ Real-Time Embedded Frameworks (RTEFs) support the *idle callback* in all of the built-in real-time kernels, such as the cooperative @ref qv "QV kernel", the preemptive non-blocking @ref qk "QK kernel" and the preemptive blocking @ref qxk "QXK kernel". Also, such an *idle callback* is provided in all 3rd-party traditional RTOS kernels that QP/C/C++ have been @ref ports_rtos "ported to".
|
||||
</p>
|
||||
|
||||
@remark
|
||||
Design for low-power is a broad subject that requires a holistic system approach to achieve a really long battery-powered operation. This example covers only certain *software-related* aspects of the problem.
|
||||
|
||||
|
||||
|
||||
@section arm-cm_low_power_tick The System Clock Tick
|
||||
Most real-time systems, including traditional RTOSes and RTEFs, require a periodic time
|
||||
source called the **system clock tick** to keep track of time delays, timeouts, and QP::QTimeEvt "time events" in case of the event-driven QP frameworks. The system clock tick is typically a periodic
|
||||
interrupt that occurs at a predetermined rate, typically between 10Hz and 1000Hz.
|
||||
|
||||
While the system clock tick is very useful, it also has the unfortunate side effect of taking the processor out of a low power state as many as 1000 times per second regardless if real work needs to be done or not. This effect can have a significant negative impact on the power efficiency of the system.
|
||||
|
||||
![Additional power dissipation caused by the system clock tick](exa_low-power_tick.gif)
|
||||
|
||||
|
||||
|
||||
@subsection arm-cm_low_power_tickless The "Tickless Mode"
|
||||
Some real-time kernels use the low-power optimization called the "tickless mode" (a.k.a. "tick supression" or "dynamic tick"). In this mode, instead of indiscriminately making the clock tick fire with a fixed period, the kernel adjusts the clock ticks *dynamically*, as needed. Specifically, after each clock tick the kernel re-calculates the time for the next clock tick and then sets the clock tick interrupt for the earliest timeout it has to wait for. So for example, if the shortest wait the kernel has to attend to is 300 milliseconds into the future, then the clock interrupt will be set for 300 milliseconds.
|
||||
|
||||
This approach maximizes the amount of time the processor can remain asleep, but requires the kernel to perform the additional work to calculate the dynamic tick intervals and to program them into the hardware. This additional bookkeeping adds complexity to the kernel, is often non-deterministic and, most importantly, extends the time CPU spends in the high-power active mode and thus eliminates some of the power gains the "tickless mode" was supposed to bring.
|
||||
|
||||
Also, the "tickless mode" requires a more capable hardware timer that must be able of being reprogrammed for every interrupt in a wide dynamic range and also must accurately keep track of the elapsed time to correct for the irregular (dynamic) tick intervals. Still, "tickless mode" often causes a drift in the timing of the clock tick.
|
||||
|
||||
|
||||
|
||||
@subsection arm-cm_low_power_multiple Multiple Tick Rates
|
||||
For the reasons just mentioned, the QP™ Real-Time Embedded Frameworks don't provide the "tickless mode". Instead, the QP™ frameworks support **multiple clock tick rates**, which can be turned on and off, as needed. The QP™ frameworks also provide methods for finding out *when* a given clock tick rate is not used, which allows the idle callback inside the application to shut down the given clock tick rate and also to decide which sleep mode to use for the CPU and the peripherals.
|
||||
|
||||
The support for multiple static clock tick rates is much *simpler* than the "dynamic tick", and essentially does not increase the complexity of the kernel (because the same code for the single tick rate can handle other tick rates the same way). Also, multiple static tick rates require much simpler hardware timers, which can be clocked specifically to the desired frequency and don't need particularly wide dynamic range. For example, 16-bit timers or even 8-bit timers are completely adequate.
|
||||
|
||||
Yet the *multiple clock rates* can deliver similar low-power operation for the system, while keeping the QP framework much simpler and easier to certify than "tickless" kernels. The rest of this example explains how to use the multiple static clock rates in QP/C/C++ and shows how to leverage this feature to achieve low-power software design.
|
||||
|
||||
|
||||
|
||||
@section arm-cm_low_power_app The Low-Power Example Application
|
||||
The low-power example is located in QP/C and QP/C++ distributions, in the directory with the following structure:
|
||||
|
||||
@code{c}
|
||||
qpc|qpcpp/ // QP/C/C++ installation directory
|
||||
+-examples/ // QP/C/C++ examples directory (application)
|
||||
| +-arm-cm/ // QP/C/C++ examples for ARM Cortex-M
|
||||
| | +-low-power_ek-tm4c123gxl/ // Low-Power example on the EK-TM4C123GLX board
|
||||
| | | +-qk/ //----------- Projects for the preemptive QK kernel
|
||||
| | | | +-arm/ // ARM-KEIL toolchain
|
||||
| | | | | +-low-power-qk.uvprojx // uVision project
|
||||
| | | | +-gnu/ // GNU-ARM toolchain
|
||||
| | | | | +-Makefile // Makefile for building the project
|
||||
| | | | +-iar/ // IAR-ARM toolchain
|
||||
| | | | | +-low-power-qk.eww // IAR EW-ARM workspace
|
||||
| | | | +-bsp.c // BSP for the QK kernel
|
||||
| | | +-qv/ //----------- Projects for the cooperative QV kernel
|
||||
| | | | +-arm/ // ARM-KEIL toolchain
|
||||
| | | | | +-low-power-qv.uvprojx // uVision project
|
||||
| | | | +-gnu/ // GNU-ARM toolchain
|
||||
| | | | | +-Makefile // Makefile for building the project with GNU-ARM
|
||||
| | | | +-iar/ // IAR-ARM toolchain
|
||||
| | | | | +-low-power-qk.eww // IAR EW-ARM workspace
|
||||
| | | | +-bsp.c|.cpp // BSP for the QV kernel
|
||||
| | | +-qxk/ //----------- Projects for the dual-mode QXK kernel
|
||||
| | | | +-arm/ // ARM-KEIL toolchain
|
||||
| | | | | +-low-power-qxk.uvprojx // uVision project
|
||||
| | | | +-gnu/ // GNU-ARM toolchain
|
||||
| | | | | +-Makefile // Makefile for building the project
|
||||
| | | | +-iar/ // IAR-ARM toolchain
|
||||
| | | | | +-low-power-qxk.eww // IAR EW-ARM workspace
|
||||
| | | | +-bsp.c|.cpp // BSP for the QxK kernel
|
||||
| | | | +-xblinky1.c|.cpp // eXtended thread for the QXK kernel
|
||||
@endcode
|
||||
|
||||
|
||||
@note
|
||||
To focus the discussion, this example uses the **EK-TM4C123GXL** evaluation board (a.k.a. TivaC LaunchPad) with Cortex-M4 MCU. However, the general demonstrated principles apply to most modern microcontrollers.
|
||||
|
||||
|
||||
@n
|
||||
![EK-TM4C123GXL evaluation board](bd_EK-TM4C123GXL_pins.jpg)
|
||||
|
||||
|
||||
|
||||
@subsection arm-cm_low_power_behave Behavior
|
||||
The the low-power example illustrates the use of two clock tick rates to toggle the LEDs available on the EK-TM4C123GXL board. After the application code is loaded to the board, the **Green-LED** starts blinking once per two seconds (a second on and a second off), while the **Red-LED** lights up and stays on. If no buttons on the board are pressed, the **Green-LED** stops blinking after 4 times. The **Red-LED** shows the **idle** condition, where the system is in a sleep mode.
|
||||
|
||||
When your press the **SW1-Button**, the **Green-LED** starts blinking as before, but additionally, the **Blue-LED** starts blinking rapidly for 13 times (1/10 of a second on and 1/10 off).
|
||||
|
||||
So, depending when the SW1 switch is pressed, you can have only **Green-LED** blinking, or both green and blue blinking at different rates. The **Red-LED** appears to be on all the time.
|
||||
|
||||
@note
|
||||
Actually, the **Red-LED** is also turned off for very brief moments, but this is imperceptible to the human eye. Instead, the **Red-LED** appears to be on all the time, which corresponds to the application being mostly idle.
|
||||
|
||||
|
||||
The behavior just described is designed for the slow human interaction with the application. However, for more precise measurements with a logic analyzer, it is more convenient to speed up the application by factor of 100. This speed up can be achieved by editing the `bsp.h` header file:
|
||||
|
||||
@code{.c}
|
||||
/* 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 0
|
||||
#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
|
||||
|
||||
. . .
|
||||
@endcode
|
||||
|
||||
The following logic analyzer trace shows the behavior of the low-power application at the faster time scale. The explanation section immediately following the tarce explains the most interesting points:
|
||||
|
||||
![low-power application after pressing the SW1 button](exa_low-power_sig.png)
|
||||
|
||||
<dl class="tag">
|
||||
<dt>0</dt><dd>
|
||||
The plot shows the logic-analyzer traces of the following signals (from the top): **SW1** button (active low), **Blinky1** (Blue-LED), **Blinky0** (Green-LED) and **Idle** (Red-LED). The Idle callback turns the **Red-LED** on when the system enters the low-power sleep mode and it turns the **Red-LED** off when the system is active.
|
||||
</dd>
|
||||
<dt>1</dt><dd>
|
||||
At this time the **SW1** button is depressed, which triggers an interrupt that activates both the slow and the fast clock tick rates. The clock tick interrupts trigger toggling of the **Blinky0** (Green-LED) at the slower tick rate-0 and **Blinky1** (Blue-LED) at the faster tick rate-1.
|
||||
</dd>
|
||||
<dt>2</dt><dd>
|
||||
The **Blinky1** (Blue-LED) stops toggling after 13 cycles. At this point also the **Idle** callback turns the **fast tick rate-1** off.
|
||||
</dd>
|
||||
<dt>3</dt><dd>
|
||||
The **Blinky0** (Green-LED) stops toggling after 4 cycles.
|
||||
</dd>
|
||||
<dt>4</dt><dd>
|
||||
The **Idle** callback turns the **slow tick rate-0** off. The system enters the low-power sleep mode without any clock ticks running and remains in this state until the **SW1** button is pressed again.
|
||||
</dd>
|
||||
</dl>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
@note
|
||||
The **Idle** line (Red-LED) goes down twice as fast as the changes in the state of the **Green-LED** or the **Blue-LED**. This is because the application uses timeouts of **2 clock ticks** for toggling these lines instead of just one clock tick, which then could be slower. This is not quite optimal for the energy dissipation (as the CPU is woken up twice as often as it needs to be), but it illustrates more accurately how the fixed clock rates work as well as the one-tick delay to enter the low-power sleep mode from the idle callback.
|
||||
|
||||
|
||||
|
||||
@subsection arm-cm_low_power_sm State Machines
|
||||
The versions of this low-power example for the **QK** and **QV** kernels use two active objects **Blinky0** and **Blinky1**, which toggle the **Green-LED** at the slow tick rate 0, and the **Blue-LED** at the fast tick rate 1, respectively. The state machines of the Blinky0 and Blinky1 active objects are shown below:
|
||||
|
||||
![state machines Blinky0 and Blinky1 active objects](exa_low-power_sm.png)
|
||||
|
||||
<dl class="tag">
|
||||
<dt>0</dt><dd>
|
||||
The **Blinky0** state machine, in the entry action to the "active" state, calls `BSP_tickRate0_on()` to turn the tick rate-0 on. This is done *before* arming the time event `me->timeEvt0` that uses the clock rate-0.
|
||||
</dd>
|
||||
<dt>1</dt><dd>
|
||||
Similarly, the **Blinky1** state machine, in the entry action to the "active" state, calls `BSP_tickRate1_on()` to turn the tick rate-1 on. This is done *before* arming the time event `me->timeEvt1` that uses the clock rate-1.
|
||||
</dd>
|
||||
</dl>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
|
||||
|
||||
@subsection arm-cm_low_power_xt Extended Thread (QXK)
|
||||
The version of this low-power example for the **QXK** kernel uses one active object **Blinky0** (with the state machine shown above), but instead of the Blinky1 active object, the QXK version uses an eXtended thread (::QXThread) called **XBlinky1**, with the code shown below:
|
||||
|
||||
@code{c}
|
||||
#include "qpc.h"
|
||||
#include "low_power.h"
|
||||
#include "bsp.h"
|
||||
|
||||
/* local objects -----------------------------------------------------------*/
|
||||
static void XBlinky1_run(QXThread * const me);
|
||||
|
||||
/* global objects ----------------------------------------------------------*/
|
||||
QXThread XT_Blinky1;
|
||||
QXSemaphore XSEM_sw1;
|
||||
|
||||
/*..........................................................................*/
|
||||
void XBlinky1_ctor(void) {
|
||||
QXThread_ctor(&XT_Blinky1,
|
||||
&XBlinky1_run, /* thread routine */
|
||||
1U); /* associate the thread with tick rate-1 */
|
||||
}
|
||||
|
||||
/*..........................................................................*/
|
||||
static void XBlinky1_run(QXThread * const me) {
|
||||
bool isActive = false;
|
||||
|
||||
(void)me; /* unused parameter */
|
||||
for (;;) {
|
||||
if (!isActive) {
|
||||
[0] QXSemaphore_wait(&XSEM_sw1, QXTHREAD_NO_TIMEOUT);
|
||||
isActive = true;
|
||||
}
|
||||
else {
|
||||
uint8_t count;
|
||||
[1] BSP_tickRate1_on();
|
||||
for (count = 13U; count > 0U; --count) {
|
||||
BSP_led1_on();
|
||||
QXThread_delay(1U);
|
||||
BSP_led1_off();
|
||||
QXThread_delay(1U);
|
||||
}
|
||||
isActive = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@endcode
|
||||
|
||||
<dl class="tag">
|
||||
<dt>0</dt><dd> The **XBlinky1** extended thread emulates the states with the `isActive` flag. When the flag is not set (meaning that the system is not active), the thread waits (and blocks) on the global semaphore `XSEM_sw1`.
|
||||
</dd>
|
||||
<dt>1</dt><dd> After the semaphore is signalled (from the GPIO interrupt in the BSP), the **XBlinky1** extened thread calls `BSP_tickRate1_on()` to turn the tick rate-1 on. This is done *before* later calling QXThread_delay() function, which in case uses the clock rate-1.
|
||||
</dd>
|
||||
</dl>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
|
||||
@subsection arm-cm_low_power_idle The Idle Callback (QK/QXK)
|
||||
The most important functionality in this low-power example is implemented in the **idle callback** located in the BSP (Board Support Package). The idle callback QK_onIdle() for the preemptive QK kernel and the idle callback QXK_onIdle() for the QXK kernel are almost identical and are explained in this section.
|
||||
|
||||
@code{c}
|
||||
[0] void QXK_onIdle(void) {
|
||||
|
||||
[1] QF_INT_DISABLE();
|
||||
[2] if (((l_activeSet & (1U << SYSTICK_ACTIVE)) != 0U) /* rate-0 enabled? */
|
||||
[3] && QF_noTimeEvtsActiveX(0U)) /* no time events at rate-0? */
|
||||
{
|
||||
/* safe to disable SysTick and interrupt */
|
||||
[4] SysTick->CTRL &= ~(SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk);
|
||||
[5] l_activeSet &= ~(1U << SYSTICK_ACTIVE); /* mark rate-0 as disabled */
|
||||
}
|
||||
[6] if (((l_activeSet & (1U << TIMER0_ACTIVE)) != 0U) /* rate-1 enabled? */
|
||||
[7] && QF_noTimeEvtsActiveX(1U)) /* no time events at rate-1? */
|
||||
{
|
||||
/* safe to disable Timer0 and interrupt */
|
||||
[8] TIMER0->CTL &= ~(1U << 0); /* disable Timer0 */
|
||||
[9] TIMER0->IMR &= ~(1U << 0); /* disable timer interrupt */
|
||||
[10] l_activeSet &= ~(1U << TIMER0_ACTIVE); /* mark rate-1 as disabled */
|
||||
}
|
||||
[11] QF_INT_ENABLE();
|
||||
|
||||
[12] GPIOF->DATA_Bits[LED_RED] = 0xFFU; /* turn LED on, see NOTE2 */
|
||||
[13] __WFI(); // wait for interrupt */
|
||||
[14] GPIOF->DATA_Bits[LED_RED] = 0x00U; /* turn LED off, see NOTE2 */
|
||||
}
|
||||
@endcode
|
||||
|
||||
<dl class="tag">
|
||||
<dt>0</dt><dd> The idle callback for QK and QXK are called from the idle loop with interrupts enabled.
|
||||
</dd>
|
||||
<dt>1</dt><dd> Interrupts are disabled to access the shared bitmask `l_activeSet`, which stores the information about active clock rates and peripherals. This bitmask is shared between the idle callback and the application-level threads.
|
||||
</dd>
|
||||
<dt>2</dt><dd> If the SYSTICK timer is active (source of the tick-0 rate)...
|
||||
</dd>
|
||||
<dt>3</dt><dd> The `QF_noTimeEvtsActiveX(0)` function is called to check whether no time events are active at the clock rate-0.
|
||||
|
||||
> <b>NOTE:</b> The QF_noTimeEvtsActiveX() function is designed to be called from a critical section, which is the case here.
|
||||
|
||||
</dd>
|
||||
<dt>4</dt><dd> If both of these conditions hold, it is safe to turn the clock rate-0 off, which is done here.
|
||||
</dd>
|
||||
<dt>5</dt><dd> The bit indicating that SYSTICK timer is active is cleared in the `l_activeSet` bitmask.
|
||||
</dd>
|
||||
<dt>6</dt><dd> Simliarly, the bit corresponding to TIMER0 is checked in the `l_activeSet` bitmask.
|
||||
</dd>
|
||||
<dt>7</dt><dd> The `QF_noTimeEvtsActiveX(1)` function is called to check whether no time events are active at the clock rate-1.
|
||||
</dd>
|
||||
<dt>8-9</dt><dd> If both of these conditions hold, it is safe to turn the clock rate-1 off, which is done here.
|
||||
</dd>
|
||||
<dt>10</dt><dd> The bit indicating that TIMER0 timer is active is cleared in the `l_activeSet` bitmask.
|
||||
</dd>
|
||||
<dt>11</dt><dd> Interrupts are enabled, so the following code is no logner inside critical section
|
||||
</dd>
|
||||
<dt>12</dt><dd> The **Red-LED** is turned ON right before entering the low-power sleep mode
|
||||
</dd>
|
||||
<dt>13</dt><dd> The `__WFI()` instruction stops the CPU and enters the **low-power sleep mode**
|
||||
</dd>
|
||||
<dt>14</dt><dd> The **Red-LED** is turned off after waking up from the sleep mode
|
||||
</dd>
|
||||
</dl>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
|
||||
@subsection arm-cm_low_power_idle-qv The Idle Callback (QV)
|
||||
The idle callback QV_onIdle() for the cooperative QV kernel is slightly different, because it is called with interrupts **disabled**. The following listing shows the complete QV_onIdle() callback, with the most important points explained in the section below:
|
||||
|
||||
@code{c}
|
||||
[0] void QV_onIdle(void) { /* NOTE: called with interrupts DISABLED */
|
||||
|
||||
[1] if (((l_activeSet & (1U << SYSTICK_ACTIVE)) != 0U) /* rate-0 enabled? */
|
||||
[2] && QF_noTimeEvtsActiveX(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? */
|
||||
&& QF_noTimeEvtsActiveX(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 */
|
||||
[3] QV_CPU_SLEEP(); /* atomically go to sleep and enable interrupts */
|
||||
GPIOF->DATA_Bits[LED_RED] = 0x00U; /* turn LED off, see NOTE2 */
|
||||
}
|
||||
@endcode
|
||||
|
||||
<dl class="tag">
|
||||
<dt>0</dt><dd> The idle callback for QV is called from the QV event-loop with interrupts **disabled**.
|
||||
</dd>
|
||||
<dt>1</dt><dd> The `l_activeSet` bitmask is tested right away, because interrupts are already disabled
|
||||
</dd>
|
||||
<dt>2</dt><dd> The `QF_noTimeEvtsActiveX(0)` function is called to check whether no time events are active at the clock rate-0.
|
||||
|
||||
> <b>NOTE:</b> The QF_noTimeEvtsActiveX() function is designed to be called from a critical section, which is the case here.
|
||||
|
||||
</dd>
|
||||
<dt>3</dt><dd> The QV_CPU_SLEEP() macro enters **low-power sleep mode** with interrupts still disabled. This port-specific macro is designed to re-anable interrupts **atomically** with entering the sleep mode.
|
||||
</dd>
|
||||
</dl>
|
||||
<div style="clear:both;"></div>
|
||||
|
||||
*/
|
@ -5,20 +5,14 @@ namespace QP {
|
||||
|
||||
<p>The QP/C++ framework contains real-time kernels (@ref comp_qv and @ref comp_qk), so it can run natively ("bare-metal") on single-chip microcontrollers, completely replacing a traditional RTOS. Click on the following links to see examples for the specified built-in kernels:
|
||||
</p>
|
||||
|
||||
- @subpage exa_qv
|
||||
- @subpage exa_qk
|
||||
- @subpage exa_qxk
|
||||
|
||||
|
||||
|
||||
Click on the following links to see examples for the specified CPU architectures:
|
||||
|
||||
- @subpage exa_arm-cm
|
||||
- @subpage exa_arm-cr
|
||||
- @subpage exa_arm7-9
|
||||
- @subpage exa_msp430
|
||||
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page exa_qv QV Kernel (Non-Preemptive, Priority-Based, Non-Blocking)
|
||||
@ -37,10 +31,9 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
- @ref arm-cm_dpp_nucleo-h743zi <a class="preview board" href="bd_NUCLEO-H743ZI.jpg" title="STM32 NUCLEO-H743ZI"></a>
|
||||
- @ref arm-cm_dpp_nucleo-l552ze <a class="preview board" href="bd_NUCLEO-L552ZE.jpg" title="STM32 NUCLEO-L552ZE Q"></a>
|
||||
- @ref arm-cm_game_efm32-slstk3401a <a class="preview board" href="bd_EFM32-SLSTK3401A.jpg" title="EFM32-SLSTK3401A"></a>
|
||||
- @ref arm-cm_low-power <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
- @ref tut_low <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
- @ref arm-cr_blinky_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a>
|
||||
- @ref arm-cr_dpp_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a>
|
||||
- @ref arm7-9_dpp_at91sam7s-ek <a class="preview board" href="bd_AT91SAM7S-EK.jpg" title="AT91SAM7S-EK"></a>
|
||||
- @ref msp430_blinky_msp-exp430f5529lp <a class="preview board" href="bd_MSP-EXP430F5529LP.jpg" title="MSP-EXP430F5529LP"></a>
|
||||
- @ref msp430_dpp_msp-exp430f5529lp <a class="preview board" href="bd_MSP-EXP430F5529LP.jpg" title="MSP-EXP430F5529LP"></a>
|
||||
*/
|
||||
@ -61,10 +54,9 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
- @ref arm-cm_dpp_stm32f4-discovery <a class="preview board" href="bd_STM32F4-Disco.jpg" title="STM32F4-Discovery"></a>
|
||||
- @ref arm-cm_dpp_nucleo-h743zi <a class="preview board" href="bd_NUCLEO-H743ZI.jpg" title="STM32 NUCLEO-H743ZI"></a>
|
||||
- @ref arm-cm_dpp_nucleo-l552ze <a class="preview board" href="bd_NUCLEO-L552ZE.jpg" title="STM32 STM32 NUCLEO-L552ZE Q"></a>
|
||||
- @ref arm-cm_low-power <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
- @ref tut_low <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
- @ref arm-cr_blinky_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a>
|
||||
- @ref arm-cr_dpp_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a>
|
||||
- @ref arm7-9_dpp_at91sam7s-ek <a class="preview board" href="bd_AT91SAM7S-EK.jpg" title="AT91SAM7S-EK"></a>
|
||||
- @ref msp430_blinky_msp-exp430f5529lp <a class="preview board" href="bd_MSP-EXP430F5529LP.jpg" title="MSP-EXP430F5529LP"></a>
|
||||
- @ref msp430_dpp_msp-exp430f5529lp <a class="preview board" href="bd_MSP-EXP430F5529LP.jpg" title="MSP-EXP430F5529LP"></a>
|
||||
|
||||
@ -80,7 +72,7 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
- @ref arm-cm_dpp_stm32f4-discovery <a class="preview board" href="bd_STM32F4-Disco.jpg" title="STM32F4-Discovery"></a>
|
||||
- @ref arm-cm_dpp_nucleo-l552ze <a class="preview board" href="bd_NUCLEO-L552ZE.jpg" title="STM32 NUCLEO-L552ZE Q"></a>
|
||||
- @ref arm-cm_dpp_nucleo-h743zi <a class="preview board" href="bd_NUCLEO-H743ZI.jpg" title="STM32 NUCLEO-H743ZI"></a>
|
||||
- @ref arm-cm_low-power <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
- @ref tut_low <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
@ -100,7 +92,7 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
- @subpage arm-cm_dpp_nucleo-h743zi <a class="preview board" href="bd_NUCLEO-H743ZI.jpg" title="STM32 NUCLEO-H743ZI"></a>
|
||||
- @subpage arm-cm_dpp_nucleo-l552ze <a class="preview board" href="bd_NUCLEO-L552ZE.jpg" title="STM32 NUCLEO-L552ZE"></a>
|
||||
- @subpage arm-cm_game_efm32-slstk3401a <a class="preview board" href="bd_EFM32-SLSTK3401A.jpg" title="EFM32-SLSTK3401A"></a>
|
||||
- @subpage arm-cm_low-power <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
- @ref tut_lowr <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a>
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page exa_arm-cr ARM Cortex-R
|
||||
@ -112,14 +104,6 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
- @subpage arm-cr_dpp_launchxl2-tms57012 <a class="preview board" href="bd_LAUNCHXL2-TMS57012.jpg" title="LAUNCHXL2-TMS57012"></a>
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page exa_arm7-9 ARM7/ARM9 ("classic" ARM)
|
||||
|
||||
@note
|
||||
You can hover the mouse cursor over the <span class="board"></span> icon in the list below to see the picture of the board.
|
||||
|
||||
- @subpage arm7-9_dpp_at91sam7s-ek <a class="preview board" href="bd_AT91SAM7S-EK.jpg" title="AT91SAM7S-EK"></a>
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page exa_msp430 MSP430 ("classic" MSP430 and "extended" MSP430x)
|
||||
|
||||
@note
|
||||
@ -133,8 +117,6 @@ You can hover the mouse cursor over the <span class="board"></span>
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_blinky_ek-tm4c123gxl Blinky on EK-TM4C123GXL
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>This example implements the @ref blinky "Blinky sample application" on the EK-TM4C123GLX board (ARM Cortex-M4F).
|
||||
</p>
|
||||
|
||||
@ -202,8 +184,6 @@ The Windows emulation is a simple console application that produces the followin
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_blinky_efm32-slstk3401a Blinky on EFM32-SLSTK3401A
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>This example implements the @ref blinky "Blinky sample application" on the EFM32-SLSTK3401A board (ARM Cortex-M4F).
|
||||
</p>
|
||||
|
||||
@ -269,8 +249,6 @@ The Windows emulation is a simple console application that produces the followin
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_dpp_ek-tm4c123gxl DPP on EK-TM4C123GXL
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>This example implements the @ref dpp "Dining Philosophers Problem" sample application on the EK-TM4C123GLX board (ARM Cortex-M4F).
|
||||
</p>
|
||||
|
||||
@ -283,9 +261,9 @@ The DPP example is located in the directory <span class="img folder">qpcpp/examp
|
||||
+-examples/ // QP/C++ examples directory (applications)
|
||||
| +-arm-cm/ // QP/C++ examples for ARM Cortex-M
|
||||
| | +-dpp_ek-tm4c123gxl/ // DPP example on the EK-TM4C123GLX board
|
||||
| | | +-lint/ // PC-Lint version (static analysis of the application code)
|
||||
| | | +-lint-plus/ // PC-Lint-Plus version (static analysis of the application code)
|
||||
| | | | +-lin.bat // batch file for running the PC-Lint
|
||||
| | | | +-options.lnt // PC-Lint options file for the DPP application code
|
||||
| | | | +-options.lnt // PC-Lint options file for the application code
|
||||
| | | +-qk/ // QK version
|
||||
| | | | +-armclang/ // ARM-KEIL with arm-clang (compiler 6)
|
||||
| | | | | +-dpp-qk.uvprojx // uVision project
|
||||
@ -361,13 +339,10 @@ The examples demonstrates the QUTest unit tests for the application.
|
||||
|
||||
@section arm-cm_dpp_ek-tm4c123gxl_spy QP/Spy Software Tracing
|
||||
The application also demonstrates <a href="https://www.state-machine.com/qtools/qpspy.html" target="_blank" class="extern">QP/Spy</a> software tracing output and input. To exercise this feature, you need to build and upload the Spy build configuration into the board.
|
||||
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_dpp_efm32-slstk3401a DPP on EFM32-SLSTK3401A
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>This example implements the @ref dpp "Dining Philosophers Problem" sample application on the EFM32-SLSTK3401A board (ARM Cortex-M4F).
|
||||
</p>
|
||||
|
||||
@ -380,7 +355,7 @@ The DPP example is located in the directory <span class="img folder">qpcpp/examp
|
||||
+-examples/ // QP/C++ examples directory (application)
|
||||
| +-arm-cm/ // QP/C++ examples for ARM Cortex-M
|
||||
| | +-dpp_efm32-slstk3401a/ // DPP example on the EK-TM4C123GLX board
|
||||
| | | +-lint/ // PC-Lint version (static analysis of the application code)
|
||||
| | | +-lint-plus/ // PC-Lint-Plus version (static analysis of the application code)
|
||||
| | | | +-lin.bat // batch file for running the PC-Lint
|
||||
| | | | +-options.lnt // PC-Lint options file for the DPP application code
|
||||
| | | +-qk/ // QK version
|
||||
@ -441,7 +416,6 @@ The DPP example is located in the directory <span class="img folder">qpcpp/examp
|
||||
Once programmed into the board, the example rapidly toggles the LED1 from the idle loop (LED1 glows) and toggles LED0 as the Philosophers change their state. Additionally, you can depress and hold the BTN0 button (left) to PAUSE the application (Table transitions into the "paused" state). Releasing the BTN0 button causes transition back to the "serving" state.
|
||||
|
||||
|
||||
|
||||
@section arm-cm_dpp_efm32-slstk3401a_spy QP/Spy Software Tracing
|
||||
The application also demonstrates <a href="https://www.state-machine.com/qtools/qpspy.html" target="_blank" class="extern">QP/Spy</a> software tracing output and input. To exercise this feature, you need to build and upload the Spy build configuration into the board.
|
||||
|
||||
@ -454,11 +428,10 @@ The application also demonstrates <a href="https://www.state-machine.com/qtools/
|
||||
Dining Philosophers Problem (DPP) example for NXP LPC1768 MCU (Cortex-M3) with GNU-ARM toolchain.
|
||||
|
||||
@image html mbed-LPC1768_button.jpg Adding External Button to mbed-LPC1768
|
||||
@n
|
||||
@n
|
||||
|
||||
<br>
|
||||
@image html under_construction.jpg
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_dpp_nucleo-l053r8 DPP on STM32 NUCLEO-L053R8
|
||||
|
||||
@ -471,7 +444,6 @@ Demonstrated built-in kernels:
|
||||
- preemptive, run-to-completion @ref qk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
|
||||
- dual-mode (run-to-completion/blocking) @ref qxk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
|
||||
|
||||
|
||||
Features:
|
||||
- multiple active objects, including 5 instances of the same AO class (Philo)
|
||||
- extended threads (the QXK version)
|
||||
@ -489,13 +461,11 @@ Demonstrated built-in kernels:
|
||||
- cooperative @ref qv with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
|
||||
- preemptive, run-to-completion @ref qk with ARM-Clang, ARM-Keil, GNU-ARM, and IAR-ARM toolchains
|
||||
|
||||
|
||||
Features:
|
||||
- multiple active objects, including 5 instances of the same AO class (Philo)
|
||||
- [QP/Spy software tracing](https://www.state-machine.com/qtools/qpspy.html) using the virtual COM-port
|
||||
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_dpp_stm32f4-discovery DPP on STM32F4-Discovery
|
||||
|
||||
@ -515,7 +485,6 @@ Features:
|
||||
- [QP/Spy software tracing](https://www.state-machine.com/qtools/qpspy.html) using the virtual COM-port
|
||||
- bi-directional [QP/Spy](https://www.state-machine.com/qtools/qs.html#qs_rx) (sending commands to the target)
|
||||
|
||||
|
||||
After you load the DPP example into the STM32F4-Discovery board, the application should start blinking the 4 on-board LEDs. You can press the User button (blue) to PAUSE the philosophers for as long as the button is depressed. The philosophers resume dining when you release the User button. (In the PAUSED state the Table active object stops granting permissions to eat, so eventually all philosophers end in the "hungry" state.)
|
||||
|
||||
|
||||
@ -545,7 +514,6 @@ The actual COM port number might be different on your Windows machine. Please ch
|
||||
|
||||
@next{arm-cm_dpp_nucleo-l552ze}
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_dpp_nucleo-h743zi DPP on STM32 NUCLEO-H743ZI
|
||||
|
||||
@ -565,7 +533,6 @@ Features:
|
||||
- bi-directional [QP/Spy](https://www.state-machine.com/qtools/qs.html#qs_rx) (sending commands to the target)
|
||||
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_dpp_nucleo-l552ze DPP on STM32 STM32 NUCLEO-L552ZE Q
|
||||
|
||||
@ -585,7 +552,6 @@ Features:
|
||||
- bi-directional [QP/Spy](https://www.state-machine.com/qtools/qs.html#qs_rx) (sending commands to the target)
|
||||
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_game_efm32-slstk3401a "Fly 'n' Shoot" Game on EFM32-SLSTK3401A
|
||||
|
||||
@ -598,7 +564,6 @@ Features:
|
||||
@n
|
||||
@image html under_construction.jpg
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cr_blinky_launchxl2-tms57012 Blinky on LAUNCHXL2-TMS57012
|
||||
|
||||
@ -615,16 +580,6 @@ Features:
|
||||
|
||||
Dining Philosophers Problem (DPP) example for LAUNCHXL2-TMS57012 MCU (Cortex-R, Hercules) with IAR-ARM and TI toolchains.
|
||||
|
||||
@image html under_construction.jpg
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page arm7-9_dpp_at91sam7s-ek DPP on AT91SAM7S-EK
|
||||
|
||||
@image html bd_AT91SAM7S-EK.jpg AT91SAM7S-EK board
|
||||
|
||||
Dining Philosophers Problem (DPP) example for Atmel AT91SAM7S MCU (ARM7) with GNU-ARM toolchain.
|
||||
|
||||
@image html under_construction.jpg
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
@ -637,7 +592,6 @@ Simple Blinky example for MSP-EXP430F5529LP with CCS-430 and IAR-430 toolchains.
|
||||
@note
|
||||
The simple Blinky application does NOT support the Spy build configuration. Please see the @ref msp430_dpp_msp-exp430f5529lp "DPP example" for QS output.
|
||||
|
||||
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page msp430_dpp_msp-exp430f5529lp DPP on MSP-EXP430F5529LP
|
||||
@ -658,4 +612,4 @@ qspy -cCOM_PORT -O2 -F2 -E1 -P1 -B1
|
||||
where `COM_PORT` denotes the Virtual COM port, which you can find out in the Device Manager.
|
||||
*/
|
||||
|
||||
} // namespace QP
|
||||
} // namespace QP
|
||||
|
@ -1,7 +1,5 @@
|
||||
/*! @page exa_os Examples for Workstations (Windows/POSIX)
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>The examples in the <span class="img folder">qpcpp/examples/workstation</span> directory are designed for workstations (running Windows, Linux, or MacOS). Currently, the following examples are provided:
|
||||
</p>
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
/*! @page exa_qutest Examples for QUTest Unit Testing Harness
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>The examples in the <span class="img folder">qpcpp/examples/qutest</span> directory demonstrate how to test embedded code with the [<b>QUTest</b>](https://www.state-machine.com/qtools/qutest.html) unit testing harness. Currently, the following examples are provided:
|
||||
</p>
|
||||
|
||||
|
@ -9,9 +9,10 @@ The main purpose of integrating QP/C++ with conventional RTOSes is to enable you
|
||||
- @subpage exa_freertos (directory <span class="img folder">examples/freertos/</span>)
|
||||
- @subpage exa_threadx (directory <span class="img folder">examples/threadx/</span>)
|
||||
- @subpage exa_uc-os2 (directory <span class="img folder">examples/uc-os2/</span>)
|
||||
- @subpage exa_zephyr (directory <span class="img folder">examples/zephyr/</span>)
|
||||
|
||||
@note
|
||||
You do **not** need to use a third-party RTOS just to achieve preemptive multitasking with QP/C++. The framework contains a selection of built-in real-time kernels, such as the cooperative @ref qv "QV kernel", the preemptive non-blocking @ref qk "QK kernel", and the preemptive, dual-mode, blocking @ref qxk "QXK kernel". Specifically, the QXK kernel has been designed specifically for mixing event-driven active objects with traditional **blocking code**, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software.
|
||||
You do **not** need to use a third-party RTOS just to achieve preemptive multitasking with QP/C++. The framework contains a selection of built-in real-time kernels, such as the cooperative @ref srs_qv "QV kernel", the preemptive non-blocking @ref srs_qk "QK kernel", and the preemptive, dual-mode, blocking @ref srs_qxk "QXK kernel". Specifically, the QXK kernel has been designed specifically for mixing event-driven active objects with traditional **blocking code**, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software.
|
||||
|
||||
@next{exa_embos examples}
|
||||
*/
|
||||
@ -264,7 +265,6 @@ The sub-directory <span class="img folder">iar</span> contains the workspace and
|
||||
After you load the DPP example into the STM32F4-Discovery board, the application should start blinking the 4 on-board LEDs. You can press the User button (blue) to PAUSE the philosophers for as long as the button is depressed. The philosophers resume dining when you release the User button. (In the PAUSED state the Table active object stops granting permissions to eat, so eventually all philosophers end in the "hungry" state.)
|
||||
|
||||
|
||||
|
||||
@section threadx_dpp_stm32f429-discovery_qs QS Software Tracing
|
||||
|
||||
The DPP example for ThreadX on STM32F4-Discovery board provides the "Spy" build configuration, which outputs the QS (Quantum Spy) software tracing data through USART2. To get the data out of the board, you need to connect the TTL/RS232 converter as follows:
|
||||
@ -294,9 +294,9 @@ The actual COM port number might be different on your Windows machine. Please ch
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page exa_uc-os2 uC/OS-II
|
||||
/*! @page exa_uc-os2 uC-OS2
|
||||
|
||||
The QP/C++ examples for uC/OS-II are as follows:
|
||||
The QP/C++ examples for uC-OS2 are as follows:
|
||||
|
||||
- ARM Cortex-M
|
||||
- @subpage uc-os2_dpp_ek-tm4c123gxl (Cortex-M4F) <a class="preview board" href="bd_EK-TM4C123GXL.jpg" title="EK-TM4C123GXL"></a><br>(ARM-CLANG, GNU-ARM and IAR EWARM toolsets)
|
||||
@ -327,7 +327,129 @@ DPP example for STM32 L053R8 MCU (Cortex-M0+) and ARM-CLANG, GNU-ARM and IAR EWA
|
||||
|
||||
@image html under_construction.jpg
|
||||
|
||||
@next{exa_os examples}
|
||||
@next{exa_zephyr examples}
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page exa_zephyr Zephyr
|
||||
|
||||
The QP/C++ examples for Zephyr are as follows:
|
||||
|
||||
- @subpage zephyr_blinky
|
||||
- @subpage zephyr_dpp
|
||||
|
||||
@next{zephyr_blinky}
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page zephyr_blinky Blinky
|
||||
|
||||
Blinks an on-board LED once per second.
|
||||
|
||||
The blinking is done by an Active Object (Blinky) with a state machine.
|
||||
|
||||
@section zephyr_blinky-build Building and Running
|
||||
|
||||
- Linux:
|
||||
Open a terminal in the blinky directory.
|
||||
|
||||
@verbatim
|
||||
source ~/zephyrproject/zephyr/zephyr-env.sh
|
||||
|
||||
west build -b <board>
|
||||
|
||||
west flush
|
||||
@endverbatim
|
||||
|
||||
@section zephyr_blinky-output Sample Output
|
||||
Once flashed to the board, the application also produces ASCII output to the serial terminal (if supported by the board):
|
||||
|
||||
@verbatim
|
||||
*** Booting Zephyr OS build v2.6.0-rc2-88-g3d39f72a88b3 ***
|
||||
BSP_ledOff
|
||||
QF_onStartup
|
||||
BSP_ledOn
|
||||
BSP_ledOff
|
||||
BSP_ledOn
|
||||
BSP_ledOff
|
||||
@endverbatim
|
||||
|
||||
@note
|
||||
The example has been tested with the following boards:
|
||||
|
||||
![STM32-NUCLEO-L053R8 board](bd_NUCLEO-L053R8.jpg)
|
||||
<br>
|
||||
|
||||
![STM32-NUCLEO-H743ZI board](bd_NUCLEO-H743ZI.jpg)
|
||||
|
||||
@note
|
||||
The example should also work with most boards supported by Zephyr.
|
||||
|
||||
@section zephyr_blinky-limits Limitations
|
||||
The simple Blinky example does not support the QS software tracing.
|
||||
|
||||
@next{zephyr_dpp}
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page zephyr_dpp DPP
|
||||
|
||||
DPP example with multiple active objects.
|
||||
|
||||
@section zephyr_dpp-build Building and Running
|
||||
|
||||
- Linux:
|
||||
Open a terminal in the dpp directory.
|
||||
|
||||
@verbatim
|
||||
source ~/zephyrproject/zephyr/zephyr-env.sh
|
||||
|
||||
west build -b <board>
|
||||
|
||||
west flush
|
||||
@endverbatim
|
||||
|
||||
@section zephyr_dpp-output Sample Output
|
||||
Once flashed to the board, the application also produces ASCII output to the serial terminal (if supported by the board):
|
||||
|
||||
@verbatim
|
||||
*** Booting Zephyr OS build v2.6.0-rc2-88-g3d39f72a88b3 ***
|
||||
Philo[4]->thinking
|
||||
Philo[3]->eating
|
||||
Philo[1]->thinking
|
||||
Philo[0]->eating
|
||||
Philo[4]->hungry
|
||||
Philo[3]->thinking
|
||||
Philo[2]->eating
|
||||
Philo[1]->hungry
|
||||
Philo[0]->thinking
|
||||
Philo[4]->eating
|
||||
Philo[3]->hungry
|
||||
Philo[0]->hungry
|
||||
Philo[4]->thinking
|
||||
Philo[0]->eating
|
||||
Philo[2]->thinking
|
||||
Philo[3]->eating
|
||||
Philo[4]->hungry
|
||||
Philo[2]->hungry
|
||||
Philo[3]->thinking
|
||||
Philo[2]->eating
|
||||
Philo[0]->thinking
|
||||
@endverbatim
|
||||
|
||||
@note
|
||||
The example has been tested with the following boards:
|
||||
|
||||
![STM32-NUCLEO-L053R8 board](bd_NUCLEO-L053R8.jpg)
|
||||
<br>
|
||||
|
||||
![STM32-NUCLEO-H743ZI board](bd_NUCLEO-H743ZI.jpg)
|
||||
|
||||
@note
|
||||
The example should also work with most boards supported by Zephyr.
|
||||
|
||||
@section zephyr_dpp-limits Limitations
|
||||
The DPP example currently does not support the QS software tracing,
|
||||
because implementation of the QS output over UART is board dependent. However, for a specific board, re-implementing the QS callbacks should be straightforward.
|
||||
|
||||
@next{exa_os}
|
||||
*/
|
||||
} // namespace QP
|
||||
|
@ -1,20 +1,25 @@
|
||||
/*! @page gs Getting Started
|
||||
@nav{index,gs_get}
|
||||
|
||||
The following sections describe how to get started with QP™/C++ quickly:
|
||||
- @subpage gs_get
|
||||
- @subpage gs_over
|
||||
- @subpage gs_tut
|
||||
|
||||
The YouTube Video <a class="extern" target="_blank" href="https://youtu.be/O7ER6_VqIH0"><strong>Getting Started with QP™ Frameworks</strong></a> provides instructions on how to download, install and get started with QP quickly.
|
||||
|
||||
[![Video: Getting Started with QP™ Real-Time Embedded Framework](gs-video.jpg)](https://youtu.be/O7ER6_VqIH0)
|
||||
|
||||
@note
|
||||
<a href="modules.html" title="QP Cert-Pack"><img src="cert-pack.png" style="float:right; margin:0 20px 20px 0;"></img></a>
|
||||
Information about the QP/C++ functionality, architecture, design, and other aspects is provided in the [Certification Package](modules.html):
|
||||
- @ref srs — QP/C++ functionality
|
||||
- @ref sas — QP/C++ architecture
|
||||
- @ref sds — QP/C++ design
|
||||
- @ref autosar — QP/C++ compliance with AUTOSAR-C++ guidelines
|
||||
|
||||
@nav{index,gs_get}
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page gs_get Downloading & Installing QP™/C++
|
||||
@tableofcontents
|
||||
@nav{gs,gs_tut}
|
||||
|
||||
@section gs_bundle Downloading QP™/C++ in QP™-Bundle
|
||||
@ -64,7 +69,6 @@ The standard QP™/C++ distribution contains the `examples` folder with many
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page gs_tut QP™/C++ Tutorial
|
||||
@tableofcontents
|
||||
@nav{gs_over,tut_blinky}
|
||||
|
||||
This Tutorial describes how to use the QP/C++™ real-time embedded framework in a series of progressively advancing examples. The first example ("Blinky") uses only one Active Object with a simple non-hierarchical state machine. The following example ("DPP") demonstrates multiple, communicating Active Objects. Finally, the last example ("Fly'n'Shoot" game) demonstrates all features the QP™ framework. It is highly recommended to study the simpler examples before the more advanced ones, as the basic information won't be repeated in the later examples.
|
||||
@ -93,7 +97,6 @@ By copying and re-naming an existing, working project, as opposed to creating a
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page tut_blinky Simple Blinky Application
|
||||
@tableofcontents
|
||||
@nav{gs_tut,tut_dpp}
|
||||
|
||||
The ultra-simple Blinky example is the embedded systems' equivalent of the venerable <i>"Hello World!"</i> program, that is, the simplest possible working QP™ application that does "something". In the case of Blinky, this "something" is blinking an LED at the rate of 1Hz, where an LED turns on and remains on for 0.5 seconds on then turns off and remains off for 0.5 seconds.
|
||||
@ -122,7 +125,6 @@ The details of the Blinky application are describe in the Quantum Leaps Applicat
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page tut_dpp Dining Philosophers Problem (DPP)
|
||||
@tableofcontents
|
||||
@nav{tut_blinky,tut_game}
|
||||
|
||||
The Dining Philosophers Problem (DPP) example is an intermediate-level application with *multiple* active objects. It illustrates the following QP™ features, such as:
|
||||
@ -184,7 +186,6 @@ The "Fly 'n' Shoot" game example is described in the @webref{doc/AN_Fly-n-Shoot.
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page tut_low Low-Power Example
|
||||
@tableofcontents
|
||||
@nav{tut_game,exa}
|
||||
|
||||
The main principle of low-power design for software is to keep the hardware in the most appropriate low-power sleep mode for as long as possible. Most commonly, the software enters a low-power sleep mode from the **idle callback** (a.k.a. "idle hook"), which is called when the software has nothing left to do and is waiting for an interrupt to deliver more work. The QP/C++ and QP/C++ Real-Time Embedded Frameworks (RTEFs) support the *idle callback* in all of the built-in real-time kernels, such as the cooperative @ref srs_qv "QV kernel", the preemptive non-blocking @ref srs_qk "QK kernel" and the preemptive blocking @ref srs_qxk "QXK kernel". Also, such an *idle callback* is provided in all 3rd-party traditional RTOS kernels that QP/C/C++ have been @ref ports_rtos "ported to".
|
||||
|
@ -1,17 +1,48 @@
|
||||
namespace QP {
|
||||
|
||||
/** @page history Revision History
|
||||
|
||||
@section qpcpp_7_0_1 Version 7.0.1, 2022-05-14
|
||||
Adapted QP/C++ source code to avoid warings from the new C++20 standard about: "compound assignment with 'volatile'-qualified left operand is deprecated".
|
||||
@section qpcpp_7_0_1 Version 7.0.1, 2022-07-31
|
||||
This release is the first one that contains the complete [QM model](https://www.state-machine.com/products/qm) of the QP/C++ framework (in the file `qpcpp/qpcpp.qm`). This model is then used to **generate all QP/C++ source code**:
|
||||
- `qpcpp/`
|
||||
+ @ref C:/qp-dev/qpcpp/include "include"
|
||||
+ @ref C:/qp-dev/qpcpp/src "src"
|
||||
|
||||
The QM model of QP/C++ explicitly captures the *logical design* of the framework, which is then mapped to the preexisting [physical design](https://www.state-machine.com/qm/ce.html#ce_phys). The *logical design*, which consists of packages (often associated with namespaces), classes, types, and macros traces explicitly to the @ref sas "Software Architecture Specification (SAS)" and is easier to manipulate and refactor.
|
||||
|
||||
__Source Code Changes:__
|
||||
- The whole QP/C++ source code is now generated from the `qpcpp.qm` model.
|
||||
- Refactored classes with only static members (QF, QV, QK, QXK, QS) into [namespaces](namespaces.html). This allows the namespaces to be extended in the QP ports.
|
||||
- Refactored:
|
||||
+ QF::publish_() -> QActive::publish_()
|
||||
+ QF::psInit() -> QActive::psInit()
|
||||
+ QF::tickX_() -> QTimeEvt::tick_()
|
||||
|
||||
@note
|
||||
The old APIs (QF::PUBLISH(), QF::TICK_X(), QF::psInit()) are still provided, but are tagged as [deprecated](deprecated.html).
|
||||
|
||||
- Moved package-scope header files qf_pkg.hpp and qs_pkg.hpp from the `qpcpp/src` directory to `qpcpp/include`. This allows the build process to specify only the `qpcpp/include` directory to build applications and QP/C++ source code. Previously, the build process had to specify additionally `qpcpp/src`, but this is no longer needed.
|
||||
|
||||
@note
|
||||
This change allowed all provided examples to be simplified by removing the `qpcpp/src` include directory from the various project files.
|
||||
|
||||
Adapted QP/C++ source code to avoid warnings from the new C++20 standard about: "compound assignment with 'volatile'-qualified left operand is deprecated".
|
||||
|
||||
__Ports/Examples:__
|
||||
- Removed port and examples for the older ARM7/ARM9
|
||||
- Added port to the @ref zephyr "Zephyr RTOS"
|
||||
- Added examples for the @ref exa_zephyr "Zephyr RTOS"
|
||||
- redesigned QP/C++ @ref freertos "port to FreeRTOS", see `qpcpp/ports/freertos`
|
||||
- slightly improved QP/C++ @ref threadx "port to ThreadX", see `qpcpp/ports/threadx`
|
||||
|
||||
__Improved Documentation:__
|
||||
The Doxygen documentation has been re-structured and improved. Also the more attractive styling of the HTML has been applied.
|
||||
|
||||
|
||||
@section qpcpp_7_0_0 Version 7.0.0, 2022-04-30
|
||||
This major focus of this release is the adaptation of the code and documentation to better support safety certification (see [QP Certification Pack](https://www.state-machine.com/products/qp#CERT))
|
||||
This major focus of this release is the adaptation of the code and documentation to better support safety certification (see [QP Certification Pack](modules.html))
|
||||
|
||||
__Modified QP/C++ source code:__
|
||||
- updated QP/C++ source code for AUTOSAR:C++14
|
||||
- made the compliant with the updated [Quantum Leaps Embedded C/C++ Coding Style (QL-C/C++:2022)](https://github.com/QuantumLeaps/embedded-coding-style)
|
||||
- made the compliant with the updated "Quantum Leaps Embedded C/C++ Coding Style (QL-C/C++:2022)"
|
||||
- added traceability links between QP/C++ source code and requirements, architecture, design, and MISRA deviation permits.
|
||||
- modified the top-level file comments now have standard-compliant license specification (SPDX-License-Identifiers). This allows QP/C++ to be included in automatic generation of Software Bill Of Materials (SBOM).
|
||||
|
||||
@ -89,7 +120,6 @@ __Updated 3rd-Party Components:__
|
||||
- `qpcpp/3rd_party/threadx` to version 6.1.6 (latest open source version from [GitHub](https://github.com/azure-rtos/threadx) )
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_9_2 Version 6.9.2, 2021-01-18
|
||||
The main purpose of this release is a redesign of the QS-RX (software tracing input) to implement the feature request #187:
|
||||
|
||||
@ -288,7 +318,7 @@ __Source code changes:__
|
||||
|
||||
__Updated Ports:__
|
||||
+ enabled #QF_ACTIVE_STOP in the ports: Win32, Win32-QV, Win32-QUTEST, POSIX, POSIX-QV, and POSIX-QUTEST.
|
||||
+ @ref uc-os2 "port to uC/OS-II" has been adapted to the new uC/OS-II v2.93.00 (recently released by Silicon Labs under the open source Apache 2.0 license).
|
||||
+ @ref uc-os2 "port to uC/OS2" has been adapted to the new uC/OS2 v2.93.00 (recently released by Silicon Labs under the open source Apache 2.0 license).
|
||||
|
||||
|
||||
__Updated Examples:__
|
||||
@ -319,7 +349,6 @@ __Bug Fixes:__
|
||||
|
||||
|
||||
@section qpcpp_6_8_1 Version 6.8.1, 2020-04-04
|
||||
|
||||
__Bug Fixes:__
|
||||
|
||||
- [bug#261 QTime::disarm() clears the wrong flag](https://sourceforge.net/p/qpc/bugs/261/)
|
||||
@ -343,9 +372,7 @@ These "safe" functions are mapped to the best approximation of these services av
|
||||
Finally, this release improves the comments in the QF::stop() function. The comments now make it very clear that after calling QF_stop() the application must terminate and cannot continue. In particular, QF::stop() is **not** intended to be followed by a call to QF::init() to "resurrect" the application. The previous comments apparently were confusing and some developers attempted to "restart" a running application, which led to system crashes.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_8_0 Version 6.8.0, 2020-03-21
|
||||
|
||||
This release updates the QP/C++ source code from C++98/03 to the **C++11 Standard**. Specifically, the following C++11 features are now used.
|
||||
|
||||
__Source Code Changes:__
|
||||
@ -410,7 +437,6 @@ __Bugs Fixes:__
|
||||
- [bug#256 Programming error in QP/C++ posix port](https://sourceforge.net/p/qpc/bugs/256/)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_7_0 Version 6.7.0, 2019-12-30
|
||||
The main purpose of this release is providing support for the [<b>PC-Lint-Plus</b>](https://www.gimpel.com/) static analysis tool and improved compliance with MISRA-C++:2008 (see also feature request [#169](https://sourceforge.net/p/qpc/feature-requests/169/)). Specifically, the QP/C++ source code and some examples have been adjusted to comply with MISRA-C++:2008 rules, with all deviations captured in the PC-Lint-Plus configuration files. These PC-Lint-Plus configuration files have been provided in the new "port" to PC-Lint-Plus in the directory qpcpp/ports/lint-plus/.
|
||||
|
||||
@ -429,7 +455,6 @@ __Bugs Fixes:__
|
||||
- [bug#255 "IAR-ARM "Multi-file Compilation" fails for QK and QXK applications"](https://sourceforge.net/p/qpc/bugs/255/)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_6_0 Version 6.6.0, 2019-10-31
|
||||
The main purpose of this release is the change in distribution of the QP/C++ framework, which is now bundled together with the other QP frameworks (QP/C and QP-nano) as well as QM, and the QTools collection into "QP-bundle". This "QP-bundle" provides a single, streamlined and simplified download and installation of all QP frameworks and all the accompanying tools.
|
||||
|
||||
@ -450,7 +475,6 @@ This release brings also the following changes:
|
||||
- fixed [bug#248 Compilation error for the Q_EVT_CTOR configuration with QXK](https://sourceforge.net/p/qpc/bugs/248/)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_5_1 Version 6.5.1, 2019-05-24
|
||||
This release fixes the following bugs in the QP/C++ code supporting [QUTest unit testing](https://www.state-machine.com/qtools/qutest.html):
|
||||
|
||||
@ -462,7 +486,6 @@ Also, this release extends the `Makefiles` in the `qpcpp\examples\qutest` direct
|
||||
Finally, this release adds ports and examples for PIC32 with MPLAB-X/XC32 toolchain.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_5_0 Version 6.5.0, 2019-03-30
|
||||
This release brings new, much more natural and convenient way of @ref sm "implementing state machines" in QP/C++, in which state-handler functions are regular **members** of the state machine class. This means that state-handlers have direct access to all class members via the implicit `this` pointer, **without the need to use the "me->" pointer**.
|
||||
|
||||
@ -483,7 +506,6 @@ Additionally, the examples for `calc1` and `calc1_sub` (with QM 4.5.0 models) ha
|
||||
Finally, this release adds the example `start-stop` located in the directory `qpcpp/examples/freertos/arm-cm/start-stop_nucleo-h743zi/` for the @ref freertos "QP port to FreeRTOS", which demonstrates how to dynamically start and stop active objects multiple times during the lifetime of the application. (NOTE: Starting and stopping active objects dynamically is generally not recommended, but the example has been requested by a commercial customer.)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_4_0 Version 6.4.0, 2019-02-10
|
||||
This release brings the following changes:
|
||||
|
||||
@ -498,7 +520,6 @@ This release brings the following changes:
|
||||
- fixed examples for MSP430 with CCS and added QUTest support for MSP430.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_8 Version 6.3.8, 2018-12-31
|
||||
The main purpose of this release is the update the `Makefiles` that use the [GNU-ARM Embedded Toolchain](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm) to match the recent update in [QTools for Windows 6.3.8](https://sourceforge.net/projects/qpc/files/QTools/). Specifically, all `Makefiles` in the `examples` directory have been updated to use the GNU-ARM toolchain located in `qtools\gnu_arm-none-eabi` and use the tools prefix **arm-none-eabi-**.
|
||||
|
||||
@ -506,7 +527,6 @@ The main purpose of this release is the update the `Makefiles` that use the [GNU
|
||||
The `Makefiles` that use the GNU-ARM included in this release require [QTools for Windows version 6.3.8 or newer](https://sourceforge.net/projects/qpc/files/QTools/) and will **NOT** work with the older QTools collection.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_7 Version 6.3.7, 2018-11-20
|
||||
The main goal of this release is to provide Python test scripts that match the newly re-designed Python support for the [QUTest unit testing harness](https://www.state-machine.com/qtools/qutest.html) (see QTools **6.3.7**). Specifically, the Python tests scripts (*.py files) in the `qpcpp/examples/qutest` directory) have been all upgraded to the new syntax and format. Also, all the makefiles in that directory have been modified to execute Python test scripts by default, and Tcl test scripts only when the argument `SCRIPTS=tcl` is specified.
|
||||
|
||||
@ -518,7 +538,6 @@ The second change in this release is updating the QP ports to Win32 and POSIX to
|
||||
Finally, this release updates the internal implementation of QXK function `QXThread::post_()` for software tracing and testing with QUTest.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_6 Version 6.3.6, 2018-10-20
|
||||
This release brings important changes and improvements to the unit-testing support for [QUTest](https://www.state-machine.com/qtools/qutest.html). Specifically, a new "dummy" active object class QP::QActiveDummy for testing has been added. Instances of this "dummy" AO can be now used as test-doubles for active objects that are recipients of events directly posted by the active object under test (AOUT). This, in turn, eliminates the need to alter the existing event-posting implementation, so that more of the actual QP code can be used in the QP test-stub (qutest.c).
|
||||
|
||||
@ -546,12 +565,10 @@ To facilitate the creation of truly portable, cross-platform examples, the exist
|
||||
Finally, this release fixes a bug in the @ref posix-qv "POSIX-QV port", where the internal condition variable `QV_condVar_` has not been initialized.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_4 Version 6.3.4, 2018-08-10
|
||||
This release adds new API QP::QTimeEvt::wasDisarmed() for checking the status of a QP::QTimeEvt object after it has been disarmed. Specifically, the status of the last call to QP::QTimeEvt::disarm() is kept inside the time event object and can be subsequently checked with the QP::QTimeEvt::wasDisarmed() API. This new function is designed to be used directly as a guard condition on the timeout event, as described in the [PSiCC2 book](/psicc2), Section 7.7.3 "Arming and Disarming a Time Event" on page 359. The QP::QTimeEvt::wasDisarmed() has a side effect of setting the "was disabled" status, so the guard evaluates to 'true' the next time it is checked.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_3a Version 6.3.3a, 2018-07-16
|
||||
This release adds Python test scripts to the QUTest examples (folder `qpcpp/examples/qutest`). Specifically, the makefiles have been augmented to accept symbol `SCRIPT=py`, in which case the Python test scripts (`*.py`) are used instead of the default Tcl test scripts (`*.tcl`).
|
||||
|
||||
@ -559,7 +576,6 @@ This release adds Python test scripts to the QUTest examples (folder `qpcpp/exam
|
||||
This release does not change any QP/C++ APIs, QP/C++ implementation, ports, or other examples.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_3 Version 6.3.3, 2018-06-22
|
||||
This release fixes the following bugs:
|
||||
|
||||
@ -572,7 +588,6 @@ Also, this release demonstrates the new features of QM 4.3.0 in several example
|
||||
Finally, this release updates `3rd_party/CMSIS/Include` to the latest version from GitHub.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_2 Version 6.3.2, 2018-06-20
|
||||
This release fixes the following bugs:
|
||||
|
||||
@ -584,7 +599,6 @@ Also, this release improves the QUTest DPP example (directory `qpcpp/examples/qu
|
||||
Finally, this release modifies the QP/C++ ports to POSIX and POSIX-QV by allowing to configure the p-thread priority of the ticker thread. This is achieved by adding a `tickPrio` parameter to the `QF_setTickRate()` function. (**NOTE** this modification will require changing existing QP applications for POSIX or POSIX-QV that call `QF_setTickRate()`.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_1 Version 6.3.1, 2018-05-24
|
||||
This release migrates the [QUTest](https://www.state-machine.com/qtools/qutest.html) examples to [QM 4.2.1](https://www.state-machine.com/qm/history.html#qm_4_2_1), which now can generate QS_FUN_DICTIONARY() records automatically. This release also adds a generic, simple blinky example for QUTest located in `examples/qutest/blinky`. Also, this release fixes the QF_INT_DISABLE() / QF_INT_ENABLE() macros in the QUTest ports to use the QP namespace. Without this fix, the code fails to compile when the directive "using namespace QP" is not used.
|
||||
|
||||
@ -593,7 +607,6 @@ Also, this release adds the missing QS macro QS_SIG() to produce symbolic signal
|
||||
Finally, this release adjusts the code in qs_rx.cpp to use QF_EVT_REF_CTR_INC_() instead of accessing the event's reference counter directly. This direct access fails in case, when event constructors are configured (Q_EVT_CTOR is defined). In that case, the QP::QEvt class protects the reference counter, so it cannot be accessed directly. This option is currently used only in the QP/C++ port to Qt.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_3_0 Version 6.3.0, 2018-05-10
|
||||
The main purpose of this release is fixing the sub-machine support in the QP/Spy build configuration. Specifically, this release fixes the following bug:
|
||||
|
||||
@ -605,7 +618,6 @@ This release matches [QM 4.2.0](https://www.state-machine.com/qm/history.html#qm
|
||||
Additionally, the release contains some re-factoring of the QS-RX input channel.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_2_2 Version 6.2.0, 2018-03-16
|
||||
The main purpose of this release is extednding the functionality of the [QUTest unit testing](https://www.state-machine.com/qtools/qutest.html) for QP/C++ applications. Specifically, this release adds support for testing of **self-posting** of events in active objects, which is an essential element in the [Reminder](https://www.state-machine.com/doc/Pattern_Reminder.pdf) and [Deferred Event](https://www.state-machine.com/doc/Pattern_DeferredEvent.pdf) design patterns. To implement this new feature, the QS-RX (QS receive channel) has been extened by a small scheduler that processes all secondary events gnenerated by dispatching, posting, or publishing events (only active when the #Q_UTEST macro is defined). Also, the implementation of the target resident QUTest components (file `src/qs/qutest.cpp` and `src/qf/qf_actq.cpp`) have been modified to allow posting of events during unit testing.
|
||||
|
||||
@ -626,7 +638,6 @@ Additionally, this release updates the QP/C++ ports to win32-qv and posix-qv to
|
||||
Finally, this release phases out the `qp_port.h` header file. If any of your projects still includes this file, please replace it with the qpc.h heder file.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_1_1 Version 6.1.1, 2018-02-18
|
||||
The main purpose of this release is adding the context-switch callbacks to the preemptive @ref qk "QK" and @ref qxk "QXK" kernels. The QK_onContextSw() and QXK_onContextSw() callback functions provide a mechanism to perform additional custom operations when QK/QXK switches context from one thread to another. To avoid extra overhead when this functionality is not needed and for backwards-compatiblity with the existing applications, the callbacks are enabled only when the macros #QK_ON_CONTEXT_SW (for QK) and #QXK_ON_CONTEXT_SW (for QXK) are defined. These macros can be defined either directly in command-line for the compiler, or in the QK/QXK port files (qk_port.c for QK and qxk_port.c for QXK). Examples for the context-switch callbacks have been provided for for the @ref arm-cm_dpp_nucleo-l053r8 "NUCLEO-L053R8" (Cortex-M0+) and the @ref arm-cm_dpp_nucleo-h743zi "NUCLEO-H743ZI" (Cortex-M7).
|
||||
|
||||
@ -641,7 +652,6 @@ Finally, this release fixes the following bug:
|
||||
- [bug#203 QXK: precondition in QXSemaphore::wait() incorrectly handles the scheduler lock"](https://sourceforge.net/p/qpc/bugs/203/)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_1_0 Version 6.1.0, 2018-02-04
|
||||
The main purpose of this release is adding the support for the [<strong>ARM Compiler 6 (ARM-Clang)</strong>](https://developer.arm.com/products/software-development-tools/compilers/arm-compiler), which is a C/C++ toolchain for ARM processors based on the modern [Clang frontend](https://clang.llvm.org/) and the [LLVM framework](https://llvm.org/). This release adds the ARM-Clang ports and examples for all built-in kernels (QV, QK, and QXK) for the ARM Cortex-M CPU cores.
|
||||
|
||||
@ -656,7 +666,6 @@ Also, this release updates the existing projects for the Code Composer Studio (C
|
||||
Also, all examples for MSP430 with CCS have been updated to CCSv7 and re-tested on the supported boards.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_0_4 Version 6.0.4, 2018-01-10
|
||||
The main purpose of this release is the provision of the official @ref freertos "QP/C++ port to FreeRTOS" (version 10). The QP/C++ port to FreeRTOS is completely generic and should work on any CPU supported by FreeRTOS. The port comes with the following examples (see examples/freertos/):
|
||||
- @ref freertos_dpp_ek-tm4c123gxl "DPP on EK-TM4C123GXL (ARM Cortex-M4F)" with ARM-KEIL, GNU-ARM and IAR-ARM toolchains.
|
||||
@ -675,9 +684,7 @@ Finally, this release fixes the following bug in the @ref threadx "ThreadX port"
|
||||
- [bug#197 "Problems with scheduler locking in QP/C/C++ ports to ThreadX"](https://sourceforge.net/p/qpc/bugs/197/)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_0_3 Version 6.0.3, 2017-12-12
|
||||
|
||||
Changes since version 6.0.1:
|
||||
|
||||
- fixed [bug#193 "QXK: context switch from extended to basic thread fails"](https://sourceforge.net/p/qpc/bugs/193/)
|
||||
@ -698,7 +705,6 @@ Changes since version 6.0.1:
|
||||
This release does not change any of the QP/C++ APIs.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_0_1 Version 6.0.1, 2017-12-10
|
||||
The main focus of this release is to fix the remaining problems with transitions out of eXit-Points in sub-machines. Specifically, this release modifies the QMsm-based state machine implementation strategy (file src/qf/qep_msm.cpp to properly handle transitions from eXit-Points to Entry-Points and to History connectors in sub-machines. These changes are part of fixing the following bugs reported for QM:
|
||||
|
||||
@ -719,7 +725,6 @@ This QP/C++ 6.0.1 release is the minium version required in the upcoming QM 4.1.
|
||||
Additionally, this release changes the QXK implementation still related to the [bug#186 "QXK: Extended thread context switch causes assertion in PendSV_Handler"](https://sourceforge.net/p/qpc/bugs/186/). Specifically, the case of context switching away and back to the same thread (which can arise under specific interrupt preemption scenarios) is now handled as a simple return from PendSV. The QXK scheduler has been modified to set the "next" thread pointer to NULL when it detects switching back to the "current" thread.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_6_0_0 Version 6.0.0, 2017-10-13
|
||||
This release fixes two bugs found in the QXK kernel:
|
||||
- [bug#185](https://sourceforge.net/p/qpc/bugs/185/) "QXK: PendSV_Handler uses inconsistent stack frames for saving and restoring AO for Cortex-M0(+)"
|
||||
@ -731,7 +736,6 @@ Additionally, this release includes a workaround for a [bug indetified in the GN
|
||||
This release no longer contains the directory `qpcpp/source`, which was scheduled to be phased out in QP5. In QP6 the source code is found only in the `qpcpp/src` directory.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_9 Version 5.9.9, 2017-09-29
|
||||
This release implements the feature request [#132 "Extend the QXK mutex to support also simple operation without the priority-ceiling protocol"](https://sourceforge.net/p/qpc/feature-requests/132/).
|
||||
|
||||
@ -746,7 +750,6 @@ Specifically, the QP::QXMutex class has been extended as follows:
|
||||
- when initialized with `ceiling>0`, QP::QXMutex WILL use the priority-ceiling protocol, as before. It will require that the ceiling priority be unique and not used by any other thread or mutex. In other words, the previous functionality remains unchanged.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_8 Version 5.9.8, 2017-09-15
|
||||
This release fixes the QXK kernel [bug#182 " Inconsistent QXThread::post_() behavior with respect to the 'margin' parameter"](https://sourceforge.net/p/qpc/bugs/182/).
|
||||
|
||||
@ -770,7 +773,6 @@ Provided C++ example with RTTI and Exception hanlding in the directory:
|
||||
`examples/arm-cm/dpp_efm32-slstk3401a/qxk/gnu_with-rtti`
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_7 Version 5.9.7, 2017-08-18
|
||||
The main focus of this release are new requested features for the @ref qxk "dual-mode QXK kernel":
|
||||
- <a href="https://sourceforge.net/p/qpc/feature-requests/129" class="extern">feature#129 "Allow blocking while holding a mutex in QXK"</a>; and
|
||||
@ -798,7 +800,6 @@ This release also updates CMSIS to version 5.1.0 (3rd_party/CMSIS).
|
||||
This release also adds the @ref api "API Reference" section to the QP/C++ documentation.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_6 Version 5.9.6, 2017-08-04
|
||||
The main focus of this release are improvements to the "dual-mode" QXK kernel. Specifically, this release implements the <a href="https://sourceforge.net/p/qpc/feature-requests/128/" class="extern">featrue request #128 "QP Semaphore Max Value Setting"</a> for QXK. This feature changes the QXK function QP::QXSemaphore::init(), which now takes additional parameter `count`. This parameter specifies the maximum allowed count for the semaphore (e.g., count of 1 makes the semaphore a binary-semaphore).
|
||||
|
||||
@ -814,7 +815,6 @@ Also, this release adds protection in the IRQ priorities initialization in QK/QV
|
||||
Finally, this release consistently changes all example projects (for all toolchains) to use the **src** directory for QP/C++ source code, instead of the **source** directory. The source/ directory is now truly obsolete, but is still provided in this release for backwards compatibility with user projects.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_5 Version 5.9.5, 2017-07-20
|
||||
This release fixes the following bugs:
|
||||
- <a href="https://sourceforge.net/p/qpc/bugs/178/" class="extern">bug#178</a> "GNU-ARM compiler reports "Error: unaligned opcodes..." in startup code for QP/C/C++/nano examples". The bug fix entails modifying the startup code for the GNU-ARM compiler in the `3rd_party` directory. Specifically, the proper alignment directives have been added to the inline assembly in the exception handlers.
|
||||
@ -831,13 +831,11 @@ so that the Q_DEFINE_THIS_FILE() macro is used consistently *outside*
|
||||
a namespace at the top of the file scope.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_4 Version 5.9.4, 2017-07-07
|
||||
This release adds Thread-Local Storage (TLS) feature for the dual-mode
|
||||
QXK kernel (see @ref qxk_tls).
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_3 Version 5.9.3, 2017-06-19
|
||||
This release implements the feature request
|
||||
<a href="https://sourceforge.net/p/qpc/feature-requests/126/" target="_blank" class="extern">#126</a> "Allow non-asserting
|
||||
@ -846,7 +844,6 @@ Q_NEW_X() or QP::QActive::post_() with the @p margin argument of zero will no
|
||||
longer assert if the allocation/posting fails.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_2 Version 5.9.2, 2017-06-05
|
||||
This release adapts the Makefiles for GNU-ARM to the new location of the
|
||||
GNU-ARM toolset, which is now included in the QTools Collection (v 5.9.1)
|
||||
@ -874,7 +871,6 @@ QXK kernels and ARM-Keil, GNU-ARM, and IAR-ARM toolsets. The demos support
|
||||
bi-directional QP/Spy.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_1 Version 5.9.1, 2017-05-26
|
||||
This release fixes the following bug:
|
||||
- <a href="https://sourceforge.net/p/qpc/bugs/169/" target="_blank" class="extern">bug#169 "Submachine-state eXit Point does not work correctly"</a>
|
||||
@ -910,7 +906,6 @@ phased out in the future QP/C++ releases. Please use the new source code
|
||||
structure provided in the `qpcpp/src` directory.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_9_0 Version 5.9.0, 2017-05-19
|
||||
The main purpose of this milestone QP/C++ release is to provide support for the powerful **Unit Testing Framework** called
|
||||
<a href="https://www.state-machine.com/qtools/qutest.html" target="_blank" class="extern"><strong>QUTest™</strong> (pronounced *cutest*)</a>.
|
||||
@ -953,7 +948,6 @@ Finally, this release fixes the following bugs:
|
||||
- bug#162 "QF critical sections require modification for M7 core"
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_8_2 Version 5.8.2, 2017-02-08
|
||||
This release adds examples for the ARM Cortex-<strong>M7</strong> CPU. Specifically,
|
||||
the release contains the standard @ref dpp "Dining Philosophers Problem (DPP)"
|
||||
@ -979,7 +973,6 @@ Finally, this release fixes the following bugs:
|
||||
- bug#154 qspy.c parses history transitions incorrectly
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_8_1 Version 5.8.1, 2016-12-16
|
||||
This release is in response to a recent finding that many QP users of the
|
||||
ports to ARM Cortex-M3/M4 forget to explicitly set their interrupt priorities,
|
||||
@ -1019,7 +1012,6 @@ Changes in detail:
|
||||
standard distribution.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_8_0 Version 5.8.0, 2016-11-30
|
||||
The main purpose of this milestone QP/C++ release is to finally provide
|
||||
the baseline framework fully compatible with the upcoming QM 4.0.0.
|
||||
@ -1067,7 +1059,6 @@ Finally, the complete list of bugs fixed in this release is as follows:
|
||||
- <a href="https://sourceforge.net/p/qpc/bugs/124/">bug#124</a> "Windows port now cause memory leakage"
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_7_4 Version 5.7.4, 2016-11-04
|
||||
This release fixes the following bugs:
|
||||
- bug#145 QP::QF::publish_() leaks events that have no subscribers
|
||||
@ -1075,7 +1066,6 @@ This release fixes the following bugs:
|
||||
- bug#143 QP::QMActive::postLIFO on initial transition asserts on QXK
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_7_3 Version 5.7.3, 2016-10-07
|
||||
This release adds QP ports to the TI-RTOS kernel (SYS/BIOS) with TI-CCS
|
||||
and IAR EWARM toolsets. Examples are provided for the EK-TM4C123GXL
|
||||
@ -1092,7 +1082,6 @@ Also, this release fixes the following bugs:
|
||||
returning to task).
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_7_2 Version 5.7.2, 2016-09-30
|
||||
This is the first production release of the "dual-mode" QXK kernel.
|
||||
"Dual-mode" QXK means that QXK supports both basic-threads (BC1 class
|
||||
@ -1121,7 +1110,6 @@ Finally, this release improves the implementation of scheduler locking
|
||||
in publish-subscribe event delivery.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_7_0 Version 5.7.0, 2016-08-31
|
||||
This release adds support for sub-machines and sub-machine states for reusing pieces of state machines (an advanced UML concept) to the QMsm-state machine implementation strategy. This feature is to match the upcoming QM 4.0.0.
|
||||
|
||||
@ -1142,7 +1130,6 @@ Changes in detail:
|
||||
5. Modified the ARM Cortex-M QXK ports (ARM-KEIL, GNU, IAR, and TI)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_6_5 Version 5.6.5, 2016-06-06
|
||||
This release adds support for the new board: EFM32-SLSTK3401A (Pearl Gecko Starter Kit from Silicon Labs). This board replaces the Stellaris EK-LM3S811 board, which has been discontinued. (The Stellaris EK-LM3S811 board had been used in the "Fly 'n' Shoot" game example accompanying the PSiCC2 book).
|
||||
|
||||
@ -1159,17 +1146,14 @@ This release fixes the following bugs:
|
||||
- bug#131 (QP::QF::newRef_() increments reference counter without QF_CRIT_ENTRY_()).
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_6_4 Version 5.6.4, 2016-04-25
|
||||
This release fixes a serious Bug #128 (https://sourceforge.net/p/qpc/bugs/128 ) in the QK port to ARM Cortex-M introduced back in QP 5.6.1
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_6_3 Version 5.6.3, 2016-04-12
|
||||
This release fixes a serious Bug #127 (https://sourceforge.net/p/qpc/bugs/127 ) in the QK preemptive scheduler introduced in QP 5.6.2.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_6_2 Version 5.6.2, 2016-03-31
|
||||
The main purpose of this release is to introduce _atomic event multicasting_, meaning that event publishing to all subscribers is now protected from preemption. This eliminates potential for re-ordering of events under preemptive kernels (such as QK, QXK, or 3rd-party RTOSes), when events are published from low-priority AOs and some higher-priority subscribers can preempt multicasting and post/publish events of their own (before the original event is posted to all subscribers).
|
||||
|
||||
@ -1216,9 +1200,7 @@ Changes in detail:
|
||||
16. Implemented Feature Request #110 as well as the duplicate Request #62 by adding function QMActive::flushDeferred()
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_6_1 Version 5.6.1, 2016-01-01
|
||||
|
||||
This release is the first official (production) release of the new blocking @ref qxk "QXK kernel" ("eXtended Quantum Kernel"). QXK is a small, preemptive, priority-based, **blocking** kernel that provides most features you might expect of a traditional blocking RTOS kernel.
|
||||
|
||||
QXK has been designed specifically for applications that need to mix event-driven active objects with traditional blocking code, such as commercial middleware (TCP/IP stacks, UDP stacks, embedded file systems, etc.) or legacy software. The QXK kernel is integrated tightly and optimally with the rest of the QP. It reuses all mechanisms already provided in QP, thus avoiding any code duplication, inefficient layers of indirection, and additional licensing costs, which are inevitable when using 3rd-party RTOS kernels to run QP/C++ applications.
|
||||
@ -1263,15 +1245,11 @@ Changes in detail:
|
||||
14. Corrected example projects for the ARM Cortex-M with TI/CCS toolset
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_5_1 Version 5.5.1, 2015-10-05
|
||||
|
||||
The purpose of this release is to improve the AAPCS compliance of the ARM Cortex-M port to the QK preemptive kernel. Specifically, the PendSV handler in assembly did not always maintain the 8-byte stack alignment, which is required by AAPCS. This version corrects the stack misalignment in the qk_port.s files for all supported ARM compilers (ARM-Keil, GNU, and IAR). All these ports should also be ready for ARM Cortex-M7.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_5_0 Version 5.5.0, 2015-09-28
|
||||
|
||||
The main purpose of this release is the extension of the QS software
|
||||
tracing system to bi-directional communication with embedded Targets.
|
||||
Specifically, the QS-RX (receive channel for QS) has been added with the
|
||||
@ -1363,9 +1341,7 @@ active_[] array"
|
||||
11. Fixed bug #115 "QMsm::isInState() implementation missing"
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_4_2 Version 5.4.2, 2015-06-06
|
||||
|
||||
The main focus of this release is to improve the support for "dual targeting" of QP/C++ applications, which is developing of deeply embedded code as much as possible on the desktop OS, such as Windows. Experience shows that "dual targeting" dramatically improves productivity of embedded systems developers, perhaps more than any other technique.
|
||||
|
||||
This release makes it possible to use exactly the **same** application code, main function, and the Board Support Package interface (bsp.h) on both deeply embedded target and on Windows. The only differences between these targets can be completely encapsulated in the Board Support Package implementation (bsp.cpp).
|
||||
@ -1393,9 +1369,7 @@ Changes in detail:
|
||||
9. Improved the PC-Lint support for checking the application-level code located in in `examples/arm-cm/dpp_ek-tm4c123gxl/lint`
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_4_1 Version 5.4.1, 2015-05-21
|
||||
|
||||
This release changes the active object class hierarchy so that QP::QMActive is now more fundamental and is the base class for QP::QActive. (Previously QP::QMActive was a subclass of QP::QActive). The newly added documentation section about @ref classes "QP/C++ Design" shows the current class hierarchy.
|
||||
|
||||
@note
|
||||
@ -1414,10 +1388,7 @@ Also, this release brings several cosmetic improvements:
|
||||
5. Several README files have been updated.
|
||||
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_4_0 Version 5.4.0, 2015-05-14
|
||||
|
||||
This release changes the basic philosophy of distributing the QP frameworks by **combining** the "QP/C++ Baseline Code" with all currently available "QP/C++ Development Kits" (QDK/C++). This is done to eliminate any potential mistakes in downloading and installing separate pieces of code.
|
||||
|
||||
Additionally, this release changes the basic philosophy of building your embedded applications with the QP/C++ framework. Starting with this release, all @ref exa "examples" for embedded boards include the QP/C++ framework as **source code** within the projects, instead of statically linking with a QP/C++ library. (**NOTE:** It is still possible to use QP/C++ as a library, but you need to build such libraries yourself, as they are no longer provided in the QP/C++ distribution.)
|
||||
@ -1479,10 +1450,8 @@ Changes in detail:
|
||||
16. Updated the @ref lwip_ek-lm3s6965 "lwIP-QP example for EK-LM3S6965 board".
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_3_1 Version 5.3.1, 2014-09-20
|
||||
|
||||
/note QP/C++ 5.3.1 remains backwards-compatible with all QP/C++ ports
|
||||
@note QP/C++ 5.3.1 remains backwards-compatible with all QP/C++ ports
|
||||
and applications
|
||||
|
||||
This release fixes the following bugs:
|
||||
@ -1503,9 +1472,7 @@ Additionally, this release improves the uC/OS-II port in that it is now generic
|
||||
Finally, this release improves the "QP/C++ Reference Manual" generated by Doxygen and available both inside the QP/C++ baseline distribution (qpcpp.chm file) and online at: https://www.state-machine.com/qpcpp
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_3_0 Version 5.3.0, 2014-04-14
|
||||
|
||||
This release adds the "transition to history" (deep history) feature to
|
||||
both QHsm and QMsm state machines and their subclasses. This QP/C++
|
||||
release matches the new QM modeling tool version 3.1.0, which now
|
||||
@ -1601,9 +1568,7 @@ its subclasses like QMActive) "is in" the given state.
|
||||
qmsm_in.cpp in the QP/C++ library builds.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_2_1 Version 5.2.1, 2014-01-06
|
||||
|
||||
This release fixes two bugs.
|
||||
|
||||
1. In file qmsm_dis.cpp added saving of the action-table into a
|
||||
@ -1618,9 +1583,7 @@ build configurations: Debug, Release, and Spy.
|
||||
trace buffer.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_2_0 Version 5.2.0, 2013-12-28
|
||||
|
||||
This release matches the new QM 3.0.0, for which it provides model
|
||||
examples based on the new QMsm/QMActive classes. This, in turn
|
||||
demonstrates the new state machine code generation that QM3 was
|
||||
@ -1697,9 +1660,7 @@ in the Embedded.com article "Are We Shooting Ourselves in the Foot with
|
||||
Stack Overflow?".
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_1_1 Version 5.1.1, 2013-10-10
|
||||
|
||||
This release fixes reversal of logic in the QF::noTimeEvtsActiveX()
|
||||
function as well as sleep mode transition in the ARM Cortex-M3/M4 ports
|
||||
to the cooperative Vanilla kernel. Also, the native QP event queue
|
||||
@ -1737,9 +1698,7 @@ examples can be run and modified directly on Windows, without going back
|
||||
to DOS.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_5_1_0 Version 5.1.0, 2013-10-02
|
||||
|
||||
/note QP/C++ 5.1.0 remains <b>backwards-compatible</b> with the existing
|
||||
QP/C 4.x applications, except the <b>ARM Cortex-M applications</b> need to
|
||||
adjust the interrupt priorities. Specifically, you need to set the
|
||||
@ -1930,9 +1889,7 @@ services and they can communicate with QP only by triggering a
|
||||
"kernel-aware" interrupt (which can post or publish events).
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_5_04 Version 4.5.04, 2013-02-10
|
||||
|
||||
The main purpose of this release is adding support for the ARM Cortex-M4F
|
||||
processors with the hardware Floating-Point Unit (FPU). The QP/C ports
|
||||
to Cortex-M4F take full advantage of the "lazy stacking" feature of the
|
||||
@ -1970,9 +1927,7 @@ moved them to the separate QDK/C++-Qt.
|
||||
and all existing QDKs for QP/C++ 4.5.xx.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_5_03 Version 4.5.03, 2012-11-29
|
||||
|
||||
This release changes the directory structure of QP ports to various
|
||||
operating systems, such as POSIX (Linux, BSD, etc.), Win32 (Windows),
|
||||
Qt, etc. The OS ports are moved from the ports/80x86/ directory one
|
||||
@ -2020,7 +1975,7 @@ NOTE: The event constructor feature is NOT backward-compatible
|
||||
with the existing applications.
|
||||
|
||||
At the same time, the QEvt class in this release provides the virtual
|
||||
destructor only when the new macro Q_EVT_VIRTUAL is defined. This
|
||||
destructor only when the new macro Q_EVT_XTOR is defined. This
|
||||
separation of QEvt constructor from virtual destructor makes the
|
||||
constructor more attractive, because it saves the virtual pointer
|
||||
in every event, if no virtual functions are used in QEvt subclasses
|
||||
@ -2050,7 +2005,7 @@ into a single port to POSIX and placed it in the directory posix/.
|
||||
5. Added event constructor to qevt.h (controlled by the configuration
|
||||
macro Q_EVT_CTOR).
|
||||
|
||||
6. Added the conditional compilation with the macro Q_EVT_VIRTUAL
|
||||
6. Added the conditional compilation with the macro Q_EVT_XTOR
|
||||
around the virtual destructor in the QEvt class.
|
||||
|
||||
7. Added macro QF_MPOOL_EL to qmpool.h. Modified all examples to
|
||||
@ -2087,9 +2042,7 @@ names for user-defined trace records
|
||||
when the target resets. This allows QSPY to reset its internal state.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_5_01 Version 4.5.01, 2012-06-14
|
||||
|
||||
The main purpose of this minor release is providing improved
|
||||
MISRA-compliant state machine implementation. Specifically, a new
|
||||
macro Q_UNHANDLED() has been added for a situation when a guard
|
||||
@ -2137,9 +2090,7 @@ slot function, but instead to allow defining this slot function in
|
||||
the BSP of the application.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_5_00 Version 4.5.00, 2012-05-26
|
||||
|
||||
The main pupose of this relase is to improve host-based development of QP
|
||||
applications, which is critical for Test-Driven Development (TDD). Among
|
||||
others, this release provides integration between QP and the popular
|
||||
@ -2216,9 +2167,7 @@ applications (DPP and PELICAN crossing).
|
||||
P-threads, including QP ports and examples for Linux and Mac OS X.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_4_00 Version 4.4.00, 2012-05-02
|
||||
|
||||
The main pupose of this relase is MISRA-C++:2008 compliance, strong-type
|
||||
checking compliance, update of PC-Lint option files and tests, and
|
||||
general cleanup.
|
||||
@ -2286,9 +2235,7 @@ qpcpp/doc/, with the following Application notes:
|
||||
"QP and ARM Cortex-M, and QP and Windows",
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_3_00 Version 4.3.00, 2011-11-03
|
||||
|
||||
1. This release changes the names of critical section macros and
|
||||
introduces macros for unconditional interrupt disabling/enabling.
|
||||
This is done to simplify and speed up the built-in Vanilla and QK
|
||||
@ -2319,9 +2266,7 @@ latest IAR EWARM version 6.30.
|
||||
latest Sourcery CodeBench 2011.07-60.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_2_04 Version 4.2.04, 2011-09-24
|
||||
|
||||
The main pupose of this relase is to provide a bug fix for the QK port
|
||||
to ARM Cortex processors. The bug fix addresses a very rare and
|
||||
undocumented behavior of late-arrival of an interrupt while entering
|
||||
@ -2336,9 +2281,7 @@ implemented in the qk_port.s file and consists of clearing the
|
||||
PENDSVSET bit programmatically inside PendSV_Handler.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_2_02 Version 4.2.02, 2011-09-08
|
||||
|
||||
1. The main pupose of this relase is to repackage the default QP/C++
|
||||
distribution to contain the single root directory qpcpp/ in the
|
||||
archive. That way, unziping the archive will produce only one
|
||||
@ -2351,9 +2294,7 @@ distinguish libraries generated by different GNU-toolchains (such
|
||||
as CodeRed, Attolic, DevKit ARM, etc.)
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_2_01 Version 4.2.01, 2011-08-13
|
||||
|
||||
1. Modified file qassert.h to add assertion macros #Q_ASSERT_ID,
|
||||
#Q_REQUIRE_ID, #Q_ENSURE_ID, #Q_INVARIANT_ID, and #Q_ERROR_ID,
|
||||
which are better suited for unit testig, because they avoid the
|
||||
@ -2362,9 +2303,7 @@ volatility of line numbers for indentifying assertions.
|
||||
2. Added QP port and examples for Mac OS X on 80x86.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_2_00 Version 4.2.00, 2011-07-15
|
||||
|
||||
The goal of this milestone release is to extend the number of event
|
||||
pools (theoretically up to 255 pools) instead of just three event
|
||||
pools available up til now. This release adds an option to use
|
||||
@ -2450,9 +2389,7 @@ framework.
|
||||
latest IAR EWARM 6.20.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_07 Version 4.1.07, 2011-02-28
|
||||
|
||||
The goal of this release is to improve the ease of experimenting with
|
||||
QP/C++ on the desktop. This release adds support for Windows (Win32) to
|
||||
the baseline code. Two most popular compilers for Windows are supported:
|
||||
@ -2490,11 +2427,9 @@ on 64-bit targets (such as 64-bit Linux).
|
||||
latest Sourcery G++ 2011.02-2.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_06 Version 4.1.06, 2011-01-07
|
||||
|
||||
1. Fixed a bug in the software tracing instrumentation in the function
|
||||
QF::remove_(), file qf_act.cpp.
|
||||
QF::unregister_(), file qf_act.cpp.
|
||||
|
||||
2. Made cosmetic improvements to the example QM models of the
|
||||
"Fly 'n' Shoot" game.
|
||||
@ -2509,9 +2444,7 @@ IAR EWARM version 6.10.
|
||||
latest Sourcery G++ 2010.09-66.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_05 Version 4.1.05, 2010-11-01
|
||||
|
||||
This release is adds examples for the QM (QP Modeler) graphical modeling
|
||||
and code generation tool. The examples are based on the "Fly 'n' Shoot"
|
||||
game described in the QP/C++ Tutorial and in Chapter 1 of the PSiCC2 book.
|
||||
@ -2533,9 +2466,7 @@ Additionally, the QP/C++ baseline code has been slighlty modified for
|
||||
better conformance to the MISRA C++ 2008 rules and the latest PC-Lint 9.x.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_04 Version 4.1.04, 2010-05-16
|
||||
|
||||
This release is adds compatibility of all examples for DOS with the DOSBox
|
||||
emulator (http://www.dosbox.com/) that recreates a MS-DOS compatible
|
||||
environment on all versions of Windows, including 64-bit Windows that don't
|
||||
@ -2552,9 +2483,7 @@ improvement extends the CMSIS from Sandstorm to Fury, DustDevil, and Tempest
|
||||
Stellaris families.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_03 Version 4.1.03, 2010-01-21
|
||||
|
||||
This release is concerned with the ARM Cortex ports and examples.
|
||||
Specifically, this release contains the following improvements:
|
||||
|
||||
@ -2581,9 +2510,7 @@ any way, so the release has NO IMPACT on the QP/C applications except for the
|
||||
ARM Cortex ports and applications.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_02 Version 4.1.02, 2010-01-14
|
||||
|
||||
The purpose of this minor maintenance release is the change in the directory
|
||||
structure for the ARM Cortex ports and examples. As new ARM Cortex cores are
|
||||
becoming available, the old port name "cortex-m3" could be misleading, because
|
||||
@ -2596,9 +2523,7 @@ release has NO IMPACT on the QP/C++ applications except for the ARM Cortex
|
||||
ports.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_01 Version 4.1.01, 2009-11-05
|
||||
|
||||
The main purpose of this release is to replace the Turbo C++ 1.01 toolset
|
||||
with the Open Watcom C/C++ toolset, because Turbo C++ 1.01 is no longer
|
||||
available for a free download. In contrast, Open Watcom is distributed under
|
||||
@ -2617,9 +2542,7 @@ state machine classes with QP 4.x. The SLS example located in
|
||||
new State-Local Storage state design pattern.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_1_00 Version 4.1.00, 2009-10-09
|
||||
|
||||
The release provides brings a number of improvements to QP/C++ and updates
|
||||
the QP/C++ ARM Cortex-M3 examples for the EK-LM3S811 board to the latest
|
||||
IAR EWARM 5.40. Due to the acquisition of Liminary Micro by Texas Instruments
|
||||
@ -2667,9 +2590,7 @@ scheduler and two contex-switches if the ready-set is empty.
|
||||
- in the game example moved setting up the QS filters from main.cpp to bsp.cpp.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_0_04 Version 4.0.04 (Product) Apr 09, 2009
|
||||
|
||||
The maintenance release introduces the virtual destructor in the QHsm and
|
||||
QFsm base classes. This is done to allow proper handling of virtual functions
|
||||
in the subclasses of QHsm or QFsm. Please note, however, that the change
|
||||
@ -2692,9 +2613,7 @@ The main changes in QP v4.0.04 with respect to earlier version are as follows:
|
||||
a negative array dimension when the asserted condition is not TRUE.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_0_03 Version 4.0.03, 2008-12-27
|
||||
|
||||
The main purpose of this release is to fix a bug in the QK preemptive kernel,
|
||||
which occurs only when the advanced QK features are used. Specifically, the QK
|
||||
priority-ceiling mutex could interfere with QK thread-local storage (TLS) or
|
||||
@ -2728,9 +2647,7 @@ when the macro QK_NO_MUTEX is not defined.
|
||||
when the macro QK_NO_MUTEX is not defined.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_0_02 Version 4.0.02, 2008-11-15
|
||||
|
||||
This maintenance release does not change the QP/C API in any way, so the
|
||||
release has NO IMPACT on the QP/C++ applications.
|
||||
|
||||
@ -2743,9 +2660,7 @@ in tunnel.cpp file ("Fly 'n' Shoot" game). The constant event HIT_WALL was not
|
||||
declared static.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_0_01 Version 4.0.01, 2008-06-09
|
||||
|
||||
This maintenace release is made to allow using QS software tracing with
|
||||
the GNU compiler for AVR (WinAVR). Specifically, the output of the strings
|
||||
residing in ROM has been fixed.
|
||||
@ -2762,9 +2677,7 @@ as static to save stack space, because QF::run() never returns and is not
|
||||
reentrant.
|
||||
|
||||
|
||||
|
||||
@section qpcpp_4_0_00 Version 4.0.00, 2008-04-07
|
||||
|
||||
This milestone release is made for the book /ref PSiCC2. The book describes in
|
||||
great detail this new release. The older "QP Programmer's Manual" is now
|
||||
phased out and is replaced with this hyper-linked
|
||||
@ -2867,5 +2780,3 @@ updated to the latest QP API changes.
|
||||
- all examples that use QF now contain the QS software tracing support.
|
||||
|
||||
*/
|
||||
|
||||
} // namespace QP
|
||||
|
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 10 KiB |
BIN
doxygen/images/github-star.jpg
Normal file
After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 144 KiB |
BIN
doxygen/images/logo_zephyr.jpg
Normal file
After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 920 B After Width: | Height: | Size: 774 B |
Before Width: | Height: | Size: 965 B After Width: | Height: | Size: 705 B |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 2.9 KiB |
@ -1,10 +0,0 @@
|
||||
namespace QP {
|
||||
|
||||
/*! @page lint PC-Lint
|
||||
The QP/C++ framework comes with extensive support for automatic rule checking by means of <a class="extern" target="_blank" href="http://www.gimpel.com/">PC-Lint</a>, which is designed not just for proving compliance of the QP/C++ framework code, but more importantly, to aid in checking compliance of the application-level code. Any organization engaged in designing safety-related embedded software could benefit from the unprecedented quality infrastructure built around the QP/C++ framework.
|
||||
|
||||
@sa ports_lint
|
||||
*/
|
||||
|
||||
} // namespace QP
|
||||
|
@ -1,150 +0,0 @@
|
||||
namespace QP {
|
||||
|
||||
//! @file
|
||||
//! @brief Various macros for configuring and porting QP/C++
|
||||
|
||||
//! The preprocessor switch to disable checking assertions
|
||||
//
|
||||
//! When defined, Q_NASSERT disables the following macros #Q_ASSERT,
|
||||
//! #Q_REQUIRE, #Q_ENSURE, #Q_INVARIANT, #Q_ERROR as well as
|
||||
//! #Q_ASSERT_ID, #Q_REQUIRE_ID, #Q_ENSURE_ID, #Q_INVARIANT_ID, and
|
||||
//! #Q_ERROR_ID do NOT evaluate the test condition passed as the
|
||||
//! argument to these macros.
|
||||
//!
|
||||
//! @note One notable exception is the macro #Q_ALLEGE, that still
|
||||
//! evaluates the test condition, but does not report assertion
|
||||
//! failures when the switch Q_NASSERT is defined.
|
||||
#define Q_NASSERT
|
||||
|
||||
//! The preprocessor switch to activate the event-constructors
|
||||
//! and destructors
|
||||
//
|
||||
//! When Q_EVT_CTOR is defined (typically in the qep_port.hpp header file),
|
||||
//! QP::QEvt becomes a class with constructor and virtual destructor.
|
||||
//! More importantly, the subclasses of QEvt (your custom events) can have
|
||||
//! non-default constructors and destructors. These constructors are then
|
||||
//! called when events are created (e.g., with Q_NEW()) and the destrucor
|
||||
//! is invoked before recycling the event with QP::QF::gc().
|
||||
#define Q_EVT_CTOR
|
||||
|
||||
//! The preprocessor switch to activate the QS software tracing
|
||||
//! instrumentation in the code
|
||||
//
|
||||
//! When defined, Q_SPY activates the QS software tracing instrumentation.
|
||||
//! When Q_SPY is not defined, the QS instrumentation in the code does
|
||||
//! not generate any code.
|
||||
#define Q_SPY
|
||||
|
||||
//! The preprocessor switch to activate the QUTest unit testing
|
||||
//! instrumentation in the code
|
||||
//!
|
||||
//! @note
|
||||
//! This macro requires that #Q_SPY be defined as well.
|
||||
#define Q_UTEST
|
||||
|
||||
//! This macro defines the type of the thread handle used for AOs
|
||||
#define QF_THREAD_TYPE void*
|
||||
|
||||
//! This macro defines the type of the event-queue used for AOs
|
||||
#define QF_EQUEUE_TYPE QEQueue
|
||||
|
||||
//! This macro defines the type of the OS-Object used for blocking
|
||||
// the native ::QEQueue when the queue is empty
|
||||
//
|
||||
//! @description
|
||||
//! This macro is used when ::QEQueue is used as the event-queue for AOs
|
||||
//! but also the AO queue must *block* when the queue is empty.
|
||||
//! In that case, #QF_OS_OBJECT_TYPE specifies the blocking mechanism.
|
||||
//! For examle, in the POSIX port, the blocking mechanism is a condition
|
||||
//! variable.
|
||||
//!
|
||||
#define QF_OS_OBJECT_TYPE pthread_cond_t
|
||||
|
||||
//! Platform-dependent macro defining how QF should block the calling
|
||||
//! task when the QF native queue is empty
|
||||
//
|
||||
//! @note This is just an example of #QACTIVE_EQUEUE_WAIT_ for the QK-port
|
||||
//! of QF. QK never activates a task that has no events to process, so in this
|
||||
//! case the macro asserts that the queue is not empty. In other QF ports you
|
||||
// need to define the macro appropriately for the underlying kernel/OS you're
|
||||
//! using.
|
||||
#define QACTIVE_EQUEUE_WAIT_(me_) \
|
||||
Q_ASSERT((me_)->m_eQueue.m_frontEvt != nullptr)
|
||||
|
||||
//! Platform-dependent macro defining how QF should signal the
|
||||
//! active object task that an event has just arrived.
|
||||
//
|
||||
//! The macro is necessary only when the native QF event queue is used.
|
||||
//! The signaling of task involves unblocking the task if it is blocked.
|
||||
//!
|
||||
//! @note #QACTIVE_EQUEUE_SIGNAL_ is called from a critical section.
|
||||
//! It might leave the critical section internally, but must restore
|
||||
//! the critical section before exiting to the caller.
|
||||
//!
|
||||
//! @note This is just an example of #QACTIVE_EQUEUE_SIGNAL_ for the QK-port
|
||||
//! of QF. In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QACTIVE_EQUEUE_SIGNAL_(me_) do { \
|
||||
QK_readySet_.insert((me_)->m_prio); \
|
||||
if (QK_intNest_ == 0U) { \
|
||||
uint8_t p = QK_schedPrio_(); \
|
||||
if (p != 0U) { \
|
||||
QK_sched_(p); \
|
||||
} \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
//! This macro defines the type of the event pool used in this QF port.
|
||||
//
|
||||
//! @note This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_TYPE_ QMPool
|
||||
|
||||
//! This macro enables calling the QK context-switch callback
|
||||
//! QK_onContextSw()
|
||||
#define QK_ON_CONTEXT_SW
|
||||
|
||||
//! This macro enables calling the QXK context-switch callback
|
||||
//! QXK_onContextSw()
|
||||
#define QXK_ON_CONTEXT_SW
|
||||
|
||||
//! Platform-dependent macro defining the event pool initialization
|
||||
//!
|
||||
//! @note This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_INIT_(p_, poolSto_, poolSize_, evtSize_) \
|
||||
(p_).init((poolSto_), (poolSize_), static_cast<QMPoolSize>(evtSize_))
|
||||
|
||||
//! Platform-dependent macro defining how QF should obtain the
|
||||
//! event pool block-size
|
||||
//!
|
||||
//! @note This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_EVENT_SIZE_(p_) static_cast<uint32_t>((p_).getBlockSize())
|
||||
|
||||
//! Platform-dependent macro defining how QF should obtain an event
|
||||
//! @a e_ from the event pool @a p_
|
||||
//!
|
||||
//! @note This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_GET_(p_, e_, m_, qs_id_) \
|
||||
((e_) = static_cast<QEvt *>((p_).get((m_), (qs_id_))))
|
||||
|
||||
//! Platform-dependent macro defining how QF should return an event
|
||||
//! @a e_ to the event pool @a p_
|
||||
//!
|
||||
//! @note This is a specific implementation for the QK-port of QF.
|
||||
//! In other QF ports you need to define the macro appropriately for
|
||||
//! the underlying kernel/OS you're using.
|
||||
#define QF_EPOOL_PUT_(p_, e_, qs_id_) ((p_).put((e_), (qs_id_)))
|
||||
|
||||
//! Macro that should be defined (typically on the compiler's command line)
|
||||
//! in the Win32-GUI applications that use the @ref win32 or @ref win32-qv
|
||||
//! ports.
|
||||
#define WIN32_GUI
|
||||
|
||||
} // namespace QP
|
@ -35,7 +35,8 @@ The QP™/C++ Real-Time Embedded Framework (RTEF) is a unique offering on th
|
||||
|
||||
|
||||
@subsection over_oop Object Orientation
|
||||
QP™/C++ is fundamentally an **object-oriented** framework, which means that the framework itself and your applications derived from the framework are fundamentally composed of <a href="https://en.wikipedia.org/wiki/Class_(computer_programming)" target="_blank" class="extern">classes</a> and only classes can have @ref srs_sm "state machines" associated with them.
|
||||
@anchor oop
|
||||
QP™/C++ is fundamentally an **object-oriented** framework, which means that the framework itself and your applications derived from the framework are fundamentally composed of @ref sas_core "classes" and only classes can have @ref srs_sm "state machines" associated with them.
|
||||
|
||||
@subsection over_hsms Hierarchical State Machines
|
||||
The behavior of active objects is specified in QP™/C++ by means of @webref{fsm/#HSM, hierarchical state machines (UML statecharts)}. The framework supports @ref sds_sm "manual coding of UML state machines in C++" as well as fully **automatic code generation** by means of the free graphical @webref{products/qm, QM™ model-based design (MBD) tool}.
|
||||
@ -60,7 +61,7 @@ QP™/C++ can also work with many traditional @ref exa_rtos "RTOSes" and @re
|
||||
|
||||
|
||||
@subsection over_trace Traceability
|
||||
QP™/C++ offers unprecedented, bidirectional @ref trace "traceability" among all work artifacts, which gives teams full visibility from requirements through architecture, design, source code, tests, and back again.
|
||||
QP™/C++ offers unprecedented, bidirectional @ref tr "traceability" among all work artifacts, which gives teams full visibility from requirements through architecture, design, source code, tests, and back again.
|
||||
|
||||
|
||||
@subsection over_popular Popularity & Maturity
|
||||
|
@ -1,94 +1,94 @@
|
||||
@echo off
|
||||
:: ==========================================================================
|
||||
:: Product: QP/C++ script for generating Doxygen documentation
|
||||
:: Last Updated for Version: 6.8.0
|
||||
:: Date of the Last Update: 2020-01-17
|
||||
::
|
||||
:: 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 <http://www.gnu.org/licenses/>.
|
||||
::
|
||||
:: Contact information:
|
||||
:: <www.state-machine.com/licensing>
|
||||
:: <info@state-machine.com>
|
||||
:: ==========================================================================
|
||||
@setlocal
|
||||
|
||||
@echo usage:
|
||||
@echo make
|
||||
@echo make -CHM
|
||||
|
||||
@set VERSION=6.8.0
|
||||
|
||||
@set DOXHOME="C:\tools\doxygen\bin"
|
||||
|
||||
:: Generate Resource Standard Metrics for QP/C++ .............................
|
||||
@set RCMHOME="C:\tools\MSquared\M2 RSM"
|
||||
|
||||
@set RSM_OUTPUT=metrics.dox
|
||||
@set RSM_INPUT=..\include\*.hpp ..\src\*.hpp ..\src\qf\*.cpp ..\src\qv\*.cpp ..\src\qk\*.cpp ..\src\qxk\*.cpp
|
||||
|
||||
@echo /** @page metrics Code Metrics > %RSM_OUTPUT%
|
||||
@echo.>> %RSM_OUTPUT%
|
||||
@echo @code{cpp} >> %RSM_OUTPUT%
|
||||
@echo Standard Code Metrics for QP/C++ %VERSION% >> %RSM_OUTPUT%
|
||||
|
||||
%RCMHOME%\rsm.exe -fd -xNOCOMMAND -xNOCONFIG -u"File cfg rsm_qpcpp.cfg" %RSM_INPUT% >> %RSM_OUTPUT%
|
||||
|
||||
@echo @endcode >> %RSM_OUTPUT%
|
||||
@echo */ >> %RSM_OUTPUT%
|
||||
|
||||
:: Generate Doxygen Documentation ...........................................
|
||||
if "%1"=="-CHM" (
|
||||
@echo Generating HTML...
|
||||
%DOXHOME%\doxygen.exe Doxyfile-CHM
|
||||
|
||||
@echo Adding custom images...
|
||||
xcopy preview.js tmp\
|
||||
xcopy img tmp\img\
|
||||
@echo img\img.htm >> tmp\index.hhp
|
||||
|
||||
@echo Generating CHM...
|
||||
"C:\tools\HTML Help Workshop\hhc.exe" tmp\index.hhp
|
||||
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
@rmdir /S /Q tmp
|
||||
@echo CHM file generated in qpcpp.chm
|
||||
|
||||
) else (
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
rmdir /S /Q C:\qp_lab\qpcpp\html
|
||||
|
||||
echo Adding custom images...
|
||||
xcopy preview.js C:\qp_lab\qpcpp\html\
|
||||
xcopy img C:\qp_lab\qpcpp\html\img\
|
||||
copy images\favicon.ico C:\qp_lab\qpcpp\html
|
||||
|
||||
@echo Generating HTML...
|
||||
%DOXHOME%\doxygen.exe Doxyfile
|
||||
@qclean C:\qp_lab\qpcpp\html
|
||||
)
|
||||
|
||||
@endlocal
|
||||
@echo off
|
||||
:: ==========================================================================
|
||||
:: Product: QP/C++ script for generating Doxygen documentation
|
||||
:: Last Updated for Version: 6.8.0
|
||||
:: Date of the Last Update: 2020-01-17
|
||||
::
|
||||
:: 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 <http://www.gnu.org/licenses/>.
|
||||
::
|
||||
:: Contact information:
|
||||
:: <www.state-machine.com/licensing>
|
||||
:: <info@state-machine.com>
|
||||
:: ==========================================================================
|
||||
@setlocal
|
||||
|
||||
@echo usage:
|
||||
@echo make
|
||||
@echo make -CHM
|
||||
|
||||
@set VERSION=6.8.0
|
||||
|
||||
@set DOXHOME="C:\tools\doxygen\bin"
|
||||
|
||||
:: Generate Resource Standard Metrics for QP/C++ .............................
|
||||
@set RCMHOME="C:\tools\MSquared\M2 RSM"
|
||||
|
||||
@set RSM_OUTPUT=metrics.dox
|
||||
@set RSM_INPUT=..\include\*.hpp ..\src\*.hpp ..\src\qf\*.cpp ..\src\qv\*.cpp ..\src\qk\*.cpp ..\src\qxk\*.cpp
|
||||
|
||||
@echo /** @page metrics Code Metrics > %RSM_OUTPUT%
|
||||
@echo.>> %RSM_OUTPUT%
|
||||
@echo @code{cpp} >> %RSM_OUTPUT%
|
||||
@echo Standard Code Metrics for QP/C++ %VERSION% >> %RSM_OUTPUT%
|
||||
|
||||
%RCMHOME%\rsm.exe -fd -xNOCOMMAND -xNOCONFIG -u"File cfg rsm_qpcpp.cfg" %RSM_INPUT% >> %RSM_OUTPUT%
|
||||
|
||||
@echo @endcode >> %RSM_OUTPUT%
|
||||
@echo */ >> %RSM_OUTPUT%
|
||||
|
||||
:: Generate Doxygen Documentation ...........................................
|
||||
if "%1"=="-CHM" (
|
||||
@echo Generating HTML...
|
||||
%DOXHOME%\doxygen.exe Doxyfile-CHM
|
||||
|
||||
@echo Adding custom images...
|
||||
xcopy preview.js tmp\
|
||||
xcopy img tmp\img\
|
||||
@echo img\img.htm >> tmp\index.hhp
|
||||
|
||||
@echo Generating CHM...
|
||||
"C:\tools\HTML Help Workshop\hhc.exe" tmp\index.hhp
|
||||
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
@rmdir /S /Q tmp
|
||||
@echo CHM file generated in qpcpp.chm
|
||||
|
||||
) else (
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
rmdir /S /Q C:\qp_lab\qpcpp\html
|
||||
|
||||
echo Adding custom images...
|
||||
xcopy preview.js C:\qp_lab\qpcpp\html\
|
||||
xcopy img C:\qp_lab\qpcpp\html\img\
|
||||
copy images\favicon.ico C:\qp_lab\qpcpp\html
|
||||
|
||||
@echo Generating HTML...
|
||||
%DOXHOME%\doxygen.exe Doxyfile
|
||||
@qclean C:\qp_lab\qpcpp\html
|
||||
)
|
||||
|
||||
@endlocal
|
||||
|
186
doxygen/make.bat
@ -1,93 +1,93 @@
|
||||
@echo off
|
||||
:: ==========================================================================
|
||||
:: Product: batch script for generating Doxygen documentation
|
||||
:: 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: <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 top-level comment block.
|
||||
:: Plagiarizing this software to sidestep the license obligations is illegal.
|
||||
::
|
||||
:: Contact information:
|
||||
:: <www.state-machine.com>
|
||||
:: <info@state-machine.com>
|
||||
:: ==========================================================================
|
||||
@setlocal
|
||||
|
||||
@echo usage:
|
||||
@echo make
|
||||
@echo make -CHM
|
||||
@echo make ...
|
||||
|
||||
:: Doxygen tool (adjust to your system) ......................................
|
||||
@set DOXYGEN=doxygen
|
||||
|
||||
:: HTML Help tool (needed only with the -CHM option, (adjust to your system) .
|
||||
@set HHC="C:\tools\HTML Help Workshop\hhc.exe"
|
||||
|
||||
:: Simple complexity metrics tool (adjust to your system) ...................
|
||||
@set LIZARD=lizard
|
||||
|
||||
:: QP/C++ directory ..........................................................
|
||||
@set QPCPP=..
|
||||
|
||||
:: HTML outut directory ......................................................
|
||||
@set HTML_OUT=%QPCPP%\html
|
||||
|
||||
:: Generate metrics.dox file...
|
||||
@set METRICS_INP=%QPCPP%\include %QPCPP%\src -x %QPCPP%\src\qs\*
|
||||
@set METRICS_OUT=metrics.dox
|
||||
|
||||
@echo /** @defgroup metrics Code Metrics> %METRICS_OUT%
|
||||
@echo.>> %METRICS_OUT%
|
||||
@echo @code{.cpp}>> %METRICS_OUT%
|
||||
@echo QP/C++ Code Metrics >> %METRICS_OUT%
|
||||
|
||||
%LIZARD% -m -L500 -a10 -C20 -V %METRICS_INP% >> %METRICS_OUT%
|
||||
|
||||
@echo @endcode>> %METRICS_OUT%
|
||||
@echo */ >> %METRICS_OUT%
|
||||
|
||||
:: Generate Doxygen Documentation...
|
||||
if "%1"=="-CHM" (
|
||||
@echo Generating HTML...
|
||||
%DOXYGEN% Doxyfile-CHM
|
||||
|
||||
@echo Adding custom images...
|
||||
xcopy img tmp\img\
|
||||
@echo img\img.htm >> tmp\index.hhp
|
||||
|
||||
@echo Generating CHM...
|
||||
%HHC% tmp\index.hhp
|
||||
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
@rmdir /S /Q tmp
|
||||
@echo CHM file generated
|
||||
|
||||
) else (
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
rmdir /S /Q %HTML_OUT%
|
||||
|
||||
@echo Generating HTML...
|
||||
%DOXYGEN% Doxyfile%1
|
||||
|
||||
@echo Adding custom images...
|
||||
xcopy img %HTML_OUT%\img\
|
||||
xcopy /Y ..\..\ql-doxygen\jquery.js %HTML_OUT%
|
||||
rem @qclean %HTML_OUT%
|
||||
)
|
||||
|
||||
@endlocal
|
||||
@echo off
|
||||
:: ==========================================================================
|
||||
:: Product: batch script for generating Doxygen documentation
|
||||
:: 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: <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 top-level comment block.
|
||||
:: Plagiarizing this software to sidestep the license obligations is illegal.
|
||||
::
|
||||
:: Contact information:
|
||||
:: <www.state-machine.com>
|
||||
:: <info@state-machine.com>
|
||||
:: ==========================================================================
|
||||
@setlocal
|
||||
|
||||
@echo usage:
|
||||
@echo make
|
||||
@echo make -CHM
|
||||
@echo make ...
|
||||
|
||||
:: Doxygen tool (adjust to your system) ......................................
|
||||
@set DOXYGEN=doxygen
|
||||
|
||||
:: HTML Help tool (needed only with the -CHM option, (adjust to your system) .
|
||||
@set HHC="C:\tools\HTML Help Workshop\hhc.exe"
|
||||
|
||||
:: Simple complexity metrics tool (adjust to your system) ...................
|
||||
@set LIZARD=lizard
|
||||
|
||||
:: QP/C++ directory ..........................................................
|
||||
@set QPCPP=..
|
||||
|
||||
:: HTML outut directory ......................................................
|
||||
@set HTML_OUT=%QPCPP%\html
|
||||
|
||||
:: Generate metrics.dox file...
|
||||
@set METRICS_INP=%QPCPP%\include %QPCPP%\src -x %QPCPP%\src\qs\*
|
||||
@set METRICS_OUT=metrics.dox
|
||||
|
||||
@echo /** @defgroup metrics Code Metrics> %METRICS_OUT%
|
||||
@echo.>> %METRICS_OUT%
|
||||
@echo @code{.cpp}>> %METRICS_OUT%
|
||||
@echo QP/C++ Code Metrics >> %METRICS_OUT%
|
||||
|
||||
%LIZARD% -m -L500 -a10 -C20 -V %METRICS_INP% >> %METRICS_OUT%
|
||||
|
||||
@echo @endcode>> %METRICS_OUT%
|
||||
@echo */ >> %METRICS_OUT%
|
||||
|
||||
:: Generate Doxygen Documentation...
|
||||
if "%1"=="-CHM" (
|
||||
@echo Generating HTML...
|
||||
%DOXYGEN% Doxyfile-CHM
|
||||
|
||||
@echo Adding custom images...
|
||||
xcopy img tmp\img\
|
||||
@echo img\img.htm >> tmp\index.hhp
|
||||
|
||||
@echo Generating CHM...
|
||||
%HHC% tmp\index.hhp
|
||||
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
@rmdir /S /Q tmp
|
||||
@echo CHM file generated
|
||||
|
||||
) else (
|
||||
@echo.
|
||||
@echo Cleanup...
|
||||
rmdir /S /Q %HTML_OUT%
|
||||
|
||||
@echo Generating HTML...
|
||||
%DOXYGEN% Doxyfile%1
|
||||
|
||||
@echo Adding custom images...
|
||||
xcopy img %HTML_OUT%\img\
|
||||
xcopy /Y ..\..\ql-doxygen\jquery.js %HTML_OUT%
|
||||
rem @qclean %HTML_OUT%
|
||||
)
|
||||
|
||||
@endlocal
|
||||
|
@ -5,235 +5,228 @@
|
||||
================================================
|
||||
NLOC CCN token PARAM length location
|
||||
------------------------------------------------
|
||||
3 1 14 1 4 QP::QEvt::QEvt@141-144@..\include\qep.hpp
|
||||
5 1 26 2 5 QP::QEvt::QEvt@148-152@..\include\qep.hpp
|
||||
1 1 6 0 1 QP::QEvt::~QEvt@156-156@..\include\qep.hpp
|
||||
3 1 17 1 3 QP::QHsm::init@262-264@..\include\qep.hpp
|
||||
3 1 13 1 3 QP::QHsm::state@276-278@..\include\qep.hpp
|
||||
4 1 18 1 4 QP::QHsm::tran@334-337@..\include\qep.hpp
|
||||
4 1 18 1 4 QP::QHsm::tran_hist@340-343@..\include\qep.hpp
|
||||
4 1 18 1 4 QP::QHsm::super@346-349@..\include\qep.hpp
|
||||
4 1 30 1 4 QP::QHsm::qm_tran@360-363@..\include\qep.hpp
|
||||
7 1 42 2 7 QP::QHsm::qm_tran_hist@367-373@..\include\qep.hpp
|
||||
4 1 30 1 4 QP::QHsm::qm_tran_init@377-380@..\include\qep.hpp
|
||||
4 1 30 1 4 QP::QHsm::qm_tran_ep@384-387@..\include\qep.hpp
|
||||
7 1 40 2 7 QP::QHsm::qm_tran_xp@391-397@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_entry@401-404@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_exit@407-410@..\include\qep.hpp
|
||||
4 1 19 1 4 QP::QHsm::qm_entry@416-419@..\include\qep.hpp
|
||||
4 1 19 1 4 QP::QHsm::qm_exit@422-425@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_sm_exit@429-432@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_super_sub@436-439@..\include\qep.hpp
|
||||
3 1 13 1 3 QP::QMsm::stateObj@500-502@..\include\qep.hpp
|
||||
3 1 10 1 3 QP::QEP::getVersion@584-586@..\include\qep.hpp
|
||||
3 1 11 1 3 QP::QEQueue::getNFree@215-217@..\include\qequeue.hpp
|
||||
3 1 11 1 3 QP::QEQueue::getNMin@230-232@..\include\qequeue.hpp
|
||||
3 1 13 1 3 QP::QEQueue::isEmpty@244-246@..\include\qequeue.hpp
|
||||
6 1 51 5 6 QP::QActive::start@192-197@..\include\qf.hpp
|
||||
3 1 19 1 3 QP::QActive::getPrio@243-245@..\include\qf.hpp
|
||||
3 1 22 1 3 QP::QActive::setPrio@248-250@..\include\qf.hpp
|
||||
1 1 10 1 1 QP::QActive::getOsObject@258-258@..\include\qf.hpp
|
||||
1 1 10 1 1 QP::QActive::getThread@264-264@..\include\qf.hpp
|
||||
3 1 13 1 3 QP::QMActive::stateObj@340-342@..\include\qf.hpp
|
||||
3 1 17 1 3 QP::QTimeEvt::toActive@455-457@..\include\qf.hpp
|
||||
3 1 17 1 3 QP::QTimeEvt::toTimeEvt@460-462@..\include\qf.hpp
|
||||
3 1 10 1 3 QP::QF::getVersion@491-493@..\include\qf.hpp
|
||||
3 1 10 1 3 QP::QK::getVersion@146-148@..\include\qk.hpp
|
||||
3 1 11 1 3 QP::QMPool::getBlockSize@142-144@..\include\qmpool.hpp
|
||||
3 1 11 1 3 QP::QPSet::setEmpty@73-75@..\include\qpset.hpp
|
||||
3 1 15 1 3 QP::QPSet::isEmpty@78-80@..\include\qpset.hpp
|
||||
3 1 15 1 3 QP::QPSet::notEmpty@83-85@..\include\qpset.hpp
|
||||
3 1 30 1 3 QP::QPSet::hasElement@88-90@..\include\qpset.hpp
|
||||
3 1 28 1 3 QP::QPSet::insert@93-95@..\include\qpset.hpp
|
||||
4 1 40 1 4 QP::QPSet::rmove@101-104@..\include\qpset.hpp
|
||||
3 1 14 1 3 QP::QPSet::findMax@106-108@..\include\qpset.hpp
|
||||
4 1 21 1 4 QP::QPSet::setEmpty@127-130@..\include\qpset.hpp
|
||||
3 2 29 1 3 QP::QPSet::isEmpty@134-136@..\include\qpset.hpp
|
||||
3 2 29 1 3 QP::QPSet::notEmpty@140-142@..\include\qpset.hpp
|
||||
7 2 79 1 7 QP::QPSet::hasElement@145-151@..\include\qpset.hpp
|
||||
10 2 84 1 10 QP::QPSet::insert@154-163@..\include\qpset.hpp
|
||||
10 2 88 1 10 QP::QPSet::rmove@169-178@..\include\qpset.hpp
|
||||
5 2 40 1 5 QP::QPSet::findMax@181-185@..\include\qpset.hpp
|
||||
3 1 19 1 3 QP::QSpyId::getPrio@205-207@..\include\qs.hpp
|
||||
7 1 28 1 7 QP::QS::force_cast@497-503@..\include\qs.hpp
|
||||
14 3 72 1 14 QP::QS::rxPut@538-551@..\include\qs.hpp
|
||||
6 1 49 5 6 QP::QActiveDummy::start@587-592@..\include\qs.hpp
|
||||
3 1 19 1 3 QP::QSpyId::getPrio@106-108@..\include\qs_dummy.hpp
|
||||
3 1 20 1 3 QP::QXThread::init@79-81@..\include\qxthread.hpp
|
||||
6 1 51 5 6 QP::QXThread::start@95-100@..\include\qxthread.hpp
|
||||
2 1 19 2 3 QP::QEvt@91-93@..\src\qf\qep_hsm.cpp
|
||||
4 1 27 1 4 QP::QHsm::QHsm@116-119@..\src\qf\qep_hsm.cpp
|
||||
2 1 7 0 2 QP::QHsm::~QHsm@125-126@..\src\qf\qep_hsm.cpp
|
||||
47 7 318 2 68 QP::QHsm::init@140-207@..\src\qf\qep_hsm.cpp
|
||||
5 1 37 2 5 QP::QHsm::top@228-232@..\src\qf\qep_hsm.cpp
|
||||
102 15 608 2 154 QP::QHsm::dispatch@249-402@..\src\qf\qep_hsm.cpp
|
||||
95 15 460 2 129 QP::QHsm::hsm_tran@419-547@..\src\qf\qep_hsm.cpp
|
||||
3 1 13 0 3 QP::QHsm::getStateHandler@551-553@..\src\qf\qep_hsm.cpp
|
||||
16 3 85 1 23 QP::QHsm::isIn@572-594@..\src\qf\qep_hsm.cpp
|
||||
20 4 108 1 29 QP::QHsm::childState@618-646@..\src\qf\qep_hsm.cpp
|
||||
6 1 29 1 6 QP::QMsm::QMsm@74-79@..\src\qf\qep_msm.cpp
|
||||
22 3 168 2 36 QP::QMsm::init@92-127@..\src\qf\qep_msm.cpp
|
||||
3 1 21 1 3 QP::QMsm::init@139-141@..\src\qf\qep_msm.cpp
|
||||
113 21 661 2 166 QP::QMsm::dispatch@154-319@..\src\qf\qep_msm.cpp
|
||||
3 1 15 0 3 QP::QMsm::getStateHandler@326-328@..\src\qf\qep_msm.cpp
|
||||
51 9 298 2 64 QP::QMsm::execTatbl_@345-408@..\src\qf\qep_msm.cpp
|
||||
21 4 116 3 28 QP::QMsm::exitToTranSource_@420-447@..\src\qf\qep_msm.cpp
|
||||
43 6 236 2 54 QP::QMsm::enterHistory_@461-514@..\src\qf\qep_msm.cpp
|
||||
13 3 59 1 14 QP::QMsm::isInState@529-542@..\src\qf\qep_msm.cpp
|
||||
21 4 90 1 28 QP::QMsm::childStateObj@559-586@..\src\qf\qep_msm.cpp
|
||||
9 3 72 1 10 QP::QF::add_@68-77@..\src\qf\qf_act.cpp
|
||||
10 3 80 1 11 QP::QF::remove_@92-102@..\src\qf\qf_act.cpp
|
||||
7 2 61 2 7 QP::QF::bzero@117-123@..\src\qf\qf_act.cpp
|
||||
24 6 155 1 29 QF_LOG2@139-167@..\src\qf\qf_act.cpp
|
||||
79 13 394 2 115 QP::QActive::post_@91-205@..\src\qf\qf_actq.cpp
|
||||
42 7 237 1 63 QP::QActive::postLIFO@221-283@..\src\qf\qf_actq.cpp
|
||||
34 3 206 1 46 QP::QActive::get_@304-349@..\src\qf\qf_actq.cpp
|
||||
10 2 68 1 13 QP::QF::getQueueMin@369-381@..\src\qf\qf_actq.cpp
|
||||
5 1 30 1 6 QP::QTicker::QTicker@384-389@..\src\qf\qf_actq.cpp
|
||||
7 1 41 2 7 QP::QTicker::init@391-397@..\src\qf\qf_actq.cpp
|
||||
14 2 88 2 16 QP::QTicker::dispatch@399-414@..\src\qf\qf_actq.cpp
|
||||
3 1 22 1 3 QP::QTicker::init@416-418@..\src\qf\qf_actq.cpp
|
||||
27 3 160 2 40 QP::QTicker::post_@428-467@..\src\qf\qf_actq.cpp
|
||||
4 1 26 1 4 QP::QTicker::postLIFO@470-473@..\src\qf\qf_actq.cpp
|
||||
12 1 79 2 14 QP::QActive::defer@74-87@..\src\qf\qf_defer.cpp
|
||||
32 3 157 1 49 QP::QActive::recall@110-158@..\src\qf\qf_defer.cpp
|
||||
11 2 62 1 11 QP::QActive::flushDeferred@175-185@..\src\qf\qf_defer.cpp
|
||||
16 3 133 3 24 QP::QF::poolInit@82-105@..\src\qf\qf_dyn.cpp
|
||||
39 7 268 3 55 QP::QF::newX_@133-187@..\src\qf\qf_dyn.cpp
|
||||
35 5 244 1 57 QP::QF::gc@212-268@..\src\qf\qf_dyn.cpp
|
||||
18 2 106 2 25 QP::QF::newRef_@284-308@..\src\qf\qf_dyn.cpp
|
||||
11 1 70 1 13 QP::QF::deleteRef_@320-332@..\src\qf\qf_dyn.cpp
|
||||
3 1 20 1 3 QP::QF::poolGetMaxBlockSize@338-340@..\src\qf\qf_dyn.cpp
|
||||
9 1 43 1 9 QP::QMPool::QMPool@60-68@..\src\qf\qf_mem.cpp
|
||||
31 5 234 3 53 QP::QMPool::init@100-152@..\src\qf\qf_mem.cpp
|
||||
17 2 110 2 23 QP::QMPool::put@171-193@..\src\qf\qf_mem.cpp
|
||||
42 4 211 2 65 QP::QMPool::get@224-288@..\src\qf\qf_mem.cpp
|
||||
10 3 71 1 13 QP::QF::getPoolMin@303-315@..\src\qf\qf_mem.cpp
|
||||
7 1 42 2 11 QP::QF::psInit@85-95@..\src\qf\qf_ps.cpp
|
||||
90 17 587 1 202 QP::QF::publish_@115-316@..\src\qf\qf_ps.cpp
|
||||
7 3 47 1 12 QP::QActive::QActive@37-48@..\src\qf\qf_qact.cpp
|
||||
9 1 44 1 9 QP::QEQueue::QEQueue@55-63@..\src\qf\qf_qeq.cpp
|
||||
13 2 74 2 13 QP::QEQueue::init@81-93@..\src\qf\qf_qeq.cpp
|
||||
56 8 280 3 75 QP::QEQueue::post@119-193@..\src\qf\qf_qeq.cpp
|
||||
35 5 177 2 45 QP::QEQueue::postLIFO@217-261@..\src\qf\qf_qeq.cpp
|
||||
36 4 193 1 46 QP::QEQueue::get@281-326@..\src\qf\qf_qeq.cpp
|
||||
5 1 22 1 5 QP::QMActive::QMActive@59-63@..\src\qf\qf_qmact.cpp
|
||||
4 1 41 2 4 QP::QMActive::init@66-69@..\src\qf\qf_qmact.cpp
|
||||
4 1 33 1 4 QP::QMActive::init@71-74@..\src\qf\qf_qmact.cpp
|
||||
5 1 32 2 5 QP::QMActive::dispatch@76-80@..\src\qf\qf_qmact.cpp
|
||||
3 1 27 1 3 QP::QMActive::isInState@83-85@..\src\qf\qf_qmact.cpp
|
||||
6 1 27 1 6 QP::QMActive::childStateObj@87-92@..\src\qf\qf_qmact.cpp
|
||||
3 1 20 0 3 QP::QMActive::getStateHandler@97-99@..\src\qf\qf_qmact.cpp
|
||||
69 7 390 1 101 QP::QF::tickX_@78-178@..\src\qf\qf_time.cpp
|
||||
14 3 70 1 17 QP::QF::noTimeEvtsActiveX@193-209@..\src\qf\qf_time.cpp
|
||||
16 2 104 3 32 QP::QTimeEvt::QTimeEvt@222-253@..\src\qf\qf_time.cpp
|
||||
13 1 53 0 29 QP::QTimeEvt::QTimeEvt@259-287@..\src\qf\qf_time.cpp
|
||||
33 8 221 2 60 QP::QTimeEvt::armX@316-375@..\src\qf\qf_time.cpp
|
||||
32 3 170 1 41 QP::QTimeEvt::disarm@393-433@..\src\qf\qf_time.cpp
|
||||
33 8 221 1 62 QP::QTimeEvt::rearm@455-516@..\src\qf\qf_time.cpp
|
||||
5 1 38 1 6 QP::QTimeEvt::wasDisarmed@538-543@..\src\qf\qf_time.cpp
|
||||
7 1 28 1 8 QP::QTimeEvt::currCtr@558-565@..\src\qf\qf_time.cpp
|
||||
11 2 79 1 16 QP::QF::init@70-85@..\src\qk\qk.cpp
|
||||
3 1 14 1 4 QP::QF::stop@103-106@..\src\qk\qk.cpp
|
||||
6 2 26 1 8 QP::initial_events@111-118@..\src\qk\qk.cpp
|
||||
12 3 49 1 19 QP::QF::run@129-147@..\src\qk\qk.cpp
|
||||
21 5 144 6 30 QP::QActive::start@165-194@..\src\qk\qk.cpp
|
||||
21 2 136 1 32 QP::QK::schedLock@219-250@..\src\qk\qk.cpp
|
||||
22 4 147 1 33 QP::QK::schedUnlock@269-301@..\src\qk\qk.cpp
|
||||
14 3 94 1 17 QK_sched_@321-337@..\src\qk\qk.cpp
|
||||
59 15 397 1 103 QK_activate_@348-450@..\src\qk\qk.cpp
|
||||
9 2 67 1 13 QP::QF::init@76-88@..\src\qv\qv.cpp
|
||||
3 1 12 1 4 QP::QF::stop@106-109@..\src\qv\qv.cpp
|
||||
38 9 200 1 75 QP::QF::run@127-201@..\src\qv\qv.cpp
|
||||
15 3 114 6 22 QP::QActive::start@219-240@..\src\qv\qv.cpp
|
||||
2 1 10 0 2 QP::QXKIdleThread::QXKIdleThread@63-64@..\src\qxk\qxk.cpp
|
||||
14 2 105 1 22 QP::QF::init@79-100@..\src\qxk\qxk.cpp
|
||||
3 1 12 1 4 QP::QF::stop@118-121@..\src\qxk\qxk.cpp
|
||||
6 2 26 1 8 QP::initial_events@126-133@..\src\qxk\qxk.cpp
|
||||
12 3 49 1 20 QP::QF::run@142-161@..\src\qxk\qxk.cpp
|
||||
23 6 158 6 32 QP::QActive::start@178-209@..\src\qxk\qxk.cpp
|
||||
23 3 148 1 33 QP::QXK::schedLock@232-264@..\src\qxk\qxk.cpp
|
||||
22 4 147 1 34 QP::QXK::schedUnlock@287-320@..\src\qxk\qxk.cpp
|
||||
48 7 279 1 67 QXK_sched_@340-406@..\src\qxk\qxk.cpp
|
||||
74 16 510 1 130 QXK_activate_@417-546@..\src\qxk\qxk.cpp
|
||||
12 2 70 1 18 QXK_current@549-566@..\src\qxk\qxk.cpp
|
||||
16 4 108 1 24 QP::QXMutex::init@82-105@..\src\qxk\qxk_mutex.cpp
|
||||
66 12 477 1 108 QP::QXMutex::lock@127-234@..\src\qxk\qxk_mutex.cpp
|
||||
45 10 288 1 69 QP::QXMutex::tryLock@254-322@..\src\qxk\qxk_mutex.cpp
|
||||
65 16 462 1 112 QP::QXMutex::unlock@341-452@..\src\qxk\qxk_mutex.cpp
|
||||
8 1 58 2 10 QP::QXSemaphore::init@75-84@..\src\qxk\qxk_sema.cpp
|
||||
44 7 292 1 70 QP::QXSemaphore::wait@108-177@..\src\qxk\qxk_sema.cpp
|
||||
15 2 60 1 20 QP::QXSemaphore::tryWait@192-211@..\src\qxk\qxk_sema.cpp
|
||||
27 6 180 1 45 QP::QXSemaphore::signal@231-275@..\src\qxk\qxk_sema.cpp
|
||||
8 1 54 2 8 QP::QXThread::QXThread@83-90@..\src\qxk\qxk_xthr.cpp
|
||||
7 1 40 2 7 QP::QXThread::init@94-100@..\src\qxk\qxk_xthr.cpp
|
||||
7 1 40 2 7 QP::QXThread::dispatch@103-109@..\src\qxk\qxk_xthr.cpp
|
||||
25 6 191 6 44 QP::QXThread::start@132-175@..\src\qxk\qxk_xthr.cpp
|
||||
94 13 469 2 128 QP::QXThread::post_@214-341@..\src\qxk\qxk_xthr.cpp
|
||||
4 1 26 1 4 QP::QXThread::postLIFO@352-355@..\src\qxk\qxk_xthr.cpp
|
||||
58 7 427 1 85 QP::QXThread::queueGet@377-461@..\src\qxk\qxk_xthr.cpp
|
||||
5 1 50 1 6 QP::QXThread::block_@470-475@..\src\qxk\qxk_xthr.cpp
|
||||
8 3 59 1 9 QP::QXThread::unblock_@484-492@..\src\qxk\qxk_xthr.cpp
|
||||
20 3 153 2 37 QP::QXThread::teArm_@502-538@..\src\qxk\qxk_xthr.cpp
|
||||
11 2 42 1 14 QP::QXThread::teDisarm_@547-560@..\src\qxk\qxk_xthr.cpp
|
||||
21 4 175 1 36 QP::QXThread::delay@576-611@..\src\qxk\qxk_xthr.cpp
|
||||
14 2 58 1 16 QP::QXThread::delayCancel@623-638@..\src\qxk\qxk_xthr.cpp
|
||||
14 2 110 1 23 QXK_threadRet_@655-677@..\src\qxk\qxk_xthr.cpp
|
||||
3 1 16 1 3 QP::QF_EVT_POOL_ID_@132-134@..\src\qf_pkg.hpp
|
||||
3 1 16 1 3 QP::QF_EVT_REF_CTR_@137-139@..\src\qf_pkg.hpp
|
||||
3 1 31 1 3 QP::QF_EVT_REF_CTR_INC_@142-144@..\src\qf_pkg.hpp
|
||||
3 1 31 1 3 QP::QF_EVT_REF_CTR_DEC_@147-149@..\src\qf_pkg.hpp
|
||||
37 file analyzed.
|
||||
3 1 13 1 4 QP::QEvt::QEvt@188-191@..\include\qep.hpp
|
||||
7 1 27 2 7 QP::QEvt::QEvt@197-203@..\include\qep.hpp
|
||||
2 1 6 0 3 QP::QEvt::~QEvt@209-211@..\include\qep.hpp
|
||||
2 1 6 0 3 QP::QHsm::~QHsm@379-381@..\include\qep.hpp
|
||||
3 1 17 1 3 QP::QHsm::init@410-412@..\include\qep.hpp
|
||||
3 1 12 0 3 QP::QHsm::state@459-461@..\include\qep.hpp
|
||||
3 1 11 0 3 QP::QHsm::getStateHandler@466-468@..\include\qep.hpp
|
||||
4 1 18 1 4 QP::QHsm::tran@498-501@..\include\qep.hpp
|
||||
4 1 18 1 4 QP::QHsm::tran_hist@504-507@..\include\qep.hpp
|
||||
4 1 18 1 4 QP::QHsm::super@510-513@..\include\qep.hpp
|
||||
4 1 30 1 4 QP::QHsm::qm_tran@517-520@..\include\qep.hpp
|
||||
4 1 30 1 4 QP::QHsm::qm_tran_init@524-527@..\include\qep.hpp
|
||||
8 1 42 2 8 QP::QHsm::qm_tran_hist@531-538@..\include\qep.hpp
|
||||
4 1 30 1 4 QP::QHsm::qm_tran_ep@542-545@..\include\qep.hpp
|
||||
8 1 40 2 8 QP::QHsm::qm_tran_xp@549-556@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_entry@561-564@..\include\qep.hpp
|
||||
4 1 22 1 4 QP::QHsm::qm_entry@570-573@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_exit@579-582@..\include\qep.hpp
|
||||
4 1 22 1 4 QP::QHsm::qm_exit@588-591@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_sm_exit@595-598@..\include\qep.hpp
|
||||
4 1 20 1 4 QP::QHsm::qm_super_sub@602-605@..\include\qep.hpp
|
||||
6 1 26 1 6 QP::QMsm::QMsm@691-696@..\include\qep.hpp
|
||||
3 1 20 1 3 QP::QMsm::init@709-711@..\include\qep.hpp
|
||||
3 1 12 0 3 QP::QMsm::stateObj@754-756@..\include\qep.hpp
|
||||
3 1 14 0 3 QP::QMsm::getStateHandler@786-788@..\include\qep.hpp
|
||||
3 1 10 0 3 QP::QEQueue::getNFree@291-293@..\include\qequeue.hpp
|
||||
3 1 10 0 3 QP::QEQueue::getNMin@306-308@..\include\qequeue.hpp
|
||||
3 1 12 0 3 QP::QEQueue::isEmpty@320-322@..\include\qequeue.hpp
|
||||
5 2 24 0 8 QP::QPSet::setEmpty@182-189@..\include\qf.hpp
|
||||
4 3 35 0 7 QP::QPSet::isEmpty@192-198@..\include\qf.hpp
|
||||
4 3 35 0 7 QP::QPSet::notEmpty@201-207@..\include\qf.hpp
|
||||
6 3 97 1 9 QP::QPSet::hasElement@210-218@..\include\qf.hpp
|
||||
11 3 101 1 14 QP::QPSet::insert@221-234@..\include\qf.hpp
|
||||
12 3 117 1 15 QP::QPSet::rmove@241-255@..\include\qf.hpp
|
||||
6 3 45 0 9 QP::QPSet::findMax@258-266@..\include\qf.hpp
|
||||
9 1 51 5 9 QP::QActive::start@435-443@..\include\qf.hpp
|
||||
3 1 18 0 3 QP::QActive::getPrio@668-670@..\include\qf.hpp
|
||||
3 1 23 1 3 QP::QActive::setPrio@673-675@..\include\qf.hpp
|
||||
3 1 9 0 3 QP::QActive::getOsObject@686-688@..\include\qf.hpp
|
||||
3 1 9 0 3 QP::QActive::getThread@695-697@..\include\qf.hpp
|
||||
5 1 20 1 5 QP::QMActive::QMActive@849-853@..\include\qf.hpp
|
||||
3 1 12 0 3 QP::QMActive::stateObj@874-876@..\include\qf.hpp
|
||||
3 1 10 0 3 QP::QTimeEvt::getAct@1070-1072@..\include\qf.hpp
|
||||
3 1 10 0 3 QP::QTimeEvt::getCtr@1075-1077@..\include\qf.hpp
|
||||
3 1 10 0 3 QP::QTimeEvt::getInterval@1080-1082@..\include\qf.hpp
|
||||
3 1 16 0 3 QP::QTimeEvt::toActive@1139-1141@..\include\qf.hpp
|
||||
3 1 16 0 3 QP::QTimeEvt::toTimeEvt@1144-1146@..\include\qf.hpp
|
||||
6 1 23 2 6 QP::QF::psInit@1296-1301@..\include\qf.hpp
|
||||
7 1 34 3 7 QP::QF::publish_@1308-1314@..\include\qf.hpp
|
||||
6 1 26 2 6 QP::QF::tick_@1321-1326@..\include\qf.hpp
|
||||
3 1 16 1 3 QP::QF_EVT_POOL_ID_@113-115@..\include\qf_pkg.hpp
|
||||
3 1 16 1 3 QP::QF_EVT_REF_CTR_@118-120@..\include\qf_pkg.hpp
|
||||
3 1 26 1 3 QP::QF_EVT_REF_CTR_INC_@123-125@..\include\qf_pkg.hpp
|
||||
3 1 26 1 3 QP::QF_EVT_REF_CTR_DEC_@128-130@..\include\qf_pkg.hpp
|
||||
3 1 10 0 3 QP::QMPool::getNMin@266-268@..\include\qmpool.hpp
|
||||
3 1 10 0 3 QP::QMPool::getNFree@278-280@..\include\qmpool.hpp
|
||||
3 1 18 0 3 QP::QSpyId::getPrio@299-301@..\include\qs.hpp
|
||||
7 1 28 1 7 QP::QS::force_cast@377-383@..\include\qs.hpp
|
||||
14 3 70 1 14 QP::QS::rxPut@783-796@..\include\qs.hpp
|
||||
9 1 51 5 9 QP::QActiveDummy::start@1471-1479@..\include\qs.hpp
|
||||
3 1 18 0 3 QP::QSpyId::getPrio@137-139@..\include\qs_dummy.hpp
|
||||
9 1 51 5 9 QP::QXThread::start@313-321@..\include\qxk.hpp
|
||||
2 1 15 2 3 QP::QEvt@104-106@..\src\qf\qep_hsm.cpp
|
||||
4 1 27 1 4 QP::QHsm::QHsm@128-131@..\src\qf\qep_hsm.cpp
|
||||
50 7 303 2 71 QP::QHsm::init@134-204@..\src\qf\qep_hsm.cpp
|
||||
105 15 587 2 158 QP::QHsm::dispatch@207-364@..\src\qf\qep_hsm.cpp
|
||||
8 1 31 2 8 QP::QHsm::top@367-374@..\src\qf\qep_hsm.cpp
|
||||
16 3 85 1 22 QP::QHsm::isIn@377-398@..\src\qf\qep_hsm.cpp
|
||||
20 4 105 1 29 QP::QHsm::childState@401-429@..\src\qf\qep_hsm.cpp
|
||||
95 15 439 2 130 QP::QHsm::hsm_tran@432-561@..\src\qf\qep_hsm.cpp
|
||||
25 3 165 2 38 QP::QMsm::init@82-119@..\src\qf\qep_msm.cpp
|
||||
116 21 658 2 168 QP::QMsm::dispatch@122-289@..\src\qf\qep_msm.cpp
|
||||
13 3 59 1 14 QP::QMsm::isInState@292-305@..\src\qf\qep_msm.cpp
|
||||
19 4 87 1 26 QP::QMsm::childStateObj@308-333@..\src\qf\qep_msm.cpp
|
||||
51 9 294 2 62 QP::QMsm::execTatbl_@336-397@..\src\qf\qep_msm.cpp
|
||||
22 4 107 3 29 QP::QMsm::exitToTranSource_@400-428@..\src\qf\qep_msm.cpp
|
||||
44 6 227 2 55 QP::QMsm::enterHistory_@431-485@..\src\qf\qep_msm.cpp
|
||||
82 13 408 3 118 QP::QActive::post_@80-197@..\src\qf\qf_actq.cpp
|
||||
42 7 237 1 63 QP::QActive::postLIFO@205-267@..\src\qf\qf_actq.cpp
|
||||
34 3 205 0 45 QP::QActive::get_@275-319@..\src\qf\qf_actq.cpp
|
||||
10 2 72 1 11 QP::QF::getQueueMin@329-339@..\src\qf\qf_actq.cpp
|
||||
5 1 30 1 6 QP::QTicker::QTicker@352-357@..\src\qf\qf_actq.cpp
|
||||
8 1 34 2 8 QP::QTicker::init@360-367@..\src\qf\qf_actq.cpp
|
||||
3 1 21 1 3 QP::QTicker::init@370-372@..\src\qf\qf_actq.cpp
|
||||
16 2 81 2 18 QP::QTicker::dispatch@375-392@..\src\qf\qf_actq.cpp
|
||||
30 3 166 3 42 QP::QTicker::post_@395-436@..\src\qf\qf_actq.cpp
|
||||
15 1 79 2 17 QP::QActive::defer@74-90@..\src\qf\qf_defer.cpp
|
||||
32 3 157 1 50 QP::QActive::recall@98-147@..\src\qf\qf_defer.cpp
|
||||
11 2 62 1 11 QP::QActive::flushDeferred@155-165@..\src\qf\qf_defer.cpp
|
||||
18 3 151 3 26 QP::QF::poolInit@74-99@..\src\qf\qf_dyn.cpp
|
||||
41 7 276 3 57 QP::QF::newX_@102-158@..\src\qf\qf_dyn.cpp
|
||||
35 5 248 1 57 QP::QF::gc@161-217@..\src\qf\qf_dyn.cpp
|
||||
3 1 21 0 3 QP::QF::poolGetMaxBlockSize@220-222@..\src\qf\qf_dyn.cpp
|
||||
19 2 104 2 26 QP::QF::newRef_@225-250@..\src\qf\qf_dyn.cpp
|
||||
11 1 68 1 12 QP::QF::deleteRef_@253-264@..\src\qf\qf_dyn.cpp
|
||||
10 3 77 1 12 QP::QF::getPoolMin@267-278@..\src\qf\qf_dyn.cpp
|
||||
9 1 42 0 9 QP::QMPool::QMPool@74-82@..\src\qf\qf_mem.cpp
|
||||
33 5 234 3 55 QP::QMPool::init@85-139@..\src\qf\qf_mem.cpp
|
||||
43 4 208 2 67 QP::QMPool::get@142-208@..\src\qf\qf_mem.cpp
|
||||
20 2 107 2 26 QP::QMPool::put@211-236@..\src\qf\qf_mem.cpp
|
||||
3 1 12 0 3 QP::QMPool::getBlockSize@239-241@..\src\qf\qf_mem.cpp
|
||||
9 1 44 2 9 QP::QActive::psInit@86-94@..\src\qf\qf_ps.cpp
|
||||
40 5 226 3 67 QP::QActive::publish_@102-168@..\src\qf\qf_ps.cpp
|
||||
16 5 108 1 20 QP::QActive::subscribe@176-195@..\src\qf\qf_ps.cpp
|
||||
16 5 108 1 23 QP::QActive::unsubscribe@203-225@..\src\qf\qf_ps.cpp
|
||||
19 5 127 0 25 QP::QActive::unsubscribeAll@233-257@..\src\qf\qf_ps.cpp
|
||||
10 2 59 2 10 QP::QF::bzero@99-108@..\src\qf\qf_qact.cpp
|
||||
8 4 60 1 16 QP::QActive::QActive@119-134@..\src\qf\qf_qact.cpp
|
||||
9 3 66 0 10 QP::QActive::register_@142-151@..\src\qf\qf_qact.cpp
|
||||
10 3 72 0 11 QP::QActive::unregister_@159-169@..\src\qf\qf_qact.cpp
|
||||
24 6 158 1 29 QP::QPSet::QF_LOG2@180-208@..\src\qf\qf_qact.cpp
|
||||
9 1 43 0 9 QP::QEQueue::QEQueue@74-82@..\src\qf\qf_qeq.cpp
|
||||
14 2 74 2 14 QP::QEQueue::init@85-98@..\src\qf\qf_qeq.cpp
|
||||
57 8 277 3 76 QP::QEQueue::post@101-176@..\src\qf\qf_qeq.cpp
|
||||
36 5 174 2 46 QP::QEQueue::postLIFO@179-224@..\src\qf\qf_qeq.cpp
|
||||
36 4 190 1 46 QP::QEQueue::get@227-272@..\src\qf\qf_qeq.cpp
|
||||
7 1 41 2 7 QP::QMActive::init@81-87@..\src\qf\qf_qmact.cpp
|
||||
4 1 33 1 4 QP::QMActive::init@90-93@..\src\qf\qf_qmact.cpp
|
||||
6 1 32 2 6 QP::QMActive::dispatch@96-101@..\src\qf\qf_qmact.cpp
|
||||
3 1 27 1 3 QP::QMActive::isInState@104-106@..\src\qf\qf_qmact.cpp
|
||||
4 1 27 1 4 QP::QMActive::childStateObj@109-112@..\src\qf\qf_qmact.cpp
|
||||
3 1 20 0 3 QP::QMActive::getStateHandler@116-118@..\src\qf\qf_qmact.cpp
|
||||
18 2 101 3 34 QP::QTimeEvt::QTimeEvt@75-108@..\src\qf\qf_time.cpp
|
||||
34 8 217 2 58 QP::QTimeEvt::armX@111-168@..\src\qf\qf_time.cpp
|
||||
32 3 169 0 41 QP::QTimeEvt::disarm@171-211@..\src\qf\qf_time.cpp
|
||||
33 8 217 1 58 QP::QTimeEvt::rearm@214-271@..\src\qf\qf_time.cpp
|
||||
5 1 37 0 6 QP::QTimeEvt::wasDisarmed@274-279@..\src\qf\qf_time.cpp
|
||||
72 7 396 2 112 QP::QTimeEvt::tick_@282-393@..\src\qf\qf_time.cpp
|
||||
14 3 70 1 16 QP::QTimeEvt::noActive@396-411@..\src\qf\qf_time.cpp
|
||||
13 1 50 0 27 QP::QTimeEvt::QTimeEvt@414-440@..\src\qf\qf_time.cpp
|
||||
21 2 134 1 32 QP::QK::schedLock@79-110@..\src\qk\qk.cpp
|
||||
22 4 145 1 33 QP::QK::schedUnlock@113-145@..\src\qk\qk.cpp
|
||||
12 2 101 0 17 QP::QF::init@155-171@..\src\qk\qk.cpp
|
||||
3 1 9 0 4 QP::QF::stop@174-177@..\src\qk\qk.cpp
|
||||
15 4 62 0 25 QP::QF::run@180-204@..\src\qk\qk.cpp
|
||||
24 5 138 6 34 QP::QActive::start@215-248@..\src\qk\qk.cpp
|
||||
14 3 95 0 17 QK_sched_@261-277@..\src\qk\qk.cpp
|
||||
59 15 400 0 103 QK_activate_@280-382@..\src\qk\qk.cpp
|
||||
9 2 78 0 13 QP::QF::init@86-98@..\src\qv\qv.cpp
|
||||
3 1 9 0 4 QP::QF::stop@101-104@..\src\qv\qv.cpp
|
||||
38 9 197 0 74 QP::QF::run@107-180@..\src\qv\qv.cpp
|
||||
18 3 108 6 25 QP::QActive::start@191-215@..\src\qv\qv.cpp
|
||||
23 3 146 1 33 QP::QXK::schedLock@80-112@..\src\qxk\qxk.cpp
|
||||
23 4 150 1 36 QP::QXK::schedUnlock@115-150@..\src\qxk\qxk.cpp
|
||||
14 2 134 0 22 QP::QF::init@160-181@..\src\qxk\qxk.cpp
|
||||
3 1 9 0 4 QP::QF::stop@184-187@..\src\qxk\qxk.cpp
|
||||
15 4 62 0 26 QP::QF::run@190-215@..\src\qxk\qxk.cpp
|
||||
26 6 155 6 35 QP::QActive::start@226-260@..\src\qxk\qxk.cpp
|
||||
48 7 282 0 67 QXK_sched_@273-339@..\src\qxk\qxk.cpp
|
||||
76 16 516 0 132 QXK_activate_@342-473@..\src\qxk\qxk.cpp
|
||||
12 2 69 0 18 QXK_current@476-493@..\src\qxk\qxk.cpp
|
||||
14 2 110 0 23 QXK_threadExit_@496-518@..\src\qxk\qxk.cpp
|
||||
16 4 108 1 24 QP::QXMutex::init@79-102@..\src\qxk\qxk_mutex.cpp
|
||||
66 12 479 1 109 QP::QXMutex::lock@105-213@..\src\qxk\qxk_mutex.cpp
|
||||
45 10 287 0 69 QP::QXMutex::tryLock@216-284@..\src\qxk\qxk_mutex.cpp
|
||||
66 16 461 0 113 QP::QXMutex::unlock@287-399@..\src\qxk\qxk_mutex.cpp
|
||||
9 1 58 2 11 QP::QXSemaphore::init@79-89@..\src\qxk\qxk_sema.cpp
|
||||
44 7 294 1 70 QP::QXSemaphore::wait@92-161@..\src\qxk\qxk_sema.cpp
|
||||
15 2 59 0 20 QP::QXSemaphore::tryWait@164-183@..\src\qxk\qxk_sema.cpp
|
||||
28 6 179 0 46 QP::QXSemaphore::signal@186-231@..\src\qxk\qxk_sema.cpp
|
||||
9 1 56 2 9 QP::QXThread::QXThread@82-90@..\src\qxk\qxk_xthr.cpp
|
||||
21 4 177 1 36 QP::QXThread::delay@93-128@..\src\qxk\qxk_xthr.cpp
|
||||
14 2 57 0 16 QP::QXThread::delayCancel@131-146@..\src\qxk\qxk_xthr.cpp
|
||||
58 7 429 1 86 QP::QXThread::queueGet@149-234@..\src\qxk\qxk_xthr.cpp
|
||||
8 1 33 2 8 QP::QXThread::init@237-244@..\src\qxk\qxk_xthr.cpp
|
||||
4 1 22 1 4 QP::QXThread::init@247-250@..\src\qxk\qxk_xthr.cpp
|
||||
8 1 33 2 8 QP::QXThread::dispatch@253-260@..\src\qxk\qxk_xthr.cpp
|
||||
28 6 185 6 47 QP::QXThread::start@263-309@..\src\qxk\qxk_xthr.cpp
|
||||
96 13 478 3 129 QP::QXThread::post_@312-440@..\src\qxk\qxk_xthr.cpp
|
||||
4 1 23 1 4 QP::QXThread::postLIFO@443-446@..\src\qxk\qxk_xthr.cpp
|
||||
5 1 49 0 6 QP::QXThread::block_@449-454@..\src\qxk\qxk_xthr.cpp
|
||||
8 3 58 0 9 QP::QXThread::unblock_@457-465@..\src\qxk\qxk_xthr.cpp
|
||||
22 3 153 2 40 QP::QXThread::teArm_@468-507@..\src\qxk\qxk_xthr.cpp
|
||||
11 2 41 0 14 QP::QXThread::teDisarm_@510-523@..\src\qxk\qxk_xthr.cpp
|
||||
34 file analyzed.
|
||||
==============================================================
|
||||
NLOC Avg.NLOC AvgCCN Avg.token function_cnt file
|
||||
--------------------------------------------------------------
|
||||
4 0.0 0.0 0.0 0 ..\include\qassert.h
|
||||
227 4.0 1.0 21.1 21 ..\include\qep.hpp
|
||||
40 3.0 1.0 11.7 3 ..\include\qequeue.hpp
|
||||
194 2.9 1.0 18.8 9 ..\include\qf.hpp
|
||||
32 3.0 1.0 10.0 1 ..\include\qk.hpp
|
||||
37 3.0 1.0 11.0 1 ..\include\qmpool.hpp
|
||||
7 0.0 0.0 0.0 0 ..\include\qassert.h
|
||||
234 4.1 1.0 20.6 25 ..\include\qep.hpp
|
||||
45 3.0 1.0 10.7 3 ..\include\qequeue.hpp
|
||||
311 5.0 1.6 33.7 22 ..\include\qf.hpp
|
||||
30 3.0 1.0 21.0 4 ..\include\qf_pkg.hpp
|
||||
24 0.0 0.0 0.0 0 ..\include\qk.hpp
|
||||
49 3.0 1.0 10.0 2 ..\include\qmpool.hpp
|
||||
5 0.0 0.0 0.0 0 ..\include\qpcpp.hpp
|
||||
76 4.6 1.4 37.4 14 ..\include\qpset.hpp
|
||||
308 7.5 1.5 42.0 4 ..\include\qs.hpp
|
||||
375 8.2 1.5 41.8 4 ..\include\qs.hpp
|
||||
5 0.0 0.0 0.0 0 ..\include\qstamp.cpp
|
||||
4 0.0 0.0 0.0 0 ..\include\qstamp.hpp
|
||||
21 3.0 1.0 19.0 1 ..\include\qs_dummy.hpp
|
||||
25 3.0 1.0 18.0 1 ..\include\qs_dummy.hpp
|
||||
25 0.0 0.0 0.0 0 ..\include\qs_pkg.hpp
|
||||
9 0.0 0.0 0.0 0 ..\include\quit.hpp
|
||||
12 0.0 0.0 0.0 0 ..\include\qv.hpp
|
||||
32 0.0 0.0 0.0 0 ..\include\qxk.hpp
|
||||
66 4.5 1.0 35.5 2 ..\include\qxthread.hpp
|
||||
317 29.6 4.9 168.2 10 ..\src\qf\qep_hsm.cpp
|
||||
313 29.6 5.3 169.3 10 ..\src\qf\qep_msm.cpp
|
||||
64 12.5 3.5 92.0 4 ..\src\qf\qf_act.cpp
|
||||
241 22.5 3.4 127.2 10 ..\src\qf\qf_actq.cpp
|
||||
66 18.3 2.0 99.3 3 ..\src\qf\qf_defer.cpp
|
||||
135 20.3 3.2 140.2 6 ..\src\qf\qf_dyn.cpp
|
||||
120 21.8 3.0 133.8 5 ..\src\qf\qf_mem.cpp
|
||||
109 48.5 9.0 314.5 2 ..\src\qf\qf_ps.cpp
|
||||
10 7.0 3.0 47.0 1 ..\src\qf\qf_qact.cpp
|
||||
160 29.8 4.0 153.6 5 ..\src\qf\qf_qeq.cpp
|
||||
36 4.3 1.0 28.9 7 ..\src\qf\qf_qmact.cpp
|
||||
236 24.7 3.8 143.9 9 ..\src\qf\qf_time.cpp
|
||||
184 18.8 4.1 120.7 9 ..\src\qk\qk.cpp
|
||||
79 16.2 3.8 98.2 4 ..\src\qv\qv.cpp
|
||||
258 21.7 4.3 137.6 11 ..\src\qxk\qxk.cpp
|
||||
203 48.0 10.5 333.8 4 ..\src\qxk\qxk_mutex.cpp
|
||||
105 23.5 4.0 147.5 4 ..\src\qxk\qxk_sema.cpp
|
||||
312 21.1 3.4 135.3 14 ..\src\qxk\qxk_xthr.cpp
|
||||
24 3.0 1.0 23.5 4 ..\src\qf_pkg.hpp
|
||||
26 0.0 0.0 0.0 0 ..\src\qs_pkg.hpp
|
||||
13 0.0 0.0 0.0 0 ..\src\qxk_pkg.hpp
|
||||
8 0.0 0.0 0.0 0 ..\include\qv.hpp
|
||||
121 9.0 1.0 51.0 1 ..\include\qxk.hpp
|
||||
321 37.5 5.9 199.0 8 ..\src\qf\qep_hsm.cpp
|
||||
307 41.4 7.1 228.1 7 ..\src\qf\qep_msm.cpp
|
||||
2 0.0 0.0 0.0 0 ..\src\qf\qf_act.cpp
|
||||
251 25.6 3.7 139.3 9 ..\src\qf\qf_actq.cpp
|
||||
73 19.3 2.0 99.3 3 ..\src\qf\qf_defer.cpp
|
||||
150 19.6 3.1 135.0 7 ..\src\qf\qf_dyn.cpp
|
||||
119 21.6 2.6 120.6 5 ..\src\qf\qf_mem.cpp
|
||||
125 20.0 4.2 122.6 5 ..\src\qf\qf_ps.cpp
|
||||
93 12.2 3.6 83.0 5 ..\src\qf\qf_qact.cpp
|
||||
163 30.4 4.0 151.6 5 ..\src\qf\qf_qeq.cpp
|
||||
33 4.5 1.0 30.0 6 ..\src\qf\qf_qmact.cpp
|
||||
233 27.6 4.1 157.1 8 ..\src\qf\qf_time.cpp
|
||||
192 21.2 4.5 135.5 8 ..\src\qk\qk.cpp
|
||||
87 17.0 3.8 98.0 4 ..\src\qv\qv.cpp
|
||||
276 25.4 4.7 163.3 10 ..\src\qxk\qxk.cpp
|
||||
204 48.2 10.5 333.8 4 ..\src\qxk\qxk_mutex.cpp
|
||||
107 24.0 4.0 147.5 4 ..\src\qxk\qxk_sema.cpp
|
||||
308 21.1 3.3 128.1 14 ..\src\qxk\qxk_xthr.cpp
|
||||
|
||||
=========================================================================================================
|
||||
!!!! Warnings (cyclomatic_complexity > 20 or length > 500 or nloc > 1000000 or parameter_count > 10) !!!!
|
||||
================================================
|
||||
NLOC CCN token PARAM length location
|
||||
------------------------------------------------
|
||||
113 21 661 2 166 QP::QMsm::dispatch@154-319@..\src\qf\qep_msm.cpp
|
||||
116 21 658 2 168 QP::QMsm::dispatch@122-289@..\src\qf\qep_msm.cpp
|
||||
==========================================================================================
|
||||
Total nloc Avg.NLOC AvgCCN Avg.token Fun Cnt Warning cnt Fun Rt nloc Rt
|
||||
------------------------------------------------------------------------------------------
|
||||
4083 16.6 3.1 101.8 178 1 0.01 0.04
|
||||
4321 17.5 3.1 103.3 174 1 0.01 0.04
|
||||
@endcode
|
||||
*/
|
||||
|
@ -290,3 +290,20 @@ void lib_fun(uint32_t x) {
|
||||
- QXK_TLS()
|
||||
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir include
|
||||
* @brief QP/C++ include directory (needs to be added to the compiler
|
||||
* include path to build QP/C++ applications)
|
||||
*
|
||||
* @note
|
||||
* All files in this directory have been generated from the QM model
|
||||
* located in the `qpcpp.qm` model file.
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @dir src
|
||||
* @brief QP/C++ source directory (platform-independent code).
|
||||
*
|
||||
* @note
|
||||
* All files in this directory have been generated from the QM model
|
||||
* located in the `qpcpp.qm` model file.
|
||||
*/
|
@ -1,12 +1,11 @@
|
||||
/*! @page ports Ports
|
||||
@tableofcontents
|
||||
|
||||
@section ports_gen General Comments
|
||||
The QP/C++ framework can be easily adapted to various operating systems, processor architectures, and compilers. Adapting the QP/C++ software is called porting and the QP/C++ framework has been designed from the ground up to make porting easy.
|
||||
|
||||
The QP/C++ distribution contains many QP/C++ ports, which are organized into the three categories:
|
||||
|
||||
- @subpage ports_lint (generic C compiler) QP/C++ "port" to the PC-Lint Plus static analysis tool (a "compiler")
|
||||
- @subpage ports_lint (generic C compiler) QP/C++ "port" to the PC-Lint-Plus static analysis tool (a "compiler")
|
||||
|
||||
- @subpage ports_native "Native Ports" adapt QP/C++ to run on bare-metal processors "natively", using one of the built-in kernels (@ref qv "QV", @ref qk "QK", or @ref qxk "QXK")
|
||||
|
||||
@ -51,7 +50,7 @@ All ports are located in sub-directories of the <span class="img folder">ports</
|
||||
<li><span class="img folder">ti</span> — Port to TI/CCS toolset
|
||||
</li>
|
||||
</ul>
|
||||
<li><span class="img folder">qxk/</span> — Port to the @ref qxk "blocing QXK kernel"
|
||||
<li><span class="img folder">qxk/</span> — Port to the @ref qxk "blocking QXK kernel"
|
||||
</li>
|
||||
<ul class="tag">
|
||||
<li><span class="img folder">arm</span> — Port to ARM-KEIL toolset
|
||||
@ -124,7 +123,6 @@ Because the QP distribution contains *all* ports, the number of sub-directories
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page ports_lint PC-Lint-Plus
|
||||
@tableofcontents
|
||||
|
||||
![PC-Lint Plus](logo_pclintplus.jpg)
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm ARM Cortex-M
|
||||
@tableofcontents
|
||||
|
||||
This section describes the QP™ ports to the ARM Cortex-M processor family (Cortex M0/M0+/M3/M4/M7/M33). Three main implementation options are covered: the @subpage arm-cm_qv "cooperative, priority-based QV kernel", the @subpage arm-cm_qk "preemptive, run-to-completion QK kernel", and the @subpage arm-cm_qxk "preemptive, dual-mode blocking QXK kernel". Additionally, the use of the VFP (floating point coprocessor) in the M4F/M7/M33 CPUs is explained as well. This document assumes QP version 7.x or higher.
|
||||
|
||||
@ -205,7 +204,6 @@ All built-in kernels in QP are designed to take advantage of the lazy stacking f
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_qv Cooperative QV Kernel
|
||||
@tableofcontents
|
||||
|
||||
The non-preemptive, cooperative QV kernel executes active objects one at a time, with priority-based scheduling performed after run-to-completion (RTC) processing of each event. Due to naturally short duration of event processing in state machines, the simple QV kernel is often adequate for many real-time systems. (NOTE: Long RTC steps can be often broken into shorter pieces by means of the "Reminder" state pattern [@ref Reminder])
|
||||
|
||||
@ -636,8 +634,6 @@ When a sleep mode is not used, the QV_onIdle() callback simply re-enables interr
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_qk Preemptive Non-Blocking QK Kernel
|
||||
|
||||
@tableofcontents
|
||||
|
||||
<p>The @ref qk "preemptive, non-blocking QK kernel" is specifically designed to execute non-blocking active objects. QK runs active objects in the same way as prioritized interrupt controller (such as NVIC in ARM Cortex-M) runs interrupts using the **single stack** (MSP on Cortex-M). This section explains how the @ref qk "preemptive non-blocking QK kernel" works on ARM Cortex-M.
|
||||
</p>
|
||||
|
||||
@ -1353,7 +1349,6 @@ In yet another test you could post an event to Philosopher active object rather
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cm_qxk Preemptive "Dual-Mode" QXK Kernel
|
||||
@tableofcontents
|
||||
|
||||
This section describes how to use QP on ARM Cortex-M with the @ref qxk "preemptive, dual-mode QXK real-time kernel", which combines the lightweight non-blocking @ref qxk_basic "basic threads" of QK with traditional blocking @ref qxk_extended "extended threads" found in conventional RTOS kernels. QXK provides all typical services of a conventional blocking RTOS, such as blocking time-delays, semaphores, mutextes, and message queues.
|
||||
|
||||
|
@ -8,9 +8,6 @@
|
||||
- @subpage arm-cr (Cortex-R)
|
||||
- @ref arm-cr_qv (GNU-ARM, IAR-ARM, TI-CCS toolchains)
|
||||
- @ref arm-cr_qk (GNU-ARM, IAR-ARM, TI-CCS toolchains)
|
||||
- @subpage arm7-9 ("classic" ARM)
|
||||
- @ref arm7-9_qv (GNU-ARM, IAR-ARM toolchains)
|
||||
- @ref arm7-9_qk (GNU-ARM, IAR-ARM toolchains)
|
||||
- @subpage msp430 ("classic" MSP430 and "extended" MSP430X)
|
||||
- @ref msp430_qv (TI-CCS, IAR toolchains)
|
||||
- @ref msp430_qk (TI-CCS, IAR toolchains)
|
||||
@ -25,16 +22,6 @@ The QP/C/C++ ports and examples for ARM Cortex-R are described in the Quantum Le
|
||||
[![QP and ARM Cortex-R](img/AN.jpg)](https://www.state-machine.com/doc/AN_QP_and_ARM-Cortex-R.pdf)
|
||||
@caption{[Application Note: "QP and ARM Cortex-R"](https://www.state-machine.com/doc/AN_QP_and_ARM-Cortex-R.pdf)}
|
||||
|
||||
@next{arm7-9}
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page arm7-9 ARM7/ARM9
|
||||
|
||||
The QP/C/C++ ports and examples for ARM7/ARM9 are described in the Quantum Leaps Application Note @webref{doc/AN_QP_and_ARM-Cortex-R.pdf, QP and ARM7/ARM9}.
|
||||
|
||||
[![QP and ARM Cortex-R](img/AN.jpg)](https://www.state-machine.com/doc/AN_QP_and_ARM7_ARM9-GNU.pdf)
|
||||
@caption{[Application Note: "QP and ARM7/ARM9"](https://www.state-machine.com/doc/AN_QP_and_ARM7_ARM9-GNU.pdf)}
|
||||
|
||||
@next{msp430}
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
|
@ -11,7 +11,7 @@ Another reason you might be interested in running QP/C++ on top of a conventiona
|
||||
You do **not** need to use a traditional RTOS just to achieve preemptive multitasking with QP. The @ref comp_qk "preemptive QK kernel", available as part of the QP package, supports preemptive priority-based multitasking and is fully compatible with Rate Monotonic Scheduling to achieve guaranteed, hard real-time performance. The preemptive, run-to-completion QK kernel perfectly matches the run-to-completion execution semantics of active objects, yet it is simpler, faster, and more efficient than any traditional blocking kernel.
|
||||
|
||||
@attention
|
||||
QP/C++ 6.x includes a small, preemptive, priority-based, @ref qxk "dual-mode blocking QXK kernel" that executes active objects like the QK kernel (@ref qxk_basic "basic threads"), but can also execute traditional blocking threads (@ref qxk_extended "extended threads"). In this respect, QXK behaves exactly like a conventional RTOS. The QXK kernel is recommended as the preferred RTOS kernel for applications that need to mix active objects with traditional blocking code. Due to the tight and optimal integration between QXK and the rest of QP, QXK offers better performance and smaller memory footprint than any @ref ports_rtos "QP port to a 3rd-party RTOS". Additionally, QXK is already included in QP, so you avoid additional licensing costs of 3rd-party kernels.
|
||||
QP/C++ 6.x includes a small, preemptive, priority-based, @ref srs_qxk "dual-mode blocking QXK kernel" that executes active objects like the QK kernel (@ref srs_qxk_basic "basic threads"), but can also execute traditional blocking threads (@ref srs_qxk_extended "extended threads"). In this respect, QXK behaves exactly like a conventional RTOS. The QXK kernel is recommended as the preferred RTOS kernel for applications that need to mix active objects with traditional blocking code. Due to the tight and optimal integration between QXK and the rest of QP, QXK offers better performance and smaller memory footprint than any @ref ports_rtos "QP port to a 3rd-party RTOS". Additionally, QXK is already included in QP, so you avoid additional licensing costs of 3rd-party kernels.
|
||||
|
||||
|
||||
The QP/C++ framework can work with virtually any traditional real-time operating
|
||||
@ -21,6 +21,7 @@ system (RTOS). The currently supported 3rd-party RTOS kernels are:
|
||||
- @subpage freertos
|
||||
- @subpage threadx
|
||||
- @subpage uc-os2
|
||||
- @subpage zephyr
|
||||
- <a href="https://www.erika-enterprise.com" target="_blank" class="extern">OSEK/VDX RTOS ERIKA Enterprise</a>
|
||||
|
||||
Combined with a conventional RTOS, QP/C++ takes full advantage of the multitasking capabilities of the RTOS by executing each active object in a separate RTOS task. The QP/C++ Platform Abstraction Layer (PAL) includes an abstract RTOS interface to enable integration between QP/C++ and the underlying RTOS. Specifically, the PAL allows adapting most message queue variants as event queues of active objects as well as most memory partitions as QP/C++ event pools.
|
||||
@ -43,7 +44,6 @@ The QP/C/C++ ports and examples for embOS are described in the Quantum Leaps App
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page freertos FreeRTOS
|
||||
@tableofcontents
|
||||
|
||||
![FreeRTOS](logo_freertos.png)
|
||||
|
||||
@ -54,7 +54,7 @@ The QP-FreeRTOS port works as follows:
|
||||
|
||||
- The QP port uses the [static memory allocation of FreeRTOS](https://freertos.org/Static_Vs_Dynamic_Memory_Allocation.html). This requires the FreeRTOS configuration to define the [configSUPPORT_STATIC_ALLOCATION](https://freertos.org/a00110.html#configSUPPORT_STATIC_ALLOCATION)
|
||||
|
||||
- Each QP active object executes in a separate FreeRTOS task and requires a private stack space.
|
||||
- Each QP active object executes in a separate FreeRTOS task (`StaticTask_t`) and requires a private stack space.
|
||||
|
||||
- The task-level critical section used in QF and QS is based on the FreeRTOS APIs `taskENTER_CRITICAL()`/`taskEXIT_CRITICAL()`.
|
||||
|
||||
@ -66,17 +66,15 @@ The QP-FreeRTOS port works as follows:
|
||||
The design of FreeRTOS requires the use of special "FromISR" API inside ISRs, which imposes the requirement to also provide the "FromISR" variants of the QP APIs, such as `QACTIVE_POST_FROM_ISR()`, `QF_PUBLISH_FROM_ISR()`, etc. These "FromISR" QP APIs must be used inside ISRs instead of the task-level APIs (`QACTIVE_POST()`, `QF_PUBLISH()`, etc.) and conversely, they cannot be used inside tasks and active objects. Unfortunately, FreeRTOS provides no generic way to enforce the proper API use via assertions.
|
||||
|
||||
|
||||
- The QP port uses the native event queue (QP::QEQueue) for active object event queues and internally calls the FreeRTOS API `xTaskNotifyGive()` to notify an active object when an event is posted to its event queue.
|
||||
- The QP port uses the FreeRTOS message queue (`StaticQueue_t`) for active object event queues.
|
||||
|
||||
- The QP port internally calls the FreeRTOS API `ulTaskNotifyTake(pdTRUE, portMAX_DELAY)` to block an active object task when it waits for posting an event.
|
||||
|
||||
- The QP port uses the native QF memory pool (QP::QMPool) to implement event pools.
|
||||
- The QP port uses the native QF memory pool (::QMPool) to implement event pools.
|
||||
|
||||
- The QP port does not mandate any specific method to manage the QP time events, but the provided examples use the FreeRTOS "hook" `vApplicationTickHook()` to periodically invoke the QP clock tick QF_TICK_X_FROM_ISR(). (NOTE: the `vApplicationTickHook()` executes in the ISR context and therefore mandates the use of the "FromISR" APIs).
|
||||
|
||||
|
||||
@section freertos_examples Example Code
|
||||
The QP port to FreeRTOS comes with examples located in the directory `qpcpp/examples/freertos/`. Currently, the examples are provided for the following boards and development toolchains:
|
||||
The QP port to FreeRTOS comes with examples located in the directory `qpcpp/examples/freertos`. Currently, the examples are provided for the following boards and development toolchains:
|
||||
|
||||
- EK-TM4C123GXL (ARM Cortex-M4F), ARM-KEIL, GNU-ARM, IAR-ARM
|
||||
- STM32F746G-Discovery (ARM Cortex-M7), ARM-KEIL, GNU-ARM, IAR-ARM
|
||||
@ -128,13 +126,13 @@ void UART0_IRQHandler(void) {
|
||||
@subsection freertos_hook Writing FreeRTOS Hooks Running in ISR Context
|
||||
FreeRTOS provides "hooks" that are user functions that execute in the ISR context (e.g., `vApplicationTickHook()`). Such ISR-level functions are closely related to ISRs and should also use exclusively only the "FromISR" APIs. Here is an example of the `vApplicationTickHook()`:
|
||||
|
||||
@code{cpp}
|
||||
@code{.cpp}
|
||||
// NOTE: only the "FromISR" API variants are allowed in vApplicationTickHook
|
||||
void vApplicationTickHook(void) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
|
||||
// process time events for rate 0
|
||||
QP::QF::TICK_X_FROM_ISR(0U, &xHigherPriorityTaskWoken, &l_TickHook);
|
||||
QP::QTimeEvt::TICK_X_FROM_ISR(0U, &xHigherPriorityTaskWoken, &l_TickHook);
|
||||
. . .
|
||||
// notify FreeRTOS to perform context switch from ISR, if needed
|
||||
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
|
||||
@ -244,6 +242,82 @@ The QP/C/C++ ports and examples for uC-OS2 are described in the Quantum Leaps Ap
|
||||
[![QP and uC-OS2](img/AN.jpg)](https://www.state-machine.com/doc/AN_RTOS-uCOS2.pdf)
|
||||
@caption{[Application Note: QP and uC-OS2](https://www.state-machine.com/doc/AN_RTOS-uCOS2.pdf)}
|
||||
|
||||
@next{zephyr}
|
||||
*/
|
||||
|
||||
/*##########################################################################*/
|
||||
/*! @page zephyr Zephyr
|
||||
|
||||
![Zephyr Project](logo_zephyr.jpg)
|
||||
|
||||
@section zephyr_about About the QP Port to Zephyr
|
||||
This directory contains a generic platform-independent QP/C++ port to the [Zephyr RTOS](https://zephyrproject.org).
|
||||
|
||||
Typically, you should not need to change the files in this directory to adapt the QP-Zephyr port on any CPU/Compiler to which Zephyr has been ported, because all the CPU and compiler specifics are handled by the Zephyr RTOS.
|
||||
|
||||
|
||||
The QP-Zephyr port works as follows:
|
||||
|
||||
- The critical section used in this port is based on `k_spin_lock()/k_spin_unlock()` Zephyr API. This is the modern Zephyr critical section API, which is ready for SMP (symmetric multiprocessing).
|
||||
|
||||
- Each QP active object executes in a separate Zephyr thread (`struct k_thread`) and requires a private stack space.
|
||||
|
||||
@note
|
||||
As demonstrated in the @ref exa_zephyr "provided examples", the private stacks for active objects in this port must be allocated with the Zephyr `K_THREAD_STACK_DEFINE()` macro. Also, the stack size passed to QACTIVE_START() must be calculated with the Zephyr `K_THREAD_STACK_SIZEOF()` macro. Failure to use these macros can lead to memory corruption in the application.
|
||||
|
||||
|
||||
- The active object event queue is implemented with the Zephyr message queue (`struct k_msgq`).
|
||||
|
||||
@note
|
||||
The Zephyr message queue currently supports only the FIFO policy and does NOT support the LIFO policy. For that reason, the QActive_postLIFO_() implementation in this port uses the FIFO policy. A feature request has been filed in the Zephyr project for adding the LIFO policy, so perhaps this can be improved, if the feature is added.
|
||||
|
||||
|
||||
- The QP port uses Zephyr scheduler locking (`k_sched_lock()/k_sched_unlock()`), which locks all threads indiscriminately. Currently Zephyr does not provide a selective scheduler locking.
|
||||
|
||||
- The QP port uses the native QF memory pool (::QMPool) to implement event pools.
|
||||
|
||||
- The QP port does not mandate any specific method to manage the QP time events, but the provided examples use the Zephyr timer (`struct k_timer`) to tick periodically and invoke QP::QTimeEvt::TICK_X().
|
||||
|
||||
|
||||
@subsection zephyr_build QP Source Files Needed in this QP Port
|
||||
It is important to note that **NOT** all QP source files should be included. Here is the list of QP source files needed:
|
||||
|
||||
@verbatim
|
||||
qpcpp/
|
||||
+-src/
|
||||
| | +-qf/
|
||||
| | | +-qep_hsm.cpp
|
||||
| | | +-qep_msm.cpp
|
||||
| | | +-qf_act.cpp
|
||||
| | | +-qf_actq.cpp - NOT included (implemented in Zephyr)
|
||||
| | | +-qf_defer.cpp
|
||||
| | | +-qf_dyn.cpp
|
||||
| | | +-qf_mem.cpp
|
||||
| | | +-qf_ps.cpp
|
||||
| | | +-qf_qeq.cpp
|
||||
| | | +-qf_qmact.cpp
|
||||
| | | +-qf_time.cpp
|
||||
| |
|
||||
| | +-qs/
|
||||
| | | +-qs.cpp - included only in the Spy build configuration
|
||||
| | | +-qs_fp.cpp - included only in the Spy build configuration
|
||||
|
|
||||
+-ports
|
||||
| +-zephyr
|
||||
| | +-qep_port.hpp
|
||||
| | +-qf_port.hpp
|
||||
| | +-qf_port.cpp - implementation of the Zephyr port
|
||||
| | +-qs_port.hpp
|
||||
|
|
||||
@endverbatim
|
||||
|
||||
@note
|
||||
Specifically, the QP source files qf_actq.cpp must **NOT** be included in the build, because this functionality is taken from Zephyr.
|
||||
|
||||
|
||||
@section zephyr_exa Examples for the Zephyr port
|
||||
The example projects for this port are located in @ref exa_zephyr "examples/zephyr".
|
||||
|
||||
@next{ports_os}
|
||||
*/
|
||||
|
||||
|
@ -1,45 +1,45 @@
|
||||
@echo off
|
||||
:: ==========================================================================
|
||||
:: Product: QP/C script for running MSquared Resource Standard Metrics (RSM)
|
||||
:: Last Updated for Version: 5.2.0
|
||||
:: Date of the Last Update: Dec 20, 2013
|
||||
::
|
||||
:: 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 <http://www.gnu.org/licenses/>.
|
||||
::
|
||||
:: Contact information:
|
||||
:: Quantum Leaps Web sites: http://www.quantum-leaps.com
|
||||
:: https://state-machine.com
|
||||
:: e-mail: info@quantum-leaps.com
|
||||
:: ==========================================================================
|
||||
setlocal
|
||||
|
||||
set RCMHOME="C:\tools\MSquared\M2 RSM"
|
||||
|
||||
set RSM_OUTPUT=qpc_metrics.txt
|
||||
set RSM_INPUT=..\include\*.h ..\qep\source\*.h ..\qep\source\*.c ..\qf\source\*.h ..\qf\source\*.c ..\qk\source\*.h ..\qk\source\*.c ..\qs\source\*.h ..\qs\source\*.c
|
||||
|
||||
%RCMHOME%\rsm.exe -fd -n -xNOCOMMAND -xNOCONFIG -u"File cfg rsm_qpc.cfg" %RSM_INPUT% > %RSM_OUTPUT%
|
||||
|
||||
endlocal
|
||||
@echo off
|
||||
:: ==========================================================================
|
||||
:: Product: QP/C script for running MSquared Resource Standard Metrics (RSM)
|
||||
:: Last Updated for Version: 5.2.0
|
||||
:: Date of the Last Update: Dec 20, 2013
|
||||
::
|
||||
:: 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 <http://www.gnu.org/licenses/>.
|
||||
::
|
||||
:: Contact information:
|
||||
:: Quantum Leaps Web sites: http://www.quantum-leaps.com
|
||||
:: https://state-machine.com
|
||||
:: e-mail: info@quantum-leaps.com
|
||||
:: ==========================================================================
|
||||
setlocal
|
||||
|
||||
set RCMHOME="C:\tools\MSquared\M2 RSM"
|
||||
|
||||
set RSM_OUTPUT=qpc_metrics.txt
|
||||
set RSM_INPUT=..\include\*.h ..\qep\source\*.h ..\qep\source\*.c ..\qf\source\*.h ..\qf\source\*.c ..\qk\source\*.h ..\qk\source\*.c ..\qs\source\*.h ..\qs\source\*.c
|
||||
|
||||
%RCMHOME%\rsm.exe -fd -n -xNOCOMMAND -xNOCONFIG -u"File cfg rsm_qpc.cfg" %RSM_INPUT% > %RSM_OUTPUT%
|
||||
|
||||
endlocal
|
||||
|
@ -1,7 +1,7 @@
|
||||
# ==========================================================================
|
||||
# Product: QP/C++ Configuration for MSquared Resource Standard Metrics (RSM)
|
||||
# Last Updated for Version: 5.2.0
|
||||
# Date of the Last Update: Dec 26, 2013
|
||||
# ==========================================================================
|
||||
# Product: QP/C++ Configuration for MSquared Resource Standard Metrics (RSM)
|
||||
# Last Updated for Version: 5.2.0
|
||||
# Date of the Last Update: Dec 26, 2013
|
||||
#
|
||||
# Q u a n t u m L e a P s
|
||||
# ---------------------------
|
||||
@ -31,7 +31,7 @@
|
||||
# Quantum Leaps Web sites: http://www.quantum-leaps.com
|
||||
# http://www.state-machine.com
|
||||
# e-mail: info@quantum-leaps.com
|
||||
# ==========================================================================
|
||||
# ==========================================================================
|
||||
|
||||
####################################################################
|
||||
# RSM Operational Configuration ####################################
|
||||
@ -261,7 +261,7 @@ Maximum Function Name Length : 32
|
||||
# Emit a quality notice when a file does not contain
|
||||
# the specified key string.
|
||||
Quality Notice 21 : No
|
||||
RSM KEY String :
|
||||
RSM KEY String :
|
||||
|
||||
# RSM Quality Notices For Stability and Maintainability ################
|
||||
|
||||
@ -579,7 +579,7 @@ Quality Notice 57 : No
|
||||
Quality Notice 58 : No
|
||||
|
||||
# RSM Quality Notices Miscellaneous ####################################
|
||||
|
||||
|
||||
# Quality Notice No. 25
|
||||
# Deprecated in Version 6.70
|
||||
# See settings under language extensions.
|
||||
|
@ -1,3 +1,12 @@
|
||||
struct QCalcEvt : public QP::QEvt { // inherits QP::QEvt
|
||||
std::uint8_t keyId; // ID of the key depressed
|
||||
// example of event signals
|
||||
enum MySignals {
|
||||
TIMEOUT_SIG = QP::Q_USER_SIG, // <===
|
||||
BUTTON_PRESSED,
|
||||
BUTTON_RELEASED,
|
||||
. . .
|
||||
};
|
||||
|
||||
// example of an event with paramters
|
||||
struct QCalcEvt : public QP::QEvt { // inherits QP::QEvt
|
||||
std::uint8_t keyId; // ID of the key depressed
|
||||
};
|
||||
|
@ -19,7 +19,7 @@ int_t main(void) {
|
||||
QS_OBJ_DICTIONARY(AO_Philo[4]);
|
||||
|
||||
static QP::QSubscrList subscrSto[MAX_PUB_SIG];
|
||||
QP::QF::psInit(subscrSto, Q_DIM(subscrSto)); // init publish-subscribe
|
||||
QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); // init publish-subscribe
|
||||
|
||||
// initialize event pools...
|
||||
static QF_MPOOL_EL(TableEvt) smlPoolSto[2*N_PHILO];
|
||||
|
@ -1,11 +1,11 @@
|
||||
void QActive::run(void) { // <---
|
||||
m_running = true;
|
||||
while (m_running) {
|
||||
QP::QEvt const *e = get_(e); // wait for an event
|
||||
QEvt const *e = get_(e); // wait for an event
|
||||
dispatch(e, m_prio); // dispatch e to the AO's state machine
|
||||
QP::QF::gc(e); // check if the event is garbage, and collect it if so
|
||||
QF::gc(e); // check if the event is garbage, and collect it if so
|
||||
}
|
||||
|
||||
unsubscribeAll(); // unsubscribe from all signals
|
||||
QF::remove_(this); // remove this object from any subscriptions
|
||||
unregister_(); // remove this object from any subscriptions
|
||||
}
|
||||
|
@ -10,7 +10,7 @@
|
||||
interrupt void ISR_timer() { // entered with interrupts locked in hardware
|
||||
QF_INT_ENABLE(); // enable interrupts
|
||||
|
||||
QP::QF::TICK_X(0U, &l_ISR_timer); //<-- call the QF tick processing
|
||||
QP::QTimeEvt::TICK_X(0U, &l_ISR_timer); //<-- call the QF tick processing
|
||||
|
||||
QF_INT_DISABLE(); // disable interrupts again
|
||||
// send the EOI instruction to the Interrupt Controller
|
||||
@ -21,5 +21,5 @@ interrupt void ISR_timer() { // entered with interrupts locked in hardware
|
||||
// (nesting of critical sections allowed)
|
||||
//
|
||||
interrupt void ISR_timer() {
|
||||
QP::QF::TICK_X(0U, &l_ISR_timer); //<-- call the QF tick processing
|
||||
QP::QTimeEvt::TICK_X(0U, &l_ISR_timer); //<-- call the QF tick processing
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ int main() {
|
||||
BSP_init(); // initialize the Board Support Package
|
||||
QF::init(); // initialize the framework and the underlying RT kernel
|
||||
|
||||
// publish-subscribe not used, no call to QF::psInit()
|
||||
// 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...
|
||||
|
@ -338,7 +338,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -952,7 +952,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>NDEBUG EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -1566,7 +1566,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Q_SPY EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
|
@ -63,7 +63,7 @@ extern "C" {
|
||||
void SysTick_Handler(void); // prototype
|
||||
void SysTick_Handler(void) {
|
||||
QK_ISR_ENTRY(); // inform QK about entering an ISR
|
||||
QF::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
QK_ISR_EXIT(); // inform QK about exiting an ISR
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
##############################################################################
|
||||
# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QK kernel, GNU-ARM
|
||||
# Last Updated for Version: 7.0.0
|
||||
# Date of the Last Update: 2021-07-01
|
||||
# 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
|
||||
# ------------------------
|
||||
@ -80,7 +80,6 @@ VPATH = \
|
||||
INCLUDES = \
|
||||
-I../.. \
|
||||
-I$(QPCPP)/include \
|
||||
-I$(QPCPP)/src \
|
||||
-I$(QP_PORT_DIR) \
|
||||
-I$(QPCPP)/3rd_party/CMSIS/Include \
|
||||
-I$(QPCPP)/3rd_party/efm32pg1b
|
||||
|
@ -1,49 +1,49 @@
|
||||
::============================================================================
|
||||
:: 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
|
||||
|
||||
::============================================================================
|
||||
:: 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
|
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qk.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qk.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
|
@ -1,29 +1,29 @@
|
||||
/*###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__ = 1024;
|
||||
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 };
|
||||
/*###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__ = 1024;
|
||||
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 };
|
@ -338,7 +338,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -952,7 +952,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>NDEBUG EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -1566,7 +1566,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Q_SPY EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
|
@ -62,7 +62,7 @@ extern "C" {
|
||||
//............................................................................
|
||||
void SysTick_Handler(void); // prototype
|
||||
void SysTick_Handler(void) {
|
||||
QF::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
@ -1,7 +1,7 @@
|
||||
##############################################################################
|
||||
# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QV kernel, GNU-ARM
|
||||
# Last Updated for Version: 7.0.0
|
||||
# Date of the Last Update: 2021-07-01
|
||||
# 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
|
||||
# ------------------------
|
||||
@ -80,7 +80,6 @@ VPATH = \
|
||||
INCLUDES = \
|
||||
-I../.. \
|
||||
-I$(QPCPP)/include \
|
||||
-I$(QPCPP)/src \
|
||||
-I$(QP_PORT_DIR) \
|
||||
-I$(QPCPP)/3rd_party/CMSIS/Include \
|
||||
-I$(QPCPP)/3rd_party/efm32pg1b
|
||||
|
@ -1,49 +1,49 @@
|
||||
::============================================================================
|
||||
:: 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
|
||||
|
||||
::============================================================================
|
||||
:: 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
|
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qv.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qv.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
|
@ -1,29 +1,29 @@
|
||||
/*###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__ = 1024;
|
||||
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 };
|
||||
/*###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__ = 1024;
|
||||
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 };
|
@ -41,7 +41,7 @@ int main() {
|
||||
BSP_init(); // initialize the Board Support Package
|
||||
QF::init(); // initialize the framework and the underlying RT kernel
|
||||
|
||||
// publish-subscribe not used, no call to QF::psInit()
|
||||
// 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...
|
||||
|
@ -338,7 +338,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>__FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -957,7 +957,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>NDEBUG __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -1576,7 +1576,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Q_SPY __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
|
@ -62,7 +62,7 @@ extern "C" {
|
||||
void SysTick_Handler(void); // prototype
|
||||
void SysTick_Handler(void) {
|
||||
QK_ISR_ENTRY(); // inform QK about entering an ISR
|
||||
QF::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
QK_ISR_EXIT(); // inform QK about exiting an ISR
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
##############################################################################
|
||||
# Product: Makefile for QP/C++ on EK-TM4C123GXL, QK kernel, GNU-ARM
|
||||
# Last Updated for Version: 7.0.0
|
||||
# Date of the Last Update: 2021-07-01
|
||||
# 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
|
||||
# ------------------------
|
||||
@ -80,7 +80,6 @@ VPATH = \
|
||||
INCLUDES = \
|
||||
-I../.. \
|
||||
-I$(QPCPP)/include \
|
||||
-I$(QPCPP)/src \
|
||||
-I$(QP_PORT_DIR) \
|
||||
-I$(QPCPP)/3rd_party/CMSIS/Include \
|
||||
-I$(QPCPP)/3rd_party/ek-tm4c123gxl
|
||||
|
@ -1,33 +1,33 @@
|
||||
::============================================================================
|
||||
:: 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
|
||||
|
||||
::============================================================================
|
||||
:: 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
|
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qk.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qk.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
|
@ -1,29 +1,29 @@
|
||||
/*###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__ = 1024;
|
||||
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 };
|
||||
/*###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__ = 1024;
|
||||
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 };
|
@ -338,7 +338,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>__FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -957,7 +957,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>NDEBUG __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -1576,7 +1576,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Q_SPY __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\ek-tm4c123gxl</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
|
@ -61,7 +61,7 @@ extern "C" {
|
||||
//............................................................................
|
||||
void SysTick_Handler(void); // prototype
|
||||
void SysTick_Handler(void) {
|
||||
QF::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
QTimeEvt::TICK_X(0U, nullptr); // process time events for rate 0
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
@ -1,7 +1,7 @@
|
||||
##############################################################################
|
||||
# Product: Makefile for QP/C++ on EK-TM4C123GXL, QV kernel, GNU-ARM
|
||||
# Last Updated for Version: 7.0.0
|
||||
# Date of the Last Update: 2021-07-01
|
||||
# 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
|
||||
# ------------------------
|
||||
@ -80,7 +80,6 @@ VPATH = \
|
||||
INCLUDES = \
|
||||
-I../.. \
|
||||
-I$(QPCPP)/include \
|
||||
-I$(QPCPP)/src \
|
||||
-I$(QP_PORT_DIR) \
|
||||
-I$(QPCPP)/3rd_party/CMSIS/Include \
|
||||
-I$(QPCPP)/3rd_party/ek-tm4c123gxl
|
||||
|
@ -1,33 +1,33 @@
|
||||
::============================================================================
|
||||
:: 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
|
||||
|
||||
::============================================================================
|
||||
:: 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
|
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qv.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\blinky-qv.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
|
@ -1,29 +1,29 @@
|
||||
/*###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__ = 1024;
|
||||
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 };
|
||||
/*###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__ = 1024;
|
||||
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 };
|
@ -1,21 +1,33 @@
|
||||
//.$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$file${.::dpp.hpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//
|
||||
// Model: dpp.qm
|
||||
// File: ${.::dpp.hpp}
|
||||
//
|
||||
// This code has been generated by QM 5.1.0 <www.state-machine.com/qm/>.
|
||||
// This code has been generated by QM 5.2.0 <www.state-machine.com/qm>.
|
||||
// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost.
|
||||
//
|
||||
// This program is open source software: you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License as published
|
||||
// by the Free Software Foundation.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful, but
|
||||
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
// for more details.
|
||||
// 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.
|
||||
//
|
||||
//.$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
// 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:
|
||||
// <www.state-machine.com/licensing>
|
||||
// <info@state-machine.com>
|
||||
//
|
||||
//$endhead${.::dpp.hpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
#ifndef DPP_HPP
|
||||
#define DPP_HPP
|
||||
|
||||
@ -36,51 +48,55 @@ enum DPPSignals {
|
||||
|
||||
} // namespace DPP
|
||||
|
||||
//.$declare${Events::TableEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$declare${Events::TableEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
namespace DPP {
|
||||
|
||||
//.${Events::TableEvt} .......................................................
|
||||
//${Events::TableEvt} ........................................................
|
||||
class TableEvt : public QP::QEvt {
|
||||
public:
|
||||
uint8_t philoNum;
|
||||
};
|
||||
}; // class TableEvt
|
||||
|
||||
} // namespace DPP
|
||||
//.$enddecl${Events::TableEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//$enddecl${Events::TableEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
// number of philosophers
|
||||
#define N_PHILO ((uint8_t)5)
|
||||
|
||||
//.$declare${AOs::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$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} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$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} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//$enddecl${AOs::AO_Table} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
#ifdef QXK_HPP
|
||||
//.$declare${AOs::XT_Test1} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$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} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$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} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//$enddecl${AOs::XT_Test2} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
#endif // QXK_HPP
|
||||
|
||||
#endif // DPP_HPP
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<model version="5.1.0" links="1">
|
||||
<model version="5.2.0" links="1">
|
||||
<documentation>Dining Philosopher Problem example with MSM state machines</documentation>
|
||||
<!--${qpcpp}-->
|
||||
<framework name="qpcpp"/>
|
||||
@ -124,7 +124,7 @@ Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(this));</action>
|
||||
<entry>m_timeEvt.armX(eat_time(), 0U);</entry>
|
||||
<exit>TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
|
||||
pe->philoNum = PHILO_ID(this);
|
||||
QP::QF::PUBLISH(pe, this);
|
||||
QP::QActive::PUBLISH(pe, this);
|
||||
(void)m_timeEvt.disarm();</exit>
|
||||
<!--${AOs::Philo::SM::eating::TIMEOUT}-->
|
||||
<tran trig="TIMEOUT" target="../../1">
|
||||
@ -223,7 +223,7 @@ for (uint8_t n = 0U; n < N_PHILO; ++n) {
|
||||
m_fork[n] = USED;
|
||||
TableEvt *te = Q_NEW(TableEvt, EAT_SIG);
|
||||
te->philoNum = n;
|
||||
QP::QF::PUBLISH(te, this);
|
||||
QP::QActive::PUBLISH(te, this);
|
||||
m_isHungry[n] = false;
|
||||
BSP::displayPhilStat(n, EATING);
|
||||
}
|
||||
@ -243,7 +243,7 @@ uint8_t m = LEFT(n);</action>
|
||||
m_fork[n] = USED;
|
||||
TableEvt *pe = Q_NEW(TableEvt, EAT_SIG);
|
||||
pe->philoNum = n;
|
||||
QP::QF::PUBLISH(pe, this);
|
||||
QP::QActive::PUBLISH(pe, this);
|
||||
BSP::displayPhilStat(n, EATING);</action>
|
||||
<choice_glyph conn="19,26,5,-1,10">
|
||||
<action box="1,0,10,2"/>
|
||||
@ -282,7 +282,7 @@ if (m_isHungry[m] && (m_fork[m] == FREE)) {
|
||||
m_isHungry[m] = false;
|
||||
TableEvt *pe = Q_NEW(TableEvt, EAT_SIG);
|
||||
pe->philoNum = m;
|
||||
QP::QF::PUBLISH(pe, this);
|
||||
QP::QActive::PUBLISH(pe, this);
|
||||
BSP::displayPhilStat(m, EATING);
|
||||
}
|
||||
m = LEFT(n); // check the left neighbor
|
||||
@ -293,7 +293,7 @@ if (m_isHungry[m] && (m_fork[n] == FREE)) {
|
||||
m_isHungry[m] = false;
|
||||
TableEvt *pe = Q_NEW(TableEvt, EAT_SIG);
|
||||
pe->philoNum = m;
|
||||
QP::QF::PUBLISH(pe, this);
|
||||
QP::QActive::PUBLISH(pe, this);
|
||||
BSP::displayPhilStat(m, EATING);
|
||||
}</action>
|
||||
<tran_glyph conn="4,34,3,-1,15">
|
||||
@ -485,9 +485,9 @@ inline uint8_t LEFT(uint8_t const n) {
|
||||
constexpr uint8_t FREE = static_cast<uint8_t>(0);
|
||||
constexpr uint8_t USED = static_cast<uint8_t>(1);
|
||||
|
||||
constexpr char_t const * const THINKING = &"thinking"[0];
|
||||
constexpr char_t const * const HUNGRY = &"hungry "[0];
|
||||
constexpr char_t const * const EATING = &"eating "[0];
|
||||
constexpr char const * const THINKING = &"thinking"[0];
|
||||
constexpr char const * const HUNGRY = &"hungry "[0];
|
||||
constexpr char const * const EATING = &"eating "[0];
|
||||
|
||||
} // namespace DPP
|
||||
|
||||
|
@ -1,21 +1,33 @@
|
||||
//.$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$file${.::philo.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//
|
||||
// Model: dpp.qm
|
||||
// File: ${.::philo.cpp}
|
||||
//
|
||||
// This code has been generated by QM 5.1.0 <www.state-machine.com/qm/>.
|
||||
// This code has been generated by QM 5.2.0 <www.state-machine.com/qm>.
|
||||
// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost.
|
||||
//
|
||||
// This program is open source software: you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License as published
|
||||
// by the Free Software Foundation.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful, but
|
||||
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
// for more details.
|
||||
// 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.
|
||||
//
|
||||
//.$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
// 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:
|
||||
// <www.state-machine.com/licensing>
|
||||
// <info@state-machine.com>
|
||||
//
|
||||
//$endhead${.::philo.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
#include "qpcpp.hpp"
|
||||
#include "dpp.hpp"
|
||||
#include "bsp.hpp"
|
||||
@ -23,10 +35,10 @@
|
||||
Q_DEFINE_THIS_FILE
|
||||
|
||||
// Active object class -------------------------------------------------------
|
||||
//.$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$declare${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
namespace DPP {
|
||||
|
||||
//.${AOs::Philo} .............................................................
|
||||
//${AOs::Philo} ..............................................................
|
||||
class Philo : public QP::QActive {
|
||||
public:
|
||||
static Philo inst[N_PHILO];
|
||||
@ -42,10 +54,10 @@ protected:
|
||||
Q_STATE_DECL(thinking);
|
||||
Q_STATE_DECL(hungry);
|
||||
Q_STATE_DECL(eating);
|
||||
};
|
||||
}; // class Philo
|
||||
|
||||
} // namespace DPP
|
||||
//.$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//$enddecl${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
namespace DPP {
|
||||
|
||||
@ -69,16 +81,17 @@ inline uint8_t PHILO_ID(Philo const * const me) {
|
||||
|
||||
} // namespace DPP
|
||||
|
||||
//.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//. Check for the minimum required QP version
|
||||
#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
|
||||
#error qpcpp version 6.8.0 or higher required
|
||||
//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
// Check for the minimum required QP version
|
||||
#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
|
||||
#error qpcpp version 6.9.0 or higher required
|
||||
#endif
|
||||
//.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//.$define${AOs::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
//$define${AOs::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
namespace DPP {
|
||||
|
||||
//.${AOs::AO_Philo[N_PHILO]} .................................................
|
||||
//${AOs::AO_Philo[N_PHILO]} ..................................................
|
||||
QP::QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AO
|
||||
&Philo::inst[0],
|
||||
&Philo::inst[1],
|
||||
@ -88,21 +101,22 @@ QP::QActive * const AO_Philo[N_PHILO] = { // "opaque" pointers to Philo AO
|
||||
};
|
||||
|
||||
} // namespace DPP
|
||||
//.$enddef${AOs::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//.$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
//$enddef${AOs::AO_Philo[N_PHILO]} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||
namespace DPP {
|
||||
|
||||
//.${AOs::Philo} .............................................................
|
||||
//${AOs::Philo} ..............................................................
|
||||
Philo Philo::inst[N_PHILO];
|
||||
//.${AOs::Philo::Philo} ......................................................
|
||||
|
||||
//${AOs::Philo::Philo} .......................................................
|
||||
Philo::Philo()
|
||||
: QActive(&initial),
|
||||
m_timeEvt(this, TIMEOUT_SIG, 0U)
|
||||
{}
|
||||
|
||||
//.${AOs::Philo::SM} .........................................................
|
||||
//${AOs::Philo::SM} ..........................................................
|
||||
Q_STATE_DEF(Philo, initial) {
|
||||
//.${AOs::Philo::SM::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) {
|
||||
@ -131,28 +145,29 @@ Q_STATE_DEF(Philo, initial) {
|
||||
subscribe(TEST_SIG);
|
||||
return tran(&thinking);
|
||||
}
|
||||
//.${AOs::Philo::SM::thinking} ...............................................
|
||||
|
||||
//${AOs::Philo::SM::thinking} ................................................
|
||||
Q_STATE_DEF(Philo, thinking) {
|
||||
QP::QState status_;
|
||||
switch (e->sig) {
|
||||
//.${AOs::Philo::SM::thinking}
|
||||
//${AOs::Philo::SM::thinking}
|
||||
case Q_ENTRY_SIG: {
|
||||
m_timeEvt.armX(think_time(), 0U);
|
||||
status_ = Q_RET_HANDLED;
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::thinking}
|
||||
//${AOs::Philo::SM::thinking}
|
||||
case Q_EXIT_SIG: {
|
||||
(void)m_timeEvt.disarm();
|
||||
status_ = Q_RET_HANDLED;
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::thinking::TIMEOUT}
|
||||
//${AOs::Philo::SM::thinking::TIMEOUT}
|
||||
case TIMEOUT_SIG: {
|
||||
status_ = tran(&hungry);
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::thinking::EAT, DONE}
|
||||
//${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 */
|
||||
@ -160,7 +175,7 @@ Q_STATE_DEF(Philo, thinking) {
|
||||
status_ = Q_RET_HANDLED;
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::thinking::TEST}
|
||||
//${AOs::Philo::SM::thinking::TEST}
|
||||
case TEST_SIG: {
|
||||
status_ = Q_RET_HANDLED;
|
||||
break;
|
||||
@ -172,11 +187,12 @@ Q_STATE_DEF(Philo, thinking) {
|
||||
}
|
||||
return status_;
|
||||
}
|
||||
//.${AOs::Philo::SM::hungry} .................................................
|
||||
|
||||
//${AOs::Philo::SM::hungry} ..................................................
|
||||
Q_STATE_DEF(Philo, hungry) {
|
||||
QP::QState status_;
|
||||
switch (e->sig) {
|
||||
//.${AOs::Philo::SM::hungry}
|
||||
//${AOs::Philo::SM::hungry}
|
||||
case Q_ENTRY_SIG: {
|
||||
TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
|
||||
pe->philoNum = PHILO_ID(this);
|
||||
@ -184,9 +200,9 @@ Q_STATE_DEF(Philo, hungry) {
|
||||
status_ = Q_RET_HANDLED;
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::hungry::EAT}
|
||||
//${AOs::Philo::SM::hungry::EAT}
|
||||
case EAT_SIG: {
|
||||
//.${AOs::Philo::SM::hungry::EAT::[Q_EVT_CAST(TableEvt)->philoNum=~}
|
||||
//${AOs::Philo::SM::hungry::EAT::[Q_EVT_CAST(TableEvt)->philoNum=~}
|
||||
if (Q_EVT_CAST(TableEvt)->philoNum == PHILO_ID(this)) {
|
||||
status_ = tran(&eating);
|
||||
}
|
||||
@ -195,7 +211,7 @@ Q_STATE_DEF(Philo, hungry) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::hungry::DONE}
|
||||
//${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));
|
||||
@ -209,31 +225,32 @@ Q_STATE_DEF(Philo, hungry) {
|
||||
}
|
||||
return status_;
|
||||
}
|
||||
//.${AOs::Philo::SM::eating} .................................................
|
||||
|
||||
//${AOs::Philo::SM::eating} ..................................................
|
||||
Q_STATE_DEF(Philo, eating) {
|
||||
QP::QState status_;
|
||||
switch (e->sig) {
|
||||
//.${AOs::Philo::SM::eating}
|
||||
//${AOs::Philo::SM::eating}
|
||||
case Q_ENTRY_SIG: {
|
||||
m_timeEvt.armX(eat_time(), 0U);
|
||||
status_ = Q_RET_HANDLED;
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::eating}
|
||||
//${AOs::Philo::SM::eating}
|
||||
case Q_EXIT_SIG: {
|
||||
TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
|
||||
pe->philoNum = PHILO_ID(this);
|
||||
QP::QF::PUBLISH(pe, this);
|
||||
QP::QActive::PUBLISH(pe, this);
|
||||
(void)m_timeEvt.disarm();
|
||||
status_ = Q_RET_HANDLED;
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::eating::TIMEOUT}
|
||||
//${AOs::Philo::SM::eating::TIMEOUT}
|
||||
case TIMEOUT_SIG: {
|
||||
status_ = tran(&thinking);
|
||||
break;
|
||||
}
|
||||
//.${AOs::Philo::SM::eating::EAT, DONE}
|
||||
//${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 */
|
||||
@ -250,4 +267,4 @@ Q_STATE_DEF(Philo, eating) {
|
||||
}
|
||||
|
||||
} // namespace DPP
|
||||
//.$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
//$enddef${AOs::Philo} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -339,7 +339,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -1015,7 +1015,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>NDEBUG EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -1640,7 +1640,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Q_SPY EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qk\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
|
@ -98,7 +98,7 @@ void SysTick_Handler(void) {
|
||||
}
|
||||
#endif
|
||||
|
||||
//QP::QF::TICK_X(0U, &l_SysTick_Handler); // process time events for rate 0
|
||||
//QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time events for rate 0
|
||||
the_Ticker0->POST(0, &l_SysTick_Handler); // post to Ticker0 active object
|
||||
|
||||
// Perform the debouncing of buttons. The algorithm for debouncing
|
||||
|
@ -1,7 +1,7 @@
|
||||
##############################################################################
|
||||
# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QK kernel, GNU-ARM
|
||||
# Last Updated for Version: 7.0.0
|
||||
# Date of the Last Update: 2021-07-01
|
||||
# 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
|
||||
# ------------------------
|
||||
@ -80,7 +80,6 @@ VPATH = \
|
||||
INCLUDES = \
|
||||
-I../.. \
|
||||
-I$(QPCPP)/include \
|
||||
-I$(QPCPP)/src \
|
||||
-I$(QP_PORT_DIR) \
|
||||
-I$(QPCPP)/3rd_party/CMSIS/Include \
|
||||
-I$(QPCPP)/3rd_party/efm32pg1b
|
||||
|
@ -1,49 +1,49 @@
|
||||
::============================================================================
|
||||
:: 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
|
||||
|
||||
::============================================================================
|
||||
:: 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
|
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\dpp-qk.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\dpp-qk.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
|
@ -1,29 +1,29 @@
|
||||
/*###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__ = 1024;
|
||||
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 };
|
||||
/*###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__ = 1024;
|
||||
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 };
|
@ -49,7 +49,7 @@ int main() {
|
||||
|
||||
DPP::BSP::init(); // initialize the BSP
|
||||
|
||||
QP::QF::psInit(subscrSto, Q_DIM(subscrSto)); // init publish-subscribe
|
||||
QP::QActive::psInit(subscrSto, Q_DIM(subscrSto)); // publish-subscribe
|
||||
|
||||
// initialize event pools...
|
||||
QP::QF::poolInit(smlPoolSto,
|
||||
|
@ -10,7 +10,7 @@
|
||||
<aExt>*.s*; *.src; *.a*</aExt>
|
||||
<oExt>*.obj</oExt>
|
||||
<lExt>*.lib</lExt>
|
||||
<tExt>*.txt; *.h; *.inc</tExt>
|
||||
<tExt>*.txt; *.h; *.inc; *.md</tExt>
|
||||
<pExt>*.plm</pExt>
|
||||
<CppX>*.cpp</CppX>
|
||||
<nMigrate>0</nMigrate>
|
||||
@ -103,7 +103,7 @@
|
||||
<bEvRecOn>1</bEvRecOn>
|
||||
<bSchkAxf>0</bSchkAxf>
|
||||
<bTchkAxf>0</bTchkAxf>
|
||||
<nTsel>3</nTsel>
|
||||
<nTsel>4</nTsel>
|
||||
<sDll></sDll>
|
||||
<sDllPa></sDllPa>
|
||||
<sDlgDll></sDlgDll>
|
||||
@ -120,7 +120,7 @@
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGUARM</Key>
|
||||
<Name>/</Name>
|
||||
<Name>d</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
@ -153,7 +153,24 @@
|
||||
<Name>-U0E2006F4 -O4622 -S4 -FO61</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<Breakpoint>
|
||||
<Bp>
|
||||
<Number>0</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>326</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>1714</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename>..\bsp.cpp</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>\\dpp_qv\../bsp.cpp\326</Expression>
|
||||
</Bp>
|
||||
</Breakpoint>
|
||||
<MemoryWindow1>
|
||||
<Mm>
|
||||
<WinNumber>1</WinNumber>
|
||||
|
@ -10,13 +10,13 @@
|
||||
<TargetName>dpp-dbg</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pCCUsed>5060528::V5.06 update 5 (build 528)::ARMCC</pCCUsed>
|
||||
<pCCUsed>6160000::V6.16::ARMCLANG</pCCUsed>
|
||||
<uAC6>1</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>EFM32PG1B200F256GM48</Device>
|
||||
<Vendor>Silicon Labs</Vendor>
|
||||
<PackID>SiliconLabs.EFM32PG1B_DFP.5.5.0</PackID>
|
||||
<PackID>SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0</PackID>
|
||||
<PackURL>https://www.silabs.com/documents/public/cmsis-packs/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
@ -185,6 +185,7 @@
|
||||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<hadIRAM2>0</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
@ -312,7 +313,7 @@
|
||||
</ArmAdsMisc>
|
||||
<Cads>
|
||||
<interw>0</interw>
|
||||
<Optim>7</Optim>
|
||||
<Optim>0</Optim>
|
||||
<oTime>0</oTime>
|
||||
<SplitLS>0</SplitLS>
|
||||
<OneElfS>1</OneElfS>
|
||||
@ -338,7 +339,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -351,7 +352,7 @@
|
||||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>1</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<uClangAs>0</uClangAs>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Stack_Size=1024 Heap_Size=16</Define>
|
||||
@ -595,7 +596,7 @@
|
||||
<NoWarn>2</NoWarn>
|
||||
<uSurpInc>2</uSurpInc>
|
||||
<useXO>2</useXO>
|
||||
<uClangAs>2</uClangAs>
|
||||
<ClangAsOpt>0</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
@ -640,7 +641,7 @@
|
||||
<TargetCommonOption>
|
||||
<Device>EFM32PG1B200F256GM48</Device>
|
||||
<Vendor>Silicon Labs</Vendor>
|
||||
<PackID>SiliconLabs.EFM32PG1B_DFP.5.5.0</PackID>
|
||||
<PackID>SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0</PackID>
|
||||
<PackURL>https://www.silabs.com/documents/public/cmsis-packs/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
@ -809,6 +810,7 @@
|
||||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<hadIRAM2>0</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
@ -962,7 +964,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>NDEBUG EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -975,7 +977,7 @@
|
||||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>1</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<uClangAs>0</uClangAs>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Stack_Size=1024 Heap_Size=16</Define>
|
||||
@ -1219,7 +1221,7 @@
|
||||
<NoWarn>2</NoWarn>
|
||||
<uSurpInc>2</uSurpInc>
|
||||
<useXO>2</useXO>
|
||||
<uClangAs>2</uClangAs>
|
||||
<ClangAsOpt>0</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
@ -1264,7 +1266,7 @@
|
||||
<TargetCommonOption>
|
||||
<Device>EFM32PG1B200F256GM48</Device>
|
||||
<Vendor>Silicon Labs</Vendor>
|
||||
<PackID>SiliconLabs.EFM32PG1B_DFP.5.5.0</PackID>
|
||||
<PackID>SiliconLabs.GeckoPlatform_EFM32PG1B_DFP.4.0.0</PackID>
|
||||
<PackURL>https://www.silabs.com/documents/public/cmsis-packs/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00008000) IROM(0x00000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
@ -1433,6 +1435,7 @@
|
||||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<hadIRAM2>0</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
@ -1586,7 +1589,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Q_SPY EFM32PG1B200F256GM48=1 __FPU_PRESENT</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\src;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
<IncludePath>..\..;..\..\..\..\..\include;..\..\..\..\..\ports\arm-cm\qv\armclang;..\..\..\..\..\3rd_party\CMSIS\Include;..\..\..\..\..\3rd_party\efm32pg1b</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@ -1599,7 +1602,7 @@
|
||||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>1</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<uClangAs>0</uClangAs>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define>Stack_Size=1024 Heap_Size=16</Define>
|
||||
|
@ -96,7 +96,7 @@ void SysTick_Handler(void) {
|
||||
}
|
||||
#endif
|
||||
|
||||
//QP::QF::TICK_X(0U, &l_SysTick_Handler); // process time evts for rate 0
|
||||
//QP::QTimeEvt::TICK_X(0U, &l_SysTick_Handler); // process time evts for rate 0
|
||||
the_Ticker0->POST(0, &l_SysTick_Handler); // post to Ticker0 active object
|
||||
|
||||
// Perform the debouncing of buttons. The algorithm for debouncing
|
||||
@ -191,6 +191,8 @@ void BSP::init(void) {
|
||||
}
|
||||
QS_OBJ_DICTIONARY(&l_SysTick_Handler);
|
||||
QS_OBJ_DICTIONARY(&l_GPIO_EVEN_IRQHandler);
|
||||
QS_OBJ_DICTIONARY(the_Ticker0);
|
||||
|
||||
QS_USR_DICTIONARY(PHILO_STAT);
|
||||
QS_USR_DICTIONARY(COMMAND_STAT);
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
##############################################################################
|
||||
# Product: Makefile for QP/C++ on EMF32-SLSTK3401A, QV kernel, GNU-ARM
|
||||
# Last Updated for Version: 7.0.0
|
||||
# Date of the Last Update: 2021-07-01
|
||||
# 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
|
||||
# ------------------------
|
||||
@ -80,7 +80,6 @@ VPATH = \
|
||||
INCLUDES = \
|
||||
-I../.. \
|
||||
-I$(QPCPP)/include \
|
||||
-I$(QPCPP)/src \
|
||||
-I$(QP_PORT_DIR) \
|
||||
-I$(QPCPP)/3rd_party/CMSIS/Include \
|
||||
-I$(QPCPP)/3rd_party/efm32pg1b
|
||||
|
@ -1,49 +1,49 @@
|
||||
::============================================================================
|
||||
:: 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
|
||||
|
||||
::============================================================================
|
||||
:: 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
|