mirror of
https://github.com/QuantumLeaps/qpcpp.git
synced 2025-01-28 06:02:56 +08:00
5.9.7a
This commit is contained in:
parent
f94afe12dc
commit
56ef8c82d8
@ -41,7 +41,7 @@ OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
OPTIMIZE_FOR_FORTRAN = NO
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
EXTENSION_MAPPING =
|
||||
EXTENSION_MAPPING = lnt=Objective-C
|
||||
MARKDOWN_SUPPORT = YES
|
||||
AUTOLINK_SUPPORT = YES
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
@ -141,7 +141,8 @@ FILE_PATTERNS = \
|
||||
*.c \
|
||||
*.cpp \
|
||||
*.s \
|
||||
*.asm
|
||||
*.asm \
|
||||
*.lnt
|
||||
|
||||
RECURSIVE = YES
|
||||
EXCLUDE = \
|
||||
@ -313,7 +314,7 @@ EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED = Q_SPY QP_IMPL
|
||||
PREDEFINED = Q_SPY QP_IMPL Q_UTEST
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -41,7 +41,7 @@ OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
OPTIMIZE_FOR_FORTRAN = NO
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
EXTENSION_MAPPING =
|
||||
EXTENSION_MAPPING = lnt=Objective-C
|
||||
MARKDOWN_SUPPORT = YES
|
||||
AUTOLINK_SUPPORT = YES
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
@ -141,7 +141,8 @@ FILE_PATTERNS = \
|
||||
*.c \
|
||||
*.cpp \
|
||||
*.s \
|
||||
*.asm
|
||||
*.asm \
|
||||
*.lnt
|
||||
|
||||
RECURSIVE = YES
|
||||
EXCLUDE = \
|
||||
@ -313,7 +314,7 @@ EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED = Q_SPY QP_IMPL
|
||||
PREDEFINED = Q_SPY QP_IMPL Q_UTEST
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
|
6406
doxygen/metrics.dox
6406
doxygen/metrics.dox
File diff suppressed because it is too large
Load Diff
@ -20,8 +20,128 @@
|
||||
/*##########################################################################*/
|
||||
/*! @page lint PC-Lint
|
||||
|
||||
@image html under_construction.jpg
|
||||
@tableofcontents
|
||||
|
||||
<p>The QP/C++ distribution contains a "port" to <a href="http://www.gimpel.com/html/products.htm" target="_blank" class="extern"><b>PC-Lint/FlexeLint</b></a> static analysis tool from <a href="http://www.gimpel.com" target="_blank" class="extern">Gimpel Software</a>, which is a static analysis tool for C and C++ with one of the longest track records and best value of the money in the industry. The "PC-Lint port" allows you to statically analyze the QP/C++ source code and facilitates static analysis of your **application code** based on QP/C++.
|
||||
</p>
|
||||
The QP/C "port" to PC-Lint is located in the directory <span class="img folder">qpcpp/ports/lint</span> and includes also lint configuration files located in the <span class="img folder">qpcpp/include</span> directory, as well as an example of "linting" application code in the directory <span class="img folder">qpcpp/examples/arm-cm/dpp_ek-tm4c123gxl/</span>. The following listing describes the most important files in these three directories.
|
||||
|
||||
@code{.lnt}
|
||||
qpcpp\ - QP/C++ installation directory
|
||||
|
|
||||
+-include/ - QP/C++ platform-independent includes
|
||||
| +-au-ds.lnt - Dan Saks recommendations
|
||||
| +-au-misra-cpp.lnt - Main PC-Lint MISRA-C++:2008 compliance options
|
||||
| +-qpcpp.lnt - PC-Lint options for QP/C++ applications
|
||||
| +-std.lnt - Standard PC-Lint settings recommended by Quantum Leaps
|
||||
| +-. . . - QP/C++ header files...
|
||||
| |
|
||||
| +-ports/ - QP/C++ ports directory
|
||||
| | +-lint/ - QP/C++ "port" to PC-Lint
|
||||
| | | +-qk/ - QP/C++ port with the QK kernel
|
||||
| | | +-qv/ - QP/C++ port with the QV kernel
|
||||
| | | +-qxk/ - QP/C++ port with the QXK kernel
|
||||
| | | +-lin.bat - Batch file to invoke PC-Lint to run analysis of QP/C++ code
|
||||
| | | +-options.lnt - PC/Lint options for "linting" QP/C++ source code
|
||||
| | | +-lint_qf.log - PC/Lint output for the QEP/QF components of QP/C++
|
||||
| | | +-lint_qs.log - PC/Lint output for the QS component of QP/C++
|
||||
| | | +-lint_qv.log - PC/Lint output for the QV component of QP/C++
|
||||
| | | +-lint_qk.log - PC/Lint output for the QK component of QP/C++
|
||||
| | | +-lint_qxk.log - PC/Lint output for the QXK component of QP/C++
|
||||
| | | +-qep_port.h - QEP component "port" to a generic ANSI C++ compiler
|
||||
| | | +-qf_port.h - QF component "port" to a generic ANSI C++ compiler
|
||||
| | | +-qs_port.h - QS component "port" to a generic ANSI C++ compiler
|
||||
| | | +-stdint.h - Standard exact-width integers for an ANSI C compiler
|
||||
| |
|
||||
| +-examples\ - QP/C++ examples directory (application)
|
||||
| | +-arm-cm\ - QP/C++ examples for ARM Cortex-M
|
||||
| | | +-dpp_ek-tm4c123gxl\ - DPP example on the EK-TM4C123GLX board
|
||||
| | | | +-lint\ - directory for linting the application
|
||||
| | | | | +-lin.bat - Batch to run PC-Lint analysis of application code
|
||||
| | | | | +-options.lnt - PC/Lint options for "linting" of application code
|
||||
@endcode
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@section lint_qpcpp Linting the QP/C++ Source Code
|
||||
The directory <span class="img folder">qpcpp/ports/lint</span> (see listing above) contains also the **lin.bat** batch file for "linting" the QP/C++ source code. The lin.bat batch file invokes PC-Lint and generates the lint output files. As shown in the listing above, the lint output is collected into four text files `lint_qf.log`, `lint_qs.log`, `lint_qk.log`, `lint_qv.log`, and `lint_qs.log`, for QEP/QF, QK, QV, QXK and QS components of the QP/C++ framework, respectively.
|
||||
|
||||
@note
|
||||
In order to execute the **lin.bat** file on your system, you might need to adjust the symbol `PC_LINT_DIR` at the top of the batch file, to the PC-Lint installation directory on your computer.
|
||||
|
||||
@note
|
||||
The lin.bat batch file invoked without any command-line options checks the QP/C++ code in the Q_SPY build configuration with software tracing enabled. However, by the nature of software tracing, the Q_SPY configuration transgresses many more MISRA-C++:2008 rules than the standard configuration. However, the Q_SPY configuration is never used for production code, so the MISRA-C++ compliance of the QP/C++ framework should not be judged by the deviations that happen only in the Q_SPY configuration.
|
||||
|
||||
According to the PC-Lint guidelines, the lin.bat uses two option files: the **std.lnt** option file discussed before and the `options.lnt` option file that covers all deviations from the MISRA-C++ rules in the QP/C++ source code. Section 3 (MISRA compliance matrix) cross-references all these deviations, while Section 5 (deviation procedures) describes the reasons for deviations in those, very specific contexts.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@section lint_app Linting QP/C++ Application Code
|
||||
The QP/C++ baseline code contains an example of MISRA-C++ compliance checking with PC/Lint: the DPP example for the EK-TM4C123GLX Cortex-M4F board, located in the directory <span class="img folder">qpcpp/examples/arm-cm/dpp_ek-tm4c123gxl/lint</span>. The PC-Lint analysis is very simple and requires invoking the **lin.bat** file from the `lint` sub-directory.
|
||||
|
||||
@note
|
||||
In order to execute the **lin.bat** file on your system, you might need to adjust the symbol `PC_LINT_DIR` at the top of the batch file, to the PC-Lint installation directory on your computer. You
|
||||
|
||||
The `lint` subdirectory in each of the application folders contains also the `options.lnt` with the PC-Lint options specific to linting the application. There is also a choice of the compiler, whereas `options_gcc.lnt` are for the GCC-ARM and `options_iar.lnt` are for `IAR-ARM` compilers, respectively. These files specify the include directory for the specific embedded compiler used to compile the application, and you most likely need to adjust it for your system.
|
||||
Running PC-Lint on embedded projects (such as the DPP example for ARM Cortex-M) requires option files for the specific compilers (`co-iar-arm.lnt` file for IAR ARM and `co-gnu-arm.lnt` file GNU ARM, respectively). These option files are provided in the <a href="https://state-machine.com/qtools/" target="_blank" class="extern">QTools collection</a>. The location of the QTools directory in your system is specified in the `options.lnt` file, and you most likely need to adjust it for your system.
|
||||
|
||||
@note
|
||||
The QTools collection is available for a separate download from https://sourceforge.net/projects/qpc/files/QTools. Quantum Leaps is committed to keep adding more and more PC-Lint option files for various embedded C/C++ cross-compilers in the QTools collection.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@section lint_options Structure of PC-Lint Options for QP/C++
|
||||
PC-Lint has several places where it reads its currently valid options:
|
||||
- From special Lint option files (usually called `*.lnt`)
|
||||
- From the command line
|
||||
- From within the special lint-comments in the source code modules (not recommended)
|
||||
|
||||
The QP/C++ source code and example application code has been "linted" only by means of the first alternative (option files) with possibility of adding options via command line. The third alternative--lint comments--is not used and Quantum Leaps does not recommend this alternative.
|
||||
|
||||
@note
|
||||
The QP/C++ source code is completely free of lint comments, which are viewed as a contamination of the source code.
|
||||
|
||||
The structure of the PC-Lint option files used for "linting" QP/C++ follows exactly the <a href="http://www.gimpel.com" target="_blank" class="extern">Gimpel Software</a> guidelines for configuring PC-Lint (See Section 3.2 "Configuration" in the *PC-Lint/FlexeLint Manual*). The design and grouping of the lint options also reflects the fact that static code analysis of a software framework, such as QP/C++, has really two major aspects. First, the source code of the framework itself has to be analyzed. But even more important and helpful to the users of the framework is providing the infrastructure to effectively analyze the application-level code based on the framework. With this in mind, the PC-Lint options for static analysis of QP/C++ are divided into two groups, located in directories <span class="img folder">qpcpp/include</span> and <span class="img folder">qpcpp/ports/lint</span>. These two groups are for analyzing QP/C++ **applications** and QP/C++ **source code**, respectively.
|
||||
|
||||
As shown in the PC-Lint "port" files description, the directory <span class="img folder">qpcpp/include</span>, contains the PC-Lint options for "linting" the application code along with all platform-independent QP/C++ header files required by the applications. This collocation of lint options with header files simplifies "linting", because specifying just `-iqpcpp/include` include directory to PC-Lint accomplishes both inclusion of QP/C++ header files and PC-Lint options.
|
||||
Note that the `qpcpp/include` directory contains all PC-Lint option files used in "linting" the code, including the standard MISRA-C++:2008 `au-misra-cpp.lnt` option file as well as Dan Saks' recommendations `au-ds.lnt`, which are copied from the PC-Lint distribution. This design freezes the lint options for which the compliance has been checked.
|
||||
|
||||
|
||||
<div class="separate"></div>
|
||||
@subsection lint_std_lnt The std.lnt option file
|
||||
According to the Gimpel Software *PC-Lint Configuration Guidelines*, the file `qpcpp/include/std.lnt` file, contains the top-level options, which Quantum Leaps recommends for all projects. These options include the formatting of the PC-Lint messages and making two passes to perform better cross-module analysis. However, the most important option is `-restore_at_end`, which has the effect of surrounding each source file with options `-save` and `-restore`. This precaution prevents options from "bleeding" from one file to another.
|
||||
|
||||
**Top-level option file std.lnt**
|
||||
|
||||
@code{.lnt}
|
||||
// output: a single line, file info always, use full path names
|
||||
-hF1
|
||||
+ffn
|
||||
-"format=%(\q%f\q %l %C%) %t %n: %m"
|
||||
|
||||
-width(0,0) // do not break lines
|
||||
+flm // make sure no foreign includes change the format
|
||||
|
||||
-zero(99) // don't stop make because of warnings
|
||||
|
||||
-passes(2) // make two passes (for better error messages)
|
||||
|
||||
-restore_at_end // don't let -e<nn> options bleed to other files
|
||||
|
||||
-summary() // produce a summary of all produced messages
|
||||
@endcode
|
||||
|
||||
|
||||
<div class="separate"></div>
|
||||
@subsection lint_qpcpp_lnt The qpcpp.lnt option file
|
||||
The most important file for "linting" QP/C++ applications is the qpcpp.lnt option file. This file handles all deviations from the MISRA-C++:2008 rules, which might arise at the application-level code from the use of the QP/C++ framework. In other words, the **qpcpp.lnt** option file allows completely clean "linting" of the application-level code, as long as the application code does not violate any of the MISRA-C++:2008 rules.
|
||||
|
||||
At the same time, the qpcpp.lnt option file has been very carefully designed not to suppress any MISRA-C++:2008 rule checking outside the very specific context of the QP/C++ API. In other words, the qpc.lnt option file still supports 100% of the MISRA-C++:2008 rule checks that PC-Lint is capable of performing.
|
||||
|
||||
@remarks
|
||||
For example, for reasons explained in Section 5.10 of the <a href="https://state-machine.com/doc/AN_QP-Cpp_MISRA.pdf" target="_blank" class="extern">"QP/C++ MISRA Compliance Matrix"</a>, QP/C++ extensively uses function-like macros, which deviates from the MISRA-C++:2008 advisory rule 19.7 and which PC-Lint checks with the warning 961. However, instead of suppressing this warning globally (with the -e961 directive), the qpcpp.lnt option file suppresses warning 961 only for the specific QP function-like macros that are visible to the application level. So specifically, the qpcpp.lnt file contains directives -estring(961, Q_TRAN, Q_SPUER, ...), which suppresses the warning only for the specified macros, but does not disable checking of any other macros in the application-level code.
|
||||
|
||||
@next{arm-cm}
|
||||
*/
|
||||
/*##########################################################################*/
|
||||
/*! @page arm-cr ARM Cortex-R
|
||||
|
@ -2,7 +2,7 @@ namespace DPP {
|
||||
|
||||
// local extended-thread objects .............................................
|
||||
static void Thread1_run(QP::QXThread * const me); // run routine for Thread1
|
||||
|
||||
|
||||
static QP::QXThread l_test1(&Thread1_run, 0U); //<== QXThread::QXThread() ctor
|
||||
. . .
|
||||
. . .
|
||||
} // namespace DPP
|
@ -1,13 +1,13 @@
|
||||
namespace DPP {
|
||||
namespace DPP {
|
||||
extern QP::QXThread * const XT_Test1;
|
||||
} // namespace DPP
|
||||
|
||||
|
||||
|
||||
|
||||
int main() {
|
||||
// stacks and queues for the extended test threads
|
||||
static QP::QEvt const *test1QueueSto[5];
|
||||
static uint64_t test1StackSto[64];
|
||||
|
||||
|
||||
// start the extended Test1 thread
|
||||
// start the extended Test1 thread
|
||||
DPP::XT_Test1->start(
|
||||
|
@ -1,36 +1,40 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Product: PC-Lint 9.x option file for linting QP/C++ applications
|
||||
// Last updated for version 5.9.7
|
||||
// Last updated on 2017-08-20
|
||||
//
|
||||
// Q u a n t u m L e a P s
|
||||
// ---------------------------
|
||||
// innovating embedded systems
|
||||
//
|
||||
// Copyright (C) 2005-2017 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:
|
||||
// https://state-machine.com
|
||||
// mailto:info@state-machine.com
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @file
|
||||
/// @brief PC-Lint 9.x option file for linting QP/C++ applications
|
||||
/// @cond
|
||||
///===========================================================================
|
||||
/// Product: QP/C++
|
||||
/// Last Updated for Version: 5.9.7
|
||||
/// Date of the Last Update: 2017-08-20
|
||||
///
|
||||
/// Q u a n t u m L e a P s
|
||||
/// ---------------------------
|
||||
/// innovating embedded systems
|
||||
///
|
||||
/// Copyright (C) Quantum Leaps. All rights reserved.
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU General Public License as published by
|
||||
/// the Free Software Foundation, either version 3 of the License, or
|
||||
/// (at your option) any later version.
|
||||
///
|
||||
/// Alternatively, this program may be distributed and modified under the
|
||||
/// terms of Quantum Leaps commercial licenses, which expressly supersede
|
||||
/// the GNU General Public License and are specifically designed for
|
||||
/// licensees interested in retaining the proprietary status of their code.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU General 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:
|
||||
/// https://state-machine.com
|
||||
/// info@state-machine.com
|
||||
///============================================================================
|
||||
/// @endcond
|
||||
|
||||
// General
|
||||
-estring(793,6) // ANSI/ISO limit of 6 significant chars exceeded
|
||||
|
@ -1,36 +1,41 @@
|
||||
//============================================================================
|
||||
// Product: PC-Lint 9.x standard option file
|
||||
// Last Updated for Version: 5.4.0
|
||||
// Date of the Last Update: 2015-04-11
|
||||
//
|
||||
// Q u a n t u m L e a P s
|
||||
// ---------------------------
|
||||
// innovating embedded systems
|
||||
//
|
||||
// Copyright (C) 2002-2014 Quantum Leaps, www.state-machine.com.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Alternatively, this program may be distributed and modified under the
|
||||
// terms of Quantum Leaps commercial licenses, which expressly supersede
|
||||
// the GNU General Public License and are specifically designed for
|
||||
// licensees interested in retaining the proprietary status of their code.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General 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:
|
||||
// Web: http://www.state-machine.com
|
||||
// Email: info@state-machine.com
|
||||
//============================================================================
|
||||
/// @file
|
||||
/// @brief PC-Lint 9.x standard option file
|
||||
/// @ingroup lint
|
||||
/// @cond
|
||||
///===========================================================================
|
||||
/// Product: QP/C
|
||||
/// Last Updated for Version: 5.9.7
|
||||
/// Date of the Last Update: 2017-08-20
|
||||
///
|
||||
/// Q u a n t u m L e a P s
|
||||
/// ---------------------------
|
||||
/// innovating embedded systems
|
||||
///
|
||||
/// Copyright (C) Quantum Leaps. All rights reserved.
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU General Public License as published by
|
||||
/// the Free Software Foundation, either version 3 of the License, or
|
||||
/// (at your option) any later version.
|
||||
///
|
||||
/// Alternatively, this program may be distributed and modified under the
|
||||
/// terms of Quantum Leaps commercial licenses, which expressly supersede
|
||||
/// the GNU General Public License and are specifically designed for
|
||||
/// licensees interested in retaining the proprietary status of their code.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU General 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:
|
||||
/// https://state-machine.com
|
||||
/// info@state-machine.com
|
||||
///============================================================================
|
||||
/// @endcond
|
||||
|
||||
// output: a single line, file info always, use full path names
|
||||
-hF1
|
||||
|
@ -1,36 +1,41 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Product: PC-Lint 9.x option file for linting QP/C++
|
||||
// Last updated for version 5.9.1
|
||||
// Last updated on 2017-05-25
|
||||
//
|
||||
// Q u a n t u m L e a P s
|
||||
// ---------------------------
|
||||
// innovating embedded systems
|
||||
//
|
||||
// Copyright (C) Quantum Leaps, LLC. All rights reserved.
|
||||
//
|
||||
// This program is open source software: you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License as published
|
||||
// by the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Alternatively, this program may be distributed and modified under the
|
||||
// terms of Quantum Leaps commercial licenses, which expressly supersede
|
||||
// the GNU General Public License and are specifically designed for
|
||||
// licensees interested in retaining the proprietary status of their code.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
// Contact information:
|
||||
// http://www.state-machine.com
|
||||
// mailto:info@state-machine.com
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @file
|
||||
/// @brief PC-Lint 9.x option file for linting QP/C++ source code
|
||||
/// @cond
|
||||
///===========================================================================
|
||||
/// Product: QP/C++
|
||||
/// Last Updated for Version: 5.9.7
|
||||
/// Date of the Last Update: 2017-08-20
|
||||
///
|
||||
/// Q u a n t u m L e a P s
|
||||
/// ---------------------------
|
||||
/// innovating embedded systems
|
||||
///
|
||||
/// Copyright (C) Quantum Leaps. All rights reserved.
|
||||
///
|
||||
/// This program is free software: you can redistribute it and/or modify
|
||||
/// it under the terms of the GNU General Public License as published by
|
||||
/// the Free Software Foundation, either version 3 of the License, or
|
||||
/// (at your option) any later version.
|
||||
///
|
||||
/// Alternatively, this program may be distributed and modified under the
|
||||
/// terms of Quantum Leaps commercial licenses, which expressly supersede
|
||||
/// the GNU General Public License and are specifically designed for
|
||||
/// licensees interested in retaining the proprietary status of their code.
|
||||
///
|
||||
/// This program is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
/// GNU General 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:
|
||||
/// https://state-machine.com
|
||||
/// info@state-machine.com
|
||||
///============================================================================
|
||||
/// @endcond
|
||||
|
||||
|
||||
// library headers
|
||||
+libclass() // lint all header files, including "foreign"
|
||||
|
@ -2,8 +2,8 @@
|
||||
/// @brief QF/C++ port to POSIX/P-threads
|
||||
/// @cond
|
||||
///***************************************************************************
|
||||
/// Last updated for version 5.8.2
|
||||
/// Last updated on 2016-12-22
|
||||
/// Last updated for version 5.9.7
|
||||
/// Last updated on 2017-08-25
|
||||
///
|
||||
/// Q u a n t u m L e a P s
|
||||
/// ---------------------------
|
||||
@ -56,7 +56,8 @@ Q_DEFINE_THIS_MODULE("qf_port")
|
||||
pthread_mutex_t QF_pThreadMutex_;
|
||||
|
||||
// Local-scope objects -------------------------------------------------------
|
||||
static bool l_running;
|
||||
static pthread_mutex_t l_startupMutex;
|
||||
static bool l_isRunning;
|
||||
static struct timespec l_tick;
|
||||
enum { NANOSLEEP_NSEC_PER_SEC = 1000000000 }; // see NOTE05
|
||||
|
||||
@ -70,6 +71,13 @@ void QF::init(void) {
|
||||
// init the global mutex with the default non-recursive initializer
|
||||
pthread_mutex_init(&QF_pThreadMutex_, NULL);
|
||||
|
||||
// init the startup mutex with the default non-recursive initializer
|
||||
pthread_mutex_init(&l_startupMutex, NULL);
|
||||
|
||||
// lock the startup mutex to block any active objects started before
|
||||
// calling QF::run()
|
||||
pthread_mutex_lock(&l_startupMutex);
|
||||
|
||||
// clear the internal QF variables, so that the framework can (re)start
|
||||
// correctly even if the startup code is not called to clear the
|
||||
// uninitialized data (as is required by the C++ Standard).
|
||||
@ -96,13 +104,18 @@ int_t QF::run(void) {
|
||||
// setting priority failed, probably due to insufficient privieges
|
||||
}
|
||||
|
||||
l_running = true;
|
||||
while (l_running) { // the clock tick loop...
|
||||
// unlock the startup mutex to unblock any active objects started before
|
||||
// calling QF::run()
|
||||
pthread_mutex_unlock(&l_startupMutex);
|
||||
|
||||
l_isRunning = true;
|
||||
while (l_isRunning) { // the clock tick loop...
|
||||
QF_onClockTick(); // clock tick callback (must call QF_TICK_X())
|
||||
|
||||
nanosleep(&l_tick, NULL); // sleep for the number of ticks, NOTE05
|
||||
}
|
||||
onCleanup(); // invoke cleanup callback
|
||||
pthread_mutex_destroy(&l_startupMutex);
|
||||
pthread_mutex_destroy(&QF_pThreadMutex_);
|
||||
return static_cast<int_t>(0); // return success
|
||||
}
|
||||
@ -112,10 +125,14 @@ void QF_setTickRate(uint32_t ticksPerSec) {
|
||||
}
|
||||
//............................................................................
|
||||
void QF::stop(void) {
|
||||
l_running = false; // stop the loop in QF::run()
|
||||
l_isRunning = false; // stop the loop in QF::run()
|
||||
}
|
||||
//............................................................................
|
||||
void QF::thread_(QActive *act) {
|
||||
// block this thread until the startup mutex is unlocked from QF::run()
|
||||
pthread_mutex_lock(&l_startupMutex);
|
||||
pthread_mutex_unlock(&l_startupMutex);
|
||||
|
||||
// loop until m_thread is cleared in QActive::stop()
|
||||
do {
|
||||
QEvt const *e = act->get_(); // wait for event
|
||||
|
@ -2,8 +2,8 @@
|
||||
/// \brief QF/C++ port to Win32 API
|
||||
/// \cond
|
||||
///***************************************************************************
|
||||
/// Last updated for version 5.8.2
|
||||
/// Last updated on 2016-12-22
|
||||
/// Last updated for version 5.9.7
|
||||
/// Last updated on 2017-08-25
|
||||
///
|
||||
/// Q u a n t u m L e a P s
|
||||
/// ---------------------------
|
||||
@ -53,6 +53,7 @@ Q_DEFINE_THIS_MODULE("qf_port")
|
||||
|
||||
// Local objects *************************************************************
|
||||
static CRITICAL_SECTION l_win32CritSect;
|
||||
static CRITICAL_SECTION l_startupCritSect;
|
||||
static DWORD l_tickMsec = 10U; // clock tick in msec (argument for Sleep())
|
||||
static bool l_isRunning; // flag indicating when QF is running
|
||||
|
||||
@ -60,6 +61,11 @@ static bool l_isRunning; // flag indicating when QF is running
|
||||
void QF::init(void) {
|
||||
InitializeCriticalSection(&l_win32CritSect);
|
||||
|
||||
// initialize and enter the startup critical section object to block
|
||||
// any active objects started before calling QF::run()
|
||||
InitializeCriticalSection(&l_startupCritSect);
|
||||
EnterCriticalSection(&l_startupCritSect);
|
||||
|
||||
// clear the internal QF variables, so that the framework can (re)start
|
||||
// correctly even if the startup code is not called to clear the
|
||||
// uninitialized data (as is required by the C++ Standard).
|
||||
@ -83,6 +89,11 @@ void QF::stop(void) {
|
||||
}
|
||||
//****************************************************************************
|
||||
void QF::thread_(QActive *act) {
|
||||
// block this thread until the startup critical section is exited
|
||||
// from QF::run()
|
||||
EnterCriticalSection(&l_startupCritSect);
|
||||
LeaveCriticalSection(&l_startupCritSect);
|
||||
|
||||
// loop until m_thread is cleared in QActive::stop()
|
||||
do {
|
||||
QEvt const *e = act->get_(); // wait for event
|
||||
@ -104,6 +115,10 @@ static DWORD WINAPI ao_thread(LPVOID me) {
|
||||
int_t QF::run(void) {
|
||||
onStartup(); // startup callback
|
||||
|
||||
// leave the startup critical section to unblock any active objects
|
||||
// started before calling QF::run()
|
||||
LeaveCriticalSection(&l_startupCritSect);
|
||||
|
||||
l_isRunning = true; // QF is running
|
||||
|
||||
// set the ticker thread priority below normal to prevent
|
||||
@ -119,6 +134,7 @@ int_t QF::run(void) {
|
||||
|
||||
onCleanup(); // cleanup callback
|
||||
QS_EXIT(); // cleanup the QSPY connection
|
||||
//DeleteCriticalSection(&l_startupCritSect);
|
||||
//DeleteCriticalSection(&l_win32CritSect);
|
||||
return static_cast<int_t>(0); // return success
|
||||
}
|
||||
@ -160,7 +176,7 @@ void QActive::start(uint_fast8_t prio,
|
||||
m_osObject = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
|
||||
this->init(ie); // execute initial transition (virtual call)
|
||||
QS_FLUSH(); /* flush the QS trace buffer to the host */
|
||||
QS_FLUSH(); // flush the QS trace buffer to the host
|
||||
|
||||
// stack size not provided?
|
||||
if (stkSize == 0U) {
|
||||
|
@ -2,8 +2,8 @@
|
||||
/// @brief QF/C++ dynamic event management
|
||||
/// @cond
|
||||
///***************************************************************************
|
||||
/// Last updated for version 5.9.3
|
||||
/// Last updated on 2017-06-19
|
||||
/// Last updated for version 5.9.7
|
||||
/// Last updated on 2017-08-25
|
||||
///
|
||||
/// Q u a n t u m L e a P s
|
||||
/// ---------------------------
|
||||
@ -196,7 +196,7 @@ QEvt *QF::newX_(uint_fast16_t const evtSize,
|
||||
///
|
||||
void QF::gc(QEvt const * const e) {
|
||||
// is it a dynamic event?
|
||||
if (QF_EVT_POOL_ID_(e) != static_cast<uint8_t>(0)) {
|
||||
if (e->poolId_ != static_cast<uint8_t>(0)) {
|
||||
QF_CRIT_STAT_
|
||||
QF_CRIT_ENTRY_();
|
||||
|
||||
@ -255,15 +255,15 @@ void QF::gc(QEvt const * const e) {
|
||||
/// The only allowed use is thorough the macro Q_NEW_REF().
|
||||
///
|
||||
QEvt const *QF::newRef_(QEvt const * const e, QEvt const * const evtRef) {
|
||||
// the provided event reference must not be in use
|
||||
Q_REQUIRE_ID(500, evtRef == static_cast<QEvt const *>(0));
|
||||
//! @pre the event must be dynamic and the provided event reference
|
||||
//! must not be already in use
|
||||
Q_REQUIRE_ID(500,
|
||||
(e->poolId_ != static_cast<uint8_t>(0))
|
||||
&& (evtRef == static_cast<QEvt const *>(0)));
|
||||
|
||||
QF_CRIT_STAT_
|
||||
QF_CRIT_ENTRY_();
|
||||
// is the current event dynamic?
|
||||
if (e->poolId_ != static_cast<uint8_t>(0)) {
|
||||
QF_EVT_REF_CTR_INC_(e); // increments the ref counter
|
||||
}
|
||||
QF_EVT_REF_CTR_INC_(e); // increments the ref counter
|
||||
QF_CRIT_EXIT_();
|
||||
|
||||
return e;
|
||||
|
10
src/qf_pkg.h
10
src/qf_pkg.h
@ -3,8 +3,8 @@
|
||||
/// @brief Internal (package scope) QF/C++ interface.
|
||||
/// @cond
|
||||
///***************************************************************************
|
||||
/// Last updated for version 5.8.0
|
||||
/// Last updated on 2016-11-29
|
||||
/// Last updated for version 5.9.7
|
||||
/// Last updated on 2017-08-25
|
||||
///
|
||||
/// Q u a n t u m L e a P s
|
||||
/// ---------------------------
|
||||
@ -101,12 +101,6 @@ struct QFreeBlock {
|
||||
//****************************************************************************
|
||||
// internal helper inline functions
|
||||
|
||||
//! access to the poolId_ of an event @p e
|
||||
inline uint8_t QF_EVT_POOL_ID_(QEvt const * const e) { return e->poolId_; }
|
||||
|
||||
//! access to the refCtr_ of an event @p e
|
||||
inline uint8_t QF_EVT_REF_CTR_(QEvt const * const e) { return e->refCtr_; }
|
||||
|
||||
//! increment the refCtr_ of an event @p e
|
||||
inline void QF_EVT_REF_CTR_INC_(QEvt const * const e) {
|
||||
++(QF_EVT_CONST_CAST_(e))->refCtr_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user