From 422d4123dc80c257252c61e7088543f1c09e9458 Mon Sep 17 00:00:00 2001 From: rusefi Date: Wed, 29 Mar 2017 20:13:34 -0400 Subject: [PATCH] reducing size --- doc/common/rsc/custom.css | 1452 ---------- doc/common/rsc/footer_chm.html | 4 - doc/common/rsc/footer_html.html | 21 - doc/common/rsc/header_chm.html | 55 - doc/common/rsc/header_html.html | 66 - doc/common/rsc/layout.xml | 194 -- doc/common/rsc/logo.png | Bin 16818 -> 0 bytes doc/hal/Doxyfile_chm | 2417 ----------------- doc/hal/Doxyfile_html | 2417 ----------------- doc/hal/index.html | 8 - doc/hal/makechm.bat | 5 - doc/hal/makehtml.bat | 5 - doc/hal/makehtml.sh | 6 - doc/hal/readme.txt | 11 - doc/hal/reports/misra.txt | 84 - doc/hal/rsync_web.sh | 2 - doc/hal/src/main.dox | 38 - doc/nil/Doxyfile_chm | 2416 ---------------- doc/nil/Doxyfile_html | 2416 ---------------- doc/nil/index.html | 8 - doc/nil/makechm.bat | 5 - doc/nil/makehtml.bat | 5 - doc/nil/makehtml.sh | 6 - doc/nil/readme.txt | 11 - doc/nil/reports/SPC560D-48-GCC.txt | 32 - doc/nil/reports/STM32F303-72-GCC.txt | 32 - doc/nil/reports/misra.txt | 12 - doc/nil/rsc/workspace.eps | 870 ------ doc/nil/rsc/workspace.png | Bin 20994 -> 0 bytes doc/nil/rsc/workspace.svg | 280 -- doc/nil/rsync_web.sh | 2 - doc/nil/src/main.dox | 45 - doc/rt/Doxyfile_chm | 2417 ----------------- doc/rt/Doxyfile_html | 2417 ----------------- doc/rt/index.html | 8 - doc/rt/makechm.bat | 5 - doc/rt/makehtml.bat | 5 - doc/rt/makehtml.sh | 6 - doc/rt/readme.txt | 11 - doc/rt/reports/LPC2148-48-ARM.txt | 174 -- doc/rt/reports/LPC2148-48-THUMB.txt | 174 -- doc/rt/reports/SPC560D-48-CW.txt | 164 -- doc/rt/reports/SPC560D-48-GCC.txt | 164 -- doc/rt/reports/SPC560P-64-GCC.txt | 164 -- doc/rt/reports/SPC563M-80-GCC.txt | 164 -- doc/rt/reports/SPC56EC-120-CW.txt | 163 -- doc/rt/reports/SPC56EC-120-GCC.txt | 163 -- doc/rt/reports/SPC56EL-120-GCC.txt | 164 -- doc/rt/reports/STM32F051-48-GCC.txt | 164 -- doc/rt/reports/STM32F303-72-GCC-FPU.txt | 164 -- doc/rt/reports/STM32F303-72-GCC.txt | 164 -- doc/rt/reports/STM32F303-72-IAR-FPU.txt | 164 -- doc/rt/reports/STM32F303-72-IAR.txt | 164 -- doc/rt/reports/STM32F303-72-RVCT-FPU.txt | 164 -- doc/rt/reports/STM32F303-72-RVCT.txt | 164 -- doc/rt/reports/STM32F407-168-GCC-FPU.txt | 164 -- doc/rt/reports/STM32F407-168-GCC.txt | 164 -- doc/rt/reports/STM32F746-216-GCC-FPU.txt | 164 -- doc/rt/reports/STM32F746-216-GCC.txt | 164 -- doc/rt/reports/STM32L053-32-GCC.txt | 164 -- doc/rt/reports/STM32L152-32-GCC.txt | 164 -- doc/rt/reports/STM32L476-80-GCC-FPU.txt | 164 -- doc/rt/reports/STM32L476-80-GCC.txt | 164 -- doc/rt/reports/testbuild.7z | Bin 169568 -> 0 bytes doc/rt/rsc/workspace.eps | 870 ------ doc/rt/rsc/workspace.png | Bin 20994 -> 0 bytes doc/rt/rsc/workspace.svg | 280 -- doc/rt/rsync_web.sh | 2 - doc/rt/src/concepts.dox | 409 --- doc/rt/src/main.dox | 63 - os/hal/osal/nil/osal.c | 115 - os/hal/osal/nil/osal.h | 920 ------- os/hal/osal/nil/osal.mk | 5 - os/nil/dox/nil.dox | 50 - os/nil/include/nil.h | 1003 ------- os/nil/nil.mk | 5 - .../ports/ARMCMx/compilers/GCC/mk/port_v6m.mk | 8 - .../ports/ARMCMx/compilers/GCC/mk/port_v7m.mk | 8 - .../ARMCMx/compilers/GCC/nilcoreasm_v6m.s | 124 - .../ARMCMx/compilers/GCC/nilcoreasm_v7m.s | 130 - os/nil/ports/ARMCMx/compilers/GCC/niltypes.h | 96 - os/nil/ports/ARMCMx/nilcore.c | 54 - os/nil/ports/ARMCMx/nilcore.h | 204 -- os/nil/ports/ARMCMx/nilcore_timer.h | 124 - os/nil/ports/ARMCMx/nilcore_v6m.c | 147 - os/nil/ports/ARMCMx/nilcore_v6m.h | 406 --- os/nil/ports/ARMCMx/nilcore_v7m.c | 165 -- os/nil/ports/ARMCMx/nilcore_v7m.h | 576 ---- os/nil/ports/AVR/compilers/GCC/mk/port.mk | 7 - os/nil/ports/AVR/compilers/GCC/niltypes.h | 96 - os/nil/ports/AVR/nilcore.c | 137 - os/nil/ports/AVR/nilcore.h | 418 --- os/nil/ports/AVR/nilcore_timer.h | 124 - os/nil/src/nil.c | 832 ------ os/nil/templates/nilconf.h | 179 -- os/nil/templates/nilcore.c | 54 - os/nil/templates/nilcore.h | 379 --- os/nil/templates/nilcore_timer.h | 120 - os/nil/templates/niltypes.h | 96 - test/nil/test.mk | 9 - test/nil/test_root.c | 81 - test/nil/test_root.h | 64 - test/nil/test_sequence_001.c | 183 -- test/nil/test_sequence_001.h | 22 - test/nil/test_sequence_002.c | 437 --- test/nil/test_sequence_002.h | 22 - test/nil/testbuild/.cproject | 52 - test/nil/testbuild/.project | 95 - test/nil/testbuild/Makefile | 222 -- test/nil/testbuild/main.c | 58 - test/nil/testbuild/nilconf.h | 179 -- test/nil/testbuild/pclint/au-misra3.lnt | 2173 --------------- test/nil/testbuild/pclint/co-gcc.h | 129 - test/nil/testbuild/pclint/co-gcc.lnt | 209 -- .../nil/testbuild/pclint/gcc-include-path.lnt | 6 - test/nil/testbuild/pclint/lint_cmac.h | 330 --- test/nil/testbuild/pclint/lint_cppmac.h | 336 --- test/nil/testbuild/pclint/size-options.lnt | 1 - test/nil/testbuild/pclint/waivers.lnt | 116 - 119 files changed, 34678 deletions(-) delete mode 100644 doc/common/rsc/custom.css delete mode 100644 doc/common/rsc/footer_chm.html delete mode 100644 doc/common/rsc/footer_html.html delete mode 100644 doc/common/rsc/header_chm.html delete mode 100644 doc/common/rsc/header_html.html delete mode 100644 doc/common/rsc/layout.xml delete mode 100644 doc/common/rsc/logo.png delete mode 100644 doc/hal/Doxyfile_chm delete mode 100644 doc/hal/Doxyfile_html delete mode 100644 doc/hal/index.html delete mode 100644 doc/hal/makechm.bat delete mode 100644 doc/hal/makehtml.bat delete mode 100755 doc/hal/makehtml.sh delete mode 100644 doc/hal/readme.txt delete mode 100644 doc/hal/reports/misra.txt delete mode 100644 doc/hal/rsync_web.sh delete mode 100644 doc/hal/src/main.dox delete mode 100644 doc/nil/Doxyfile_chm delete mode 100644 doc/nil/Doxyfile_html delete mode 100644 doc/nil/index.html delete mode 100644 doc/nil/makechm.bat delete mode 100644 doc/nil/makehtml.bat delete mode 100755 doc/nil/makehtml.sh delete mode 100644 doc/nil/readme.txt delete mode 100644 doc/nil/reports/SPC560D-48-GCC.txt delete mode 100644 doc/nil/reports/STM32F303-72-GCC.txt delete mode 100644 doc/nil/reports/misra.txt delete mode 100644 doc/nil/rsc/workspace.eps delete mode 100644 doc/nil/rsc/workspace.png delete mode 100644 doc/nil/rsc/workspace.svg delete mode 100644 doc/nil/rsync_web.sh delete mode 100644 doc/nil/src/main.dox delete mode 100644 doc/rt/Doxyfile_chm delete mode 100644 doc/rt/Doxyfile_html delete mode 100644 doc/rt/index.html delete mode 100644 doc/rt/makechm.bat delete mode 100644 doc/rt/makehtml.bat delete mode 100755 doc/rt/makehtml.sh delete mode 100644 doc/rt/readme.txt delete mode 100644 doc/rt/reports/LPC2148-48-ARM.txt delete mode 100644 doc/rt/reports/LPC2148-48-THUMB.txt delete mode 100644 doc/rt/reports/SPC560D-48-CW.txt delete mode 100644 doc/rt/reports/SPC560D-48-GCC.txt delete mode 100644 doc/rt/reports/SPC560P-64-GCC.txt delete mode 100644 doc/rt/reports/SPC563M-80-GCC.txt delete mode 100644 doc/rt/reports/SPC56EC-120-CW.txt delete mode 100644 doc/rt/reports/SPC56EC-120-GCC.txt delete mode 100644 doc/rt/reports/SPC56EL-120-GCC.txt delete mode 100644 doc/rt/reports/STM32F051-48-GCC.txt delete mode 100644 doc/rt/reports/STM32F303-72-GCC-FPU.txt delete mode 100644 doc/rt/reports/STM32F303-72-GCC.txt delete mode 100644 doc/rt/reports/STM32F303-72-IAR-FPU.txt delete mode 100644 doc/rt/reports/STM32F303-72-IAR.txt delete mode 100644 doc/rt/reports/STM32F303-72-RVCT-FPU.txt delete mode 100644 doc/rt/reports/STM32F303-72-RVCT.txt delete mode 100644 doc/rt/reports/STM32F407-168-GCC-FPU.txt delete mode 100644 doc/rt/reports/STM32F407-168-GCC.txt delete mode 100644 doc/rt/reports/STM32F746-216-GCC-FPU.txt delete mode 100644 doc/rt/reports/STM32F746-216-GCC.txt delete mode 100644 doc/rt/reports/STM32L053-32-GCC.txt delete mode 100644 doc/rt/reports/STM32L152-32-GCC.txt delete mode 100644 doc/rt/reports/STM32L476-80-GCC-FPU.txt delete mode 100644 doc/rt/reports/STM32L476-80-GCC.txt delete mode 100644 doc/rt/reports/testbuild.7z delete mode 100644 doc/rt/rsc/workspace.eps delete mode 100644 doc/rt/rsc/workspace.png delete mode 100644 doc/rt/rsc/workspace.svg delete mode 100644 doc/rt/rsync_web.sh delete mode 100644 doc/rt/src/concepts.dox delete mode 100644 doc/rt/src/main.dox delete mode 100644 os/hal/osal/nil/osal.c delete mode 100644 os/hal/osal/nil/osal.h delete mode 100644 os/hal/osal/nil/osal.mk delete mode 100644 os/nil/dox/nil.dox delete mode 100644 os/nil/include/nil.h delete mode 100644 os/nil/nil.mk delete mode 100644 os/nil/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk delete mode 100644 os/nil/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk delete mode 100644 os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v6m.s delete mode 100644 os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v7m.s delete mode 100644 os/nil/ports/ARMCMx/compilers/GCC/niltypes.h delete mode 100644 os/nil/ports/ARMCMx/nilcore.c delete mode 100644 os/nil/ports/ARMCMx/nilcore.h delete mode 100644 os/nil/ports/ARMCMx/nilcore_timer.h delete mode 100644 os/nil/ports/ARMCMx/nilcore_v6m.c delete mode 100644 os/nil/ports/ARMCMx/nilcore_v6m.h delete mode 100644 os/nil/ports/ARMCMx/nilcore_v7m.c delete mode 100644 os/nil/ports/ARMCMx/nilcore_v7m.h delete mode 100644 os/nil/ports/AVR/compilers/GCC/mk/port.mk delete mode 100644 os/nil/ports/AVR/compilers/GCC/niltypes.h delete mode 100644 os/nil/ports/AVR/nilcore.c delete mode 100644 os/nil/ports/AVR/nilcore.h delete mode 100644 os/nil/ports/AVR/nilcore_timer.h delete mode 100644 os/nil/src/nil.c delete mode 100644 os/nil/templates/nilconf.h delete mode 100644 os/nil/templates/nilcore.c delete mode 100644 os/nil/templates/nilcore.h delete mode 100644 os/nil/templates/nilcore_timer.h delete mode 100644 os/nil/templates/niltypes.h delete mode 100644 test/nil/test.mk delete mode 100644 test/nil/test_root.c delete mode 100644 test/nil/test_root.h delete mode 100644 test/nil/test_sequence_001.c delete mode 100644 test/nil/test_sequence_001.h delete mode 100644 test/nil/test_sequence_002.c delete mode 100644 test/nil/test_sequence_002.h delete mode 100644 test/nil/testbuild/.cproject delete mode 100644 test/nil/testbuild/.project delete mode 100644 test/nil/testbuild/Makefile delete mode 100644 test/nil/testbuild/main.c delete mode 100644 test/nil/testbuild/nilconf.h delete mode 100644 test/nil/testbuild/pclint/au-misra3.lnt delete mode 100644 test/nil/testbuild/pclint/co-gcc.h delete mode 100644 test/nil/testbuild/pclint/co-gcc.lnt delete mode 100644 test/nil/testbuild/pclint/gcc-include-path.lnt delete mode 100644 test/nil/testbuild/pclint/lint_cmac.h delete mode 100644 test/nil/testbuild/pclint/lint_cppmac.h delete mode 100644 test/nil/testbuild/pclint/size-options.lnt delete mode 100644 test/nil/testbuild/pclint/waivers.lnt diff --git a/doc/common/rsc/custom.css b/doc/common/rsc/custom.css deleted file mode 100644 index 6fb69608e..000000000 --- a/doc/common/rsc/custom.css +++ /dev/null @@ -1,1452 +0,0 @@ -/* The standard CSS for doxygen 1.8.8 */ - -body, table, div, p, dl { - font: 400 14px/22px Roboto,sans-serif; -} - -/* @group Heading Levels */ - -h1.groupheader { - font-size: 150%; -} - -.title { - font: 400 14px/28px Roboto,sans-serif; - font-size: 150%; - font-weight: bold; - margin: 10px 2px; -} - -h2.groupheader { - border-bottom: 1px solid #879ECB; - color: #354C7B; - font-size: 120%; - font-weight: normal; - margin-top: 1.75em; - padding-top: 8px; - padding-bottom: 4px; - width: 100%; -} - -h3.groupheader { - font-size: 100%; -} - -h1 { - font-size: 150%; -} - -h2 { - font-size: 120%; -} - -h3 { - font-size: 120%; -} - -h1, h2, h3, h4, h5, h6 { - -webkit-transition: text-shadow 0.5s linear; - -moz-transition: text-shadow 0.5s linear; - -ms-transition: text-shadow 0.5s linear; - -o-transition: text-shadow 0.5s linear; - transition: text-shadow 0.5s linear; - margin-right: 15px; -} - -h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px cyan; -} - -dt { - font-weight: bold; -} - -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; -} - -p.startli, p.startdd { - margin-top: 2px; -} - -p.starttd { - margin-top: 0px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #3D578C; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #4665A2; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #ffffff; - border: 1px double #869DCA; -} - -.contents a.qindexHL:visited { - color: #ffffff; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; -} - -a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; - font-family: monospace, fixed; - font-size: 105%; -} - -div.fragment { - padding: 4px 6px; - margin: 4px 8px 4px 2px; - background-color: #FBFCFD; - border: 1px solid #C4CFE5; -} - -div.line { - font-family: monospace, fixed; - font-size: 13px; - min-height: 13px; - line-height: 1.0; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - text-indent: -53px; - padding-left: 53px; - padding-bottom: 0px; - margin: 0px; - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -div.line.glow { - background-color: cyan; - box-shadow: 0 0 10px cyan; -} - - -span.lineno { - padding-right: 4px; - text-align: right; - border-right: 2px solid #0F0; - background-color: #E8E8E8; - white-space: pre; -} -span.lineno a { - background-color: #D8D8D8; -} - -span.lineno a:hover { - background-color: #C8C8C8; -} - -div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background-color: white; - color: black; - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 12px; - margin-right: 8px; -} - -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; - white-space: nowrap; - vertical-align: top; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EEF1F7; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -blockquote { - background-color: #F7F8FB; - border-left: 2px solid #9CAFD4; - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; -} - -/* @end */ - -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A3B4D7; -} - -th.dirtab { - background: #EBEFF6; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #4A6AAA; -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.memberdecls td, .fieldtable tr { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -.memberdecls td.glow, .fieldtable tr.glow { - background-color: cyan; - box-shadow: 0 0 15px cyan; -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memSeparator { - border-bottom: 1px solid #DEE4F0; - line-height: 1px; - margin: 0px; - padding: 0px; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memItemRight { - width: 100%; -} - -.memTemplParams { - color: #4665A2; - white-space: nowrap; - font-size: 80%; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #4665A2; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.mempage { - width: 100%; -} - -.memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; - -webkit-transition: box-shadow 0.5s linear; - -moz-transition: box-shadow 0.5s linear; - -ms-transition: box-shadow 0.5s linear; - -o-transition: box-shadow 0.5s linear; - transition: box-shadow 0.5s linear; - display: table !important; - width: 100%; -} - -.memitem.glow { - box-shadow: 0 0 15px cyan; -} - -.memname { - font-weight: bold; - margin-left: 6px; -} - -.memname td { - vertical-align: bottom; -} - -.memproto, dl.reflist dt { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 0px 6px 0px; - color: #253555; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; - border-top-left-radius: 4px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - -} - -.memdoc, dl.reflist dd { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 10px 2px 10px; - background-color: #FBFCFD; - border-top-width: 0; - background-image:url('nav_g.png'); - background-repeat:repeat-x; - background-color: #FFFFFF; - /* opera specific markup */ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -dl.reflist dt { - padding: 5px; -} - -dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} -.paramname code { - line-height: 14px; -} - -.params, .retval, .exception, .tparams { - margin-left: 0px; - padding-left: 0px; -} - -.params .paramname, .retval .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; -} - -table.mlabels { - border-spacing: 0px; -} - -td.mlabels-left { - width: 100%; - padding: 0px; -} - -td.mlabels-right { - vertical-align: bottom; - padding: 0px; - white-space: nowrap; -} - -span.mlabels { - margin-left: 8px; -} - -span.mlabel { - background-color: #728DC1; - border-top:1px solid #5373B4; - border-left:1px solid #5373B4; - border-right:1px solid #C4CFE5; - border-bottom:1px solid #C4CFE5; - text-shadow: none; - color: white; - margin-right: 4px; - padding: 2px 3px; - border-radius: 3px; - font-size: 7pt; - white-space: nowrap; - vertical-align: middle; -} - - - -/* @end */ - -/* these are for tree view inside a (index) page */ - -div.directory { - margin: 10px 0px; - border-top: 1px solid #9CAFD4; - border-bottom: 1px solid #9CAFD4; - width: 100%; -} - -.directory table { - border-collapse:collapse; -} - -.directory td { - margin: 0px; - padding: 0px; - vertical-align: top; -} - -.directory td.entry { - white-space: nowrap; - padding-right: 6px; - padding-top: 3px; -} - -.directory td.entry a { - outline:none; -} - -.directory td.entry a img { - border: none; -} - -.directory td.desc { - width: 100%; - padding-left: 6px; - padding-right: 6px; - padding-top: 3px; - border-left: 1px solid rgba(0,0,0,0.05); -} - -.directory tr.even { - padding-left: 6px; - background-color: #F7F8FB; -} - -.directory img { - vertical-align: -30%; -} - -.directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt; -} - -.directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; - color: #3D578C; -} - -.arrow { - color: #9CAFD4; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - display: inline-block; - width: 16px; - height: 22px; -} - -.icon { - font-family: Arial, Helvetica; - font-weight: bold; - font-size: 12px; - height: 14px; - width: 16px; - display: inline-block; - background-color: #728DC1; - color: white; - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px; -} - -.icona { - width: 24px; - height: 22px; - display: inline-block; -} - -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('ftv2folderopen.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.iconfclosed { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('ftv2folderclosed.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('ftv2doc.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -table.directory { - font: 400 14px Roboto,sans-serif; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -address { - font-style: normal; - color: #2A3D61; -} - -table.doxtable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -table.fieldtable { - /*width: 100%;*/ - margin-bottom: 10px; - border: 1px solid #A8B8D9; - border-spacing: 0px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); -} - -.fieldtable td, .fieldtable th { - padding: 3px 7px 2px; -} - -.fieldtable td.fieldtype, .fieldtable td.fieldname { - white-space: nowrap; - border-right: 1px solid #A8B8D9; - border-bottom: 1px solid #A8B8D9; - vertical-align: top; -} - -.fieldtable td.fieldname { - padding-top: 3px; -} - -.fieldtable td.fielddoc { - border-bottom: 1px solid #A8B8D9; - /*width: 100%;*/ -} - -.fieldtable td.fielddoc p:first-child { - margin-top: 0px; -} - -.fieldtable td.fielddoc p:last-child { - margin-bottom: 2px; -} - -.fieldtable tr:last-child td { - border-bottom: none; -} - -.fieldtable th { - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - font-size: 90%; - color: #253555; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid #A8B8D9; -} - - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - background-position: 0 -5px; - height:30px; - line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#364D7C; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; - color: #283A5D; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; -} - -.navpath li.navelem a:hover -{ - color:#6884BD; -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#364D7C; - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -div.ingroups -{ - font-size: 8pt; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - margin: 0px; - border-bottom: 1px solid #C4CFE5; -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -dl -{ - padding: 0 0 0 10px; -} - -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ -dl.section -{ - margin-left: 0px; - padding-left: 0px; -} - -dl.note -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #D0C000; -} - -dl.warning, dl.attention -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #00D000; -} - -dl.deprecated -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #505050; -} - -dl.todo -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #00C0E0; -} - -dl.test -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #3030E0; -} - -dl.bug -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #C08050; -} - -dl.section dd { - margin-bottom: 6px; -} - - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectname -{ - font: 200% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 2px 0px; -} - -#projectbrief -{ - font: 120% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font: 50% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #5373B4; -} - -.image -{ - text-align: center; -} - -.dotgraph -{ - text-align: center; -} - -.mscgraph -{ - text-align: center; -} - -.diagraph -{ - text-align: center; -} - -.caption -{ - font-weight: bold; -} - -div.zoom -{ - border: 1px solid #90A5CE; -} - -dl.citelist { - margin-bottom:50px; -} - -dl.citelist dt { - color:#334975; - float:left; - font-weight:bold; - margin-right:10px; - padding:5px; -} - -dl.citelist dd { - margin:2px 0; - padding:5px 0; -} - -div.toc { - padding: 14px 25px; - background-color: #F4F6FA; - border: 1px solid #D8DFEE; - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 20px 10px 10px; - width: 200px; -} - -div.toc li { - background: url("bdwn.png") no-repeat scroll 0 5px transparent; - font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; - margin-top: 5px; - padding-left: 10px; - padding-top: 2px; -} - -div.toc h3 { - font: bold 12px/1.2 Arial,FreeSans,sans-serif; - color: #4665A2; - border-bottom: 0 none; - margin: 0; -} - -div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0px; -} - -div.toc li.level1 { - margin-left: 0px; -} - -div.toc li.level2 { - margin-left: 15px; -} - -div.toc li.level3 { - margin-left: 30px; -} - -div.toc li.level4 { - margin-left: 45px; -} - -.inherit_header { - font-weight: bold; - color: gray; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.inherit_header td { - padding: 6px 0px 2px 5px; -} - -.inherit { - display: none; -} - -tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px; -} - -/* tooltip related style info */ - -.ttc { - position: absolute; - display: none; -} - -#powerTip { - cursor: default; - white-space: nowrap; - background-color: white; - border: 1px solid gray; - border-radius: 4px 4px 4px 4px; - box-shadow: 1px 1px 7px gray; - display: none; - font-size: smaller; - max-width: 80%; - opacity: 0.9; - padding: 1ex 1em 1em; - position: absolute; - z-index: 2147483647; -} - -#powerTip div.ttdoc { - color: grey; - font-style: italic; -} - -#powerTip div.ttname a { - font-weight: bold; -} - -#powerTip div.ttname { - font-weight: bold; -} - -#powerTip div.ttdeci { - color: #006318; -} - -#powerTip div { - margin: 0px; - padding: 0px; - font: 12px/16px Roboto,sans-serif; -} - -#powerTip:before, #powerTip:after { - content: ""; - position: absolute; - margin: 0px; -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.s:after, #powerTip.s:before, -#powerTip.w:after, #powerTip.w:before, -#powerTip.e:after, #powerTip.e:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.nw:after, #powerTip.nw:before, -#powerTip.sw:after, #powerTip.sw:before { - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; -} - -#powerTip.n:after, #powerTip.s:after, -#powerTip.w:after, #powerTip.e:after, -#powerTip.nw:after, #powerTip.ne:after, -#powerTip.sw:after, #powerTip.se:after { - border-color: rgba(255, 255, 255, 0); -} - -#powerTip.n:before, #powerTip.s:before, -#powerTip.w:before, #powerTip.e:before, -#powerTip.nw:before, #powerTip.ne:before, -#powerTip.sw:before, #powerTip.se:before { - border-color: rgba(128, 128, 128, 0); -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.nw:after, #powerTip.nw:before { - top: 100%; -} - -#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: #ffffff; - border-width: 10px; - margin: 0px -10px; -} -#powerTip.n:before { - border-top-color: #808080; - border-width: 11px; - margin: 0px -11px; -} -#powerTip.n:after, #powerTip.n:before { - left: 50%; -} - -#powerTip.nw:after, #powerTip.nw:before { - right: 14px; -} - -#powerTip.ne:after, #powerTip.ne:before { - left: 14px; -} - -#powerTip.s:after, #powerTip.s:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.sw:after, #powerTip.sw:before { - bottom: 100%; -} - -#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: #ffffff; - border-width: 10px; - margin: 0px -10px; -} - -#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: #808080; - border-width: 11px; - margin: 0px -11px; -} - -#powerTip.s:after, #powerTip.s:before { - left: 50%; -} - -#powerTip.sw:after, #powerTip.sw:before { - right: 14px; -} - -#powerTip.se:after, #powerTip.se:before { - left: 14px; -} - -#powerTip.e:after, #powerTip.e:before { - left: 100%; -} -#powerTip.e:after { - border-left-color: #ffffff; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.e:before { - border-left-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -#powerTip.w:after, #powerTip.w:before { - right: 100%; -} -#powerTip.w:after { - border-right-color: #ffffff; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.w:before { - border-right-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -@media print -{ - #top { display: none; } - #side-nav { display: none; } - #nav-path { display: none; } - body { overflow:visible; } - h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } - .summary { display: none; } - .memitem { page-break-inside: avoid; } - #doc-content - { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } -} - diff --git a/doc/common/rsc/footer_chm.html b/doc/common/rsc/footer_chm.html deleted file mode 100644 index 6f8038e4f..000000000 --- a/doc/common/rsc/footer_chm.html +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/doc/common/rsc/footer_html.html b/doc/common/rsc/footer_html.html deleted file mode 100644 index f35bb5364..000000000 --- a/doc/common/rsc/footer_html.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - diff --git a/doc/common/rsc/header_chm.html b/doc/common/rsc/header_chm.html deleted file mode 100644 index 06b288c1e..000000000 --- a/doc/common/rsc/header_chm.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - -$projectname: $title -$title - - - -$treeview -$search -$mathjax - -$extrastylesheet - - -
- - -
- - - - - - - - - - - - - - - - - - - - - -
-
$projectname -  $projectnumber -
-
$projectbrief
-
-
$projectbrief
-
$searchbox
-
- - diff --git a/doc/common/rsc/header_html.html b/doc/common/rsc/header_html.html deleted file mode 100644 index d657bba94..000000000 --- a/doc/common/rsc/header_html.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - -$projectname: $title -$title - - - -$treeview -$search -$mathjax - -$extrastylesheet - - -
- - -
- - - - - - - - - - - - - - - - - - - - - -
-
$projectname -  $projectnumber - - -
-
$projectbrief
-
-
$projectbrief
-
$searchbox
-
- - diff --git a/doc/common/rsc/layout.xml b/doc/common/rsc/layout.xml deleted file mode 100644 index 98088c73c..000000000 --- a/doc/common/rsc/layout.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/common/rsc/logo.png b/doc/common/rsc/logo.png deleted file mode 100644 index 7948daefba4efcb498af91a331000ae5ac87c406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16818 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 API, this function can be \ - invoked from within a system lock zone by threads \ - only." \ - "xclass=@par Function Class:\n This is an \ - X-Class API, this function can be \ - invoked from any context." \ - "api=@par Function Class:\n Normal API, this \ - function can be invoked by regular system threads \ - but not from within a lock zone." \ - "notapi=@par Function Class:\n Not an API, this \ - function is for internal use only." \ - "isr=@par Function Class:\n Interrupt handler, \ - this function should not be directly invoked." \ - "init=@par Function Class:\n Initializer, this \ - function just initializes an object and can be \ - invoked before the kernel is initialized." \ - "special=@par Function Class:\n Special function, \ - this function has special requirements see the \ - notes." - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = NO - -# This flag is only useful for Objective-C code. When set to YES local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = YES - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = ../common/rsc/layout.xml - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = YES - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. -# Note: If this tag is empty the current directory is searched. - -INPUT = ./src \ - ../../os/hal/dox \ - ../../os/hal/src \ - ../../os/hal/include \ - ../../os/hal/templates \ - ../../os/hal/templates/osal - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.ddf \ - *.s - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = ../common/rsc \ - ./rsc - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = NO - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = NO - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = NO - -# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# compiled with the --with-libclang option. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = NO - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = ../common/rsc/header_html.html - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = ../common/rsc/footer_html.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = ../common/rsc/custom.css - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra stylesheet files is of importance (e.g. the last -# stylesheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = YES - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = ../../ChibiOS_HAL.chm - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = "\"C:/Program Files (x86)/HTML Help Workshop/hhc.exe\"" - -# The GENERATE_CHI flag controls if a separate .chi index file is generated ( -# YES) or that it should be included in the master .chm file ( NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /T=@Ud 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 - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - Workspace base Workspace top - - - Thread Structure intctx Structure Thread Stack Stack Pointer - - - - Thread Local Storage - chThdLS() Stack Limit - - - extctx Structure INT_REQUIRED_STACK - diff --git a/doc/nil/rsync_web.sh b/doc/nil/rsync_web.sh deleted file mode 100644 index 5b93c922a..000000000 --- a/doc/nil/rsync_web.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -rsync -avP -e ssh --delete --exclude=.* ./html/ gdisirio,chibios@web.sourceforge.net:/home/groups/c/ch/chibios/htdocs/docs3/nil \ No newline at end of file diff --git a/doc/nil/src/main.dox b/doc/nil/src/main.dox deleted file mode 100644 index 04be430b6..000000000 --- a/doc/nil/src/main.dox +++ /dev/null @@ -1,45 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @mainpage Introduction - * @author Giovanni Di Sirio (gdisirio@users.sourceforge.net). - * - *

Why Nil?

- * Of course because it is so small that it is almost nil. - * I wrote Nil because I wanted to experiment with an idea I had - * regarding a minimal RTOS. Basically I wanted to verify how small - * could be an RTOS while retaining useful features. - * - *

Features

- * - Free software, GPL3 licensed. Stable releases include a exception clause - * to the GPL. - * - Designed for realtime applications. - * - Easily portable. - * - Preemptive scheduling. - * - Each thread has its own priority level. - * - Offers tasks, time, semaphores, event flags, timeouts. - * - Fully static. - * - Minimal system requirements: about 700 bytes ROM with all options enabled. - * - Almost totally written in C with little ASM code required for ports. - * - Compatible with ChibiOS/HAL. - * - API compatible with ChibiOS/RT of which, ChibiOS/NIL, is functionally - * a subset. - * . - */ diff --git a/doc/rt/Doxyfile_chm b/doc/rt/Doxyfile_chm deleted file mode 100644 index fcabe40ba..000000000 --- a/doc/rt/Doxyfile_chm +++ /dev/null @@ -1,2417 +0,0 @@ -# Doxyfile 1.8.8 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = ChibiOS/RT - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = 3.2.0 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = . - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = YES - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = NO - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = "C:/Documents and Settings/Administrator/" - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = NO - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a -# new page for each member. If set to NO, the documentation of a member will be -# part of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 2 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = "iclass=@par Function Class:\n This is an \ - I-Class API, this function can be \ - invoked from within a system lock zone by both \ - threads and interrupt handlers." \ - "sclass=@par Function Class:\n This is an \ - S-Class API, this function can be \ - invoked from within a system lock zone by threads \ - only." \ - "xclass=@par Function Class:\n This is an \ - X-Class API, this function can be \ - invoked from any context." \ - "api=@par Function Class:\n Normal API, this \ - function can be invoked by regular system threads \ - but not from within a lock zone." \ - "notapi=@par Function Class:\n Not an API, this \ - function is for internal use only." \ - "isr=@par Function Class:\n Interrupt handler, \ - this function should not be directly invoked." \ - "init=@par Function Class:\n Initializer, this \ - function just initializes an object and can be \ - invoked before the kernel is initialized." \ - "special=@par Function Class:\n Special function, \ - this function has special requirements see the \ - notes." - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = NO - -# This flag is only useful for Objective-C code. When set to YES local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = YES - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = ../common/rsc/layout.xml - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = YES - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. -# Note: If this tag is empty the current directory is searched. - -INPUT = ./src \ - ../../os/rt/dox \ - ../../os/rt/src \ - ../../os/rt/include \ - ../../os/rt/templates \ - ../../test/rt - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.ddf \ - *.s - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = ../common/rsc \ - ./rsc - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = NO - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = NO - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = NO - -# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# compiled with the --with-libclang option. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = NO - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = ../common/rsc/header_html.html - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = ../common/rsc/footer_html.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = ../common/rsc/custom.css - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra stylesheet files is of importance (e.g. the last -# stylesheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = YES - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = ../../ChibiOS_RT.chm - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = "\"C:/Program Files (x86)/HTML Help Workshop/hhc.exe\"" - -# The GENERATE_CHI flag controls if a separate .chi index file is generated ( -# YES) or that it should be included in the master .chm file ( NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /
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ℜUg`0zoh)xFDD4 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 z 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 E0BD}k<^TWy diff --git a/doc/rt/rsc/workspace.eps b/doc/rt/rsc/workspace.eps deleted file mode 100644 index e2c20109b..000000000 --- a/doc/rt/rsc/workspace.eps +++ /dev/null @@ -1,870 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: cairo 1.8.8 (http://cairographics.org) -%%CreationDate: Mon Aug 30 12:09:46 2010 -%%Pages: 1 -%%BoundingBox: 0 0 196 229 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -/cairo_eps_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -/q { gsave } bind def -/Q { grestore } bind def -/cm { 6 array astore concat } bind def -/w { setlinewidth } bind def -/J { setlinecap } bind def -/j { setlinejoin } bind def -/M { setmiterlimit } bind def -/d { setdash } bind def -/m { moveto } bind def -/l { lineto } bind def -/c { curveto } bind def -/h { closepath } bind def -/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto - 0 exch rlineto 0 rlineto closepath } bind def -/S { stroke } bind def -/f { fill } bind def -/f* { eofill } bind def -/B { fill stroke } bind def -/B* { eofill stroke } bind def -/n { newpath } bind def -/W { clip } bind def -/W* { eoclip } bind def -/BT { } bind def -/ET { } bind def -/pdfmark where { pop globaldict /?pdfmark /exec load put } - { globaldict begin /?pdfmark /pop load def /pdfmark - /cleartomark load def end } ifelse -/BDC { mark 3 1 roll /BDC pdfmark } bind def -/EMC { mark /EMC pdfmark } bind def -/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def -/Tj { show currentpoint cairo_store_point } bind def -/TJ { - { - dup - type /stringtype eq - { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse - } forall - currentpoint cairo_store_point -} bind def -/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore - cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def -/Tf { pop /cairo_font exch def /cairo_font_matrix where - { pop cairo_selectfont } if } bind def -/Td { matrix translate cairo_font_matrix matrix concatmatrix dup - /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point - /cairo_font where { pop cairo_selectfont } if } bind def -/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def - cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def -/g { setgray } bind def -/rg { setrgbcolor } bind def -/d1 { setcachedevice } bind def -%%EndProlog -11 dict begin -/FontType 42 def -/FontName /f-0-0 def -/PaintType 0 def -/FontMatrix [ 1 0 0 1 0 0 ] def -/FontBBox [ 0 0 0 0 ] def -/Encoding 256 array def -0 1 255 { Encoding exch /.notdef put } for -Encoding 1 /uni0057 put -Encoding 2 /uni006F put -Encoding 3 /uni0072 put -Encoding 4 /uni006B put -Encoding 5 /uni0073 put -Encoding 6 /uni0070 put -Encoding 7 /uni0061 put -Encoding 8 /uni0063 put -Encoding 9 /uni0065 put -Encoding 10 /uni0020 put -Encoding 11 /uni0062 put -Encoding 12 /uni0074 put -Encoding 13 /uni0054 put -Encoding 14 /uni0068 put -Encoding 15 /uni0064 put -Encoding 16 /uni0053 put -Encoding 17 /uni0075 put -Encoding 18 /uni0069 put -Encoding 19 /uni006E put -Encoding 20 /uni0078 put -Encoding 21 /uni0050 put -Encoding 22 /uni004C put -Encoding 23 /uni006C put -Encoding 24 /uni0067 put -Encoding 25 /uni0028 put -Encoding 26 /uni0029 put -Encoding 27 /uni006D put -Encoding 28 /uni0049 put -Encoding 29 /uni004E put -Encoding 30 /uni005F put -Encoding 31 /uni0052 put -Encoding 32 /uni0045 put -Encoding 33 /uni0051 put -Encoding 34 /uni0055 put -Encoding 35 /uni0044 put -Encoding 36 /uni0041 put -Encoding 37 /uni0043 put -Encoding 38 /uni004B put -/CharStrings 39 dict dup begin -/.notdef 0 def -/uni0057 1 def -/uni006F 2 def -/uni0072 3 def -/uni006B 4 def -/uni0073 5 def -/uni0070 6 def -/uni0061 7 def -/uni0063 8 def -/uni0065 9 def -/uni0020 10 def -/uni0062 11 def -/uni0074 12 def -/uni0054 13 def -/uni0068 14 def -/uni0064 15 def -/uni0053 16 def -/uni0075 17 def -/uni0069 18 def -/uni006E 19 def -/uni0078 20 def -/uni0050 21 def -/uni004C 22 def -/uni006C 23 def -/uni0067 24 def -/uni0028 25 def -/uni0029 26 def -/uni006D 27 def -/uni0049 28 def -/uni004E 29 def -/uni005F 30 def -/uni0052 31 def -/uni0045 32 def -/uni0051 33 def -/uni0055 34 def -/uni0044 35 def -/uni0041 36 def -/uni0043 37 def -/uni004B 38 def -end readonly def -/sfnts [ -<00010000000a008000030020636d617001a2f26900003bb40000008c63767420962ad2760000 -3c40000006306670676dcc79599a000042700000066e676c79668bebc785000000ac00003b08 -68656164ce982692000048e0000000366868656112330c9c0000491800000024686d7478ae81 -10400000493c0000009c6c6f63610004d82c000049d8000000a06d61787004e40ca800004a78 -000000207072657052fec4e900004a9800000aff000201000000050005000003000700002111 -21112521112101000400fc2003c0fc400500fb002004c0000000000100190000077605ba0018 -01db402629002611291226183900361139123618490047114912471858005711581257181098 -08980f02b10602435458403310011a192b153405340c4405440c4b155405540c5b156405640c -6b157405740c7b150f05150c030001120800080f0208020102003f3f3f3f3f111217395d0111 -1239391b401e030405050206070808050a0b0c0c090d0e0f0f0c14131212151617181815b8ff -3cb305001820b8ff3cb30c121120b8ff3c405a15080920000502022001001401010018050808 -1e151814151518120c09091e151214151512110c0f0f2010111410101112090c081815050f11 -100c000205150c050318100f0f0909080802020102181212111100081a17171a104109015100 -20000c015100150151004000050151b620200101011919b8018bb1a8182b4e10f45d1a194dfd -1a18fdfd1a19fd184e456544e6003f3c103c103c3f3c103c103c103c103c1217390112393911 -12393911123939113939874d2e2b877dc4872e182b877dc4872e182b877dc4872e182b877dc4 -2b2b2b870e10c4c4870e103cc4870e10c4c4870e10c4c4870e10c4c4870e10c4c4014bb00f53 -4bb011515a58b2120a18b8fff6383859014bb025534bb02a515a58b90000ffc03859004bb00b -534bb00e515a58b30c40054038385959313001725d2101331316173637013313121736371333 -0123012627060701019efe7bc7df241a380a0117ead24f231c2de6c3fe6ebbfecb27071714fe -c905bafc3f9795eb2403defd1afeecf38bb403aefa46045d8c206547fba3000000020044ffe8 -0427043e000d0019016bb615180d0d065513b8ffe8b40d0d06550fb8ffe840730d0d06551918 -0d0d065512070a190c4706480856065908670669080834103a123a16351845104b124b164518 -5c055c0952105d125d1652186d056d0964106d126d1664187701150906050d5b035405540a5b -0c6c036505650a6c0c0a171c0407111c0b0b14241b400d0d02551b400b0b025507b8ffea4011 -0f0f025507180d0d025507100b0b025507b8fff0b40b0b065507b8fff0b40d0d065507b8fff0 -b40f0f065507b8fff0b40c0c065507b8ffc04013242534300701000710072007030731df1b01 -1bb8ffc040491e2334301b011b0e24000c0e0f025500120d0d0255000c0c0c0255001c0b0b02 -55000e0b0b0655000e0d0d0655000c1010065500160c0c065500402425341f003f000200311a -3437182b10f65d2b2b2b2b2b2b2b2b2bed10712b5df65d5d2b2b2b2b2b2b2b2b2b2bed003fed -3fed313001715d0071435c584009530553096205620904015d59002b2b2b2b13103736333200 -1514060623220013141633323635342623220644a489c5db01167beb8bdffeedb9b28786b2b3 -8587b2021301278e76fee1fdcdeb82011e010dcccbccd1c5cbca000000010085000002c6043e -001100c9403b2f1301100401230434044304530466047404060911080908090d1311090d0003 -08010b1c06070106000a0928900801082220130113022211250100b8ffc04010333634f00001 -00002000d000e0000400b8fff8b41010025500b8fff840110e0e025500040c0c025500060b0b -025500b8fffcb41010065500b8fff440160f0f065500060c0c065500080d0d0655004e1247c4 -182b10f62b2b2b2b2b2b2b2b5d712b3cfde4105df472e4003f3f3fed11393911393901111239 -390010c9870e7dc43130005d72015d33113315363633321707262322060706151185a23e693f -5b5e3e42423b5e141e0426a171483aa727473f6072fdd400000000010088000003f805ba000b -0261401b060c0d0d0655070656065a09030f0df305f60603090c1010025506b8fff4b40c0c02 -550ab8fff4b40c0c025509b8fff4b40c0c025503b8ffe840100d0d06555503770a0212062013 -213408b8fff0b312273409b8fff0b41227341205b8fff0b312213409b8fff040841227340604 -04050406370947040525062d0a580a7703750ada03e30607a60601230626072508390638093f -0d4f0d59045906580759097d0479059909c606d204d606e406e907f706f90815120a0a050303 -04020606070909080a0a050908082507061407070603040425050a1405050a0a090603040801 -02000405060708080b0b000a04b8010f400905040c0c0655052208b8010f402120073f070207 -100c0c0655071a900d010d0b2500022501019000013f004f000200b8fffe40310e0e02550010 -0d0d025500100c0c0255000a0b0b025500120b0b065500120c0c065500080d0d065500190c0d -e1214766182b2b4ef42b2b2b2b2b2b2b5d713c4d10ed10ed4e1071f62b5d4dedf42bed003f3c -103c103c3f3c3f3c11173987052e2b047d10c487052e182b0e7d10c40710083c083c0310083c -083cb10602435458400d4b09011f0984030209180d1134002b5d7159313001435c58400a092c -1d3909081d1d3c06b8ffdeb21d3906b8ffd4b2203906b8ffd4b121392b2b2b2b2b595d00715d -0171002b2b435c58b90006ffc0b2213903b8ffc0b2163903b8ffdeb2103906b8ffdeb2103903 -b8ffdeb20c3903b8ffdeb10b392b2b2b2b2b2b59012b2b2b435c584012dd0401081416390908 -14143c090814143c06b8fff6b2183906b8ffecb11b392b2b2b2b2b015d59005d2b2b2b2b2b01 -5d712b33113311013301012301071188b401aae9fe6a01bfdefea17f05bafcbc01b0fe76fd64 -021f7afe5b000001003fffe803b1043e00300317407b042214223a094a094424562265227c09 -8e098424a613ab2cc2030d09171a1817304b2cd617051b025502021032010a185c085c095c0a -5c0b5c0c5c0d6a086a096a0a6a0b6a0c6a0db426b4270f27262427242936245a0a590b642664 -28742374248024930a9c0c9228972c9530a40aa90ca327a428b326c5261628b8fff4b40d0d06 -5522b8fff4b40d0d065523b8fff4b40d0d065524b8fff4b40d0d065528b8fff4b40c0c065522 -b8fff4b40c0c065523b8fff4b40c0c065524b8fff4b40c0c06551db8ffde40121e395a082725 -0c0a041a202615040b2e1d1ab802aa4022192c0b0b02551f193f194f195f19af19cf19060f19 -1f196f19df19041f198f190219bd02550015000002aa0001ffc040140b0b0255100140010210 -01d00102000110010201b8ffc0b314163401b8ffc040100e113401012e5c1d6c1d021d1c1507 -04b8fff4b40b0b025504b8ffe6b41010065504b8ffe640130f0f0655041c2e0b1f1a011a2419 -4013183432b8ffc0402f0f0f025519180f0f025519180d0d025519160c0c0255192010100655 -19200f0f065519100c0c065519160d0d065519b8025bb207242ab8ffc0b51c39d02a012ab8ff -e6b40c0c02552ab8ffe8b40f0f02552ab8ffe8b40c0c06552ab8ffeab60d0d06552a1a32b8ff -c04021272a346032c032023f3280320232100101012400180d0d025500100d0d06550020b8ff -f4b40d0d025520b8fff4b41010065520b8fff440190f0f065520240f100b0b02550f160c0c02 -550f200d0d02550fb8fffa40200f0f02550f0e0c0c06550f0c0d0d06550f22df00013f004f00 -020019313437182b4e10f45d714df42b2b2b2b2b2bed2b2b2b102b2bed724e105d712bf62b2b -2b2b712b4dedf42b2b2b2b2b2b2b2b2bed72003fed2b2b2b3fed7112392f2b2b5d71722be410 -fd5d71722be41112391112390111121739313043794040272d1e2305142c2611101210131003 -06220d201b000928071b01052d071b011e14201b00210e231b0022230d0c08290a1b01282709 -0a062b041b001f101d1b01002b2b103c103c2b103c103c2b012b2b2b2b2a2b818181002b2b2b -2b2b2b2b2b2b5d71015d72715d1337161633323635342726272e023534363736363332161617 -072626232206151417161716171e02151406062322263fb20f897b7c78352593c6994f41382a -91537dbd5a11b00c73697c6a16162f1b84bf975669c67dcfd9013d1c6b7265443d2318253249 -814e4779281f2b487b6718525c5237231c1d130a2433417c5c5a9f57ac0000020087fe690421 -043e0012001e0162408e0c102d103d104b10043f20b020021f20290c231d3215321d421d7020 -9020083a173a1b4a174a1b59085b0c5c175c1b6a086b0c69106d176b1bc020d314dd18dd1ad3 -1ee414e41ee020ff201623042b102b1535043a1046044a105a10e50beb1dfe100b110e03161c -1c06070106161c0e0b000e1924d00a01100a400a600a800a0420400b0b025520400d0d02550a -b8ffe6400b0f0f02550a180d0d02550ab8fffab40c0c02550ab8ffeeb40b0b06550ab8fff4b4 -0f0f06550ab8ffe840230c0c06550a74011333023312250000c001019001a001b001f001041f -013f014f010301b8fffc401d0e0e025501100d0d025501100c0c025501100b0b0255010c0b0b -065501b8fff6b41010065501b8fffc40160f0f0655010c0c0c065501120d0d065501191f4737 -18012b4e10f42b2b2b2b2b2b2b2b2b5d71723c4d10fdf4e410fd2b2b2b2b2b2b2b2b5d71ed00 -3f3fed3f3fed113912393130005d015d71720071131133153636333216161514020623222627 -1103141633323635342623220687a43a926888d06a75df7b5a8f2e11a67678aba77473b1fe69 -05bd8a51518cff98a3fefb8b4c3afdfb03a4cdc4cbd5cbcad7000002004affe8041c043e0028 -0037022d402c090d092a190d1a2a290d2a2a390d3615371b3a2a492a5d0d5d2a6a0d692a6030 -8a0d86299a169b1aa90d1528b8ffe8b40b0b065527b8ffe840190b0b0655a619aa28b619bb28 -c419cf28d215dd28084416011eb8fff440110c0c065512120c0c0655050c0c0c065535b8ffe0 -40550c0c06551f171f182b2c2a343904392c4904482c5608592b6608692b760c870cc90cf90d -f92b1137340e0104102f243417322114185f296f2902291c2f0e3f0e8f0e9f0eff0e059f0eaf -0eef0e030e0c0f0f02550eb8ffeab4101002550eb8fff44015101006550e0c0d0d06550e060f -0f06550e0e1c0317b802aab61895141c1c0700b8fff4401a0c0c06550045270a321c030b2961 -106100060d0d025500252124b8ffecb41010025524b8ffec400b0d0d025524040c0c025524b8 -ffe4b40b0b025524b8fff4b40b0b065524b8ffdc400b1010065524060f0f065524b8fffcb40c -0c065524b8025b400e27400026102620263026af260539b8ffc0b40e0e025526b8ffd6b60e0e -0255263139b8ffc0400d1e23343039c03902a039013917b8fff4404110100655172518222f24 -bf06cf06021f063f0602060e0f0f0255060c0d0d025506180c0c0255060c0b0b0255060c0b0b -0655060e0d0d065506100c0c065506313810f62b2b2b2b2b2b2b5d71edf4ed2b105d712bf62b -2b5dedf42b2b2b2b2b2b2b2b3cfd2be5e5003fed3fe42b3fedfde41112392f2b2b2b2b2b5d71 -ed711112391112393901111217393130005d2b2b2b2b01715d2b2b0071250606232226353436 -363736373637363534272623220607273e02333216161716151514161723260306070e021514 -16333236373635033c64b96aafbc477348356bda67013345887f791db0186ed08988aa501009 -1722bc1c1762c46f5c326d6968a2261d835546ab854e814e140e0d1a24250a6e2d3d59711871 -8b4b40614a2e78f0fb853d3801dd281c10284d2f48605b4f3d77000000010050ffe803ed043e -001a015ab1020243545840340e7f0f010f0b01400050007000030004121c0b07181c040b010e -1507080e0e0255070c0d0d0255070c0c0c025507100b0b0255072f2b2b2b2bcdd4c6003fed3f -ed10c45d3210c45d3231301b4047090c011f1c4313431753135317601360179b029b039a0da4 -10a41a0c080d190a6a0269036a05750c700d800da60cb509b60ab50c0c160c860ce302030e22 -5f0f6f0f7f0f030f01b802aa4079300040005000600070009000a000e000f00009000f0f0b00 -0004121c0b07181c040b1c0f010f240e080d0d06550e221b000100240b2b1f01010001010140 -0b0b065501401010065501480c0c0655011a0d0d065501491c1524cf07011f073f0702070e0b -0b0655070a1010065507120c0c065507311b34c4182b10f62b2b2b5d71ed10f62b2b2b2b5d72 -4b53234b515a58b90001ffc03859ed72f42bed72003fed3fed12392f11392f105de4105de431 -30005d71015d7159011706062322001134123633321617072626232206151416333236033cb1 -1defaedafef772e989addc1faf197f5a88aaa4846a8e018517b7cf011d010aac010281afa11b -6b6cc3d3d6c282000002004bffe8041e043e0015001d015340171f001c150255035d055d0955 -0b65036b056f09650b0815b8ffe4b40d0d065511b8ffe440520d0d06551d1c0d0d06552712d9 -05fa14f61a0431123a19311c41124d1a411c51125c19521c61126d1a611c78067815f602f618 -100016010f0d171750166016701603161c0f9010a010021010041b1c0a0700ba02aa0001ffc0 -b41010025501b8ffc04010101006551001010195131c040b17400db8ffdcb40d0d02550db8ff -eeb40d0d06550db8ffeab40c0c06550db8ffc04009272a34b00d010d1a1fb8ffc0b32526341f -b8ffc040411e2334301f011f163310240740242a341f073f074f070307200b0b025507180c0c -0255071c0d0d0255070e0b0b0655071c0c0c065507160d0d065507191e3437182b4e10f42b2b -2b2b2b2b5d2b4dfde44e10712b2bf6712b2b2b2b4ded003fedfd5d2b2be43fed12392f5d3cfd -713c011112393912393130015d005d2b2b2b0171720117060623220011100033320011140721 -16163332360121262726232206035eba2ceeb9e9feef0114dcd5010e01fce80ab285638cfdda -02510c3856897ca9015617a3b4011f0103010c0128fedefef91020afba680195864368a60000 -00020086ffe8041f05ba0010001d0180409b01050c0f240535054505053f1fb01f021f1f221c -331c421c701f901f063a133c163c1a4c164c1a5d085d0d580f5d165e1a6a086c0d680f6e166e -1ac01fd90cda17da19e213ec17ec19e31de01fff1f1920052f0f2f1430053f0f40054c0f5005 -6605da1df504fa100c10150e040602001b1c0607010a151c0e0b1824d00b01100b400b600b80 -0b041f400d0d02550b0c0f0f02550b180d0d02550bb8fff6b40c0c02550bb8fff0b40b0b0655 -0bb8fff4b40f0f06550bb8ffe0b40c0c06550bb8fff4402f0d0d06550b7401113300040c0c02 -5500040d0d0655003303250202c001019001a001b001f001041f013f014f010301b8fffeb410 -10025501b8fffc401d0e0e0255010c0d0d025501100c0c025501120b0b0255010c0b0b065501 -b8fff8b41010065501b8fffc40160f0f065501180c0c065501140d0d065501191e4737182b4e -10f42b2b2b2b2b2b2b2b2b2b5d71723c4d10fdf42b2be410fd2b2b2b2b2b2b2b2b5d71ed003f -ed3f3fed3f11391112393130005d015d7172007121231133113633321e021510002322270314 -1716333236353426232206012da7b472b162af7140fef2bdbc6b0234559176aca57576ac05ba -fdf58f4f8fca73feeffed69d0196bf558bcdcbd0c6cd000000010024fff2022a0599001700d8 -b9000affc0b323263409b8ffc0404123263480190100010c0d0a0103001610092b0f0a06161c -030b0f10220022010d12250c01ff070845094560077007800790070400072007a007b007c007 -d0070607b8ffeeb41010025507b8fff4b40f0f025507b8fff2b40e0e025507b8fff8b40d0d02 -5507b8fff8b40c0c025507b8fffab41010065507b8fff0400b0f0f065507060c0c065507b8ff -e8b40d0d065507ba026a00180136b166182b10f62b2b2b2b2b2b2b2b2b5d71f4e410ed3cfd3c -10e4f43c003fed3f3cfd3c1139123911333310c93130015d2b2b251706232226263511233533 -11371133152311141616333202101a4c3c626c2c8484b3b5b5132b281ea19f103e65a202638c -01076cfe8d8cfd934d2c1a0000010030000004ba05ba00070089400d05021e04030200080706 -050409b80273b320040104b80101b7062001022f030103b80101b5010120000100b8ffe8400b -1010025500080f0f025500b8fff2b40c0c025500b8ffe2b40d0d025500b8fffcb40c0c065500 -b8fffeb40d0d065500b80273b308b699182b10f62b2b2b2b2b2b5d3c10f45d3c10fde45de610 -3c103c003f3f3cfd3c313021112135211521110213fe1d048afe1b050dadadfaf30000000001 -0087000003e805ba00140161b90016ffc0b315173403b8ffe0400e0d0d0655250435034503ba -0d0403b8ffe0403a1719341708110c1114030501000f1c0507140b0a0c250940333634ff0901 -c0090116400b0b025516401010025509281010025509140e0e025509b8ffec40110d0d025509 -040c0c0255091a0b0b025509b8fff6400b0b0b065509141010065509b8fff8400b0d0d065509 -0a0f0f065509b8fff6b60c0c0655094e16b8ffc04017343634b016f016027016a016b016ff16 -04160214250100b8ffc04010333634f0000100002000d000e0000400b8fffab41010025500b8 -fffa40170e0e025500040c0c025500080b0b025500040b0b065500b8fffa40160f0f06550002 -0c0c065500020d0d0655004e154750182b10f62b2b2b2b2b2b2b2b5d712b3cfd3c105d712bf4 -2b2b2b2b2b2b2b2b2b2b2b2b5d712bed003f3c3fed3f1139113901123931304379400e060e07 -250e060c1b010d080f1b01002b012b2b81002b5d2b012b331133113633321616151123113426 -23220606151187b47ec076ae4bb4756b508d3c05bafdf2925da49cfd5f02a1877b538e7dfdbb -00020046ffe803df05ba0011001d015540a40a02040d250d340d440d053514351c5702540a52 -14531c6702640565096314601cc01fd405d513dd19e513e514ef17eb19e51de01fff1f161f1f -2b1a3c163c1a4b1a701f901f072e02240d2e163a02350d4b02450d4614491c570a560d670de5 -06e716fa01f40e100115030e0b100f001b1c0b0711000a151c030b1833010025110f251010d0 -11011011401160118011041f400b0b02551f400d0d025511121010025511b8fff440110f0f02 -5511060e0e025511180d0d025511b8fff2400b0b0b0655110e1010065511b8ffeeb40c0c0655 -11b8fff840420d0d065511741224bf07cf07df07ff07041f073f074f0703071e0b0b02550718 -0c0c0255071e0d0d0255070c0b0b0655070c0d0d0655071a0c0c065507191e3450182b4e10f4 -2b2b2b2b2b2b5d714dedfd2b2b2b2b2b2b2b2b2b2b5d713c10ed10fd3ce4003fed3f3c3fed3f -3c11391112393130005d01715d00712135062322262635341236333216171133110114163332 -36353426232206033865c47fd5756ad48360962fb3fd20ac7576a5a87b78a1869e8cfba39f01 -038a5141020efa460212cccac1c6daccc4000001005cffe704eb05d300300215402763036304 -730374040425273503391c430349074c1d451f44244627530359075c1d572889130e23b8fff2 -b41010025524b8fff2b41010025525b8fff2b41010025526b8fff2b41010025527b8fff2b410 -10025523b8fff6b40d10025524b8fff6b40d10025525b8fff6b40d10025526b8fff6b40d1002 -5527b8fff640460d100255280d26240224032725360f34234425452f5a20562355256c0b6a0d -6b0e66146518790b7a0d7a0f7d107524732586038a0b890d8a0f8d1085248325920d960f9615 -1eb10602435458402d2126121b261a09262901260000291a120432312600650002000d2d791b -891b021b25160d2d1e27250125051605b8fff4400c0c0c0655051e2d091e1e1603003fed3fed -2b1112395d1112391112395d1112395d01111217392fed2fed2fed2fed1b402d25240e0d0b05 -211c1d1e1b08070604030206012524220e0d0b06051e1b2d1a400c0c02558f1a011aed16002d -01b8ffc040120c0c02551001200150016001700190010601b801b040132d1e1e1603051e2d09 -1b261a4a092600290129b8ffeab40e0e025529b8fff4400d0c0c0255291a32212612012612b8 -ffecb40e0e025512b8fff6b40d0d025512b8fff8400f0c0c02551254200001001931635b182b -4e10f45d4de42b2b2bed10ed4e10f62b2b5d4dedf4ed003fed3fed10fd5d2be410fd5d2bf411 -1217391117391112393901121739593130005d712b2b2b2b2b2b2b2b2b2b015d7113371e0233 -3236363534262726242726263534363633321616170726262322061514171604171616151406 -06232224265cb70d5fc87d6faa53505c3bfe6c5169677ef294a3f98605ba0fada9b0a1393801 -d958807a86fb9dc7fef39901d7106e8d5742734445672317612b37a3656fc16469cc810e8b8e -815b4f33336b283bb57675cf7374e900000000010083ffe803e004260018014fb9001affc040 -0915173402201316340fb8fff040331214342b1301240813160c0113160b06000a111c030b00 -3316251817403336341a401010025517281010025517120e0e025517b8ffec400b0d0d025517 -040c0c025517b8fff4400b0b0b065517141010065517b8fff8400b0d0d0655170c0f0f065517 -b8fff6400d0c0c0655ff1701c01701174e1ab8ffc04015343634b01af01a02701aa01ab01aff -1a041a0c2509b8ffc04010333634f0090100092009d009e0090409b8fff8b41010025509b8ff -f840110e0e025509040c0c0255090a0b0b065509b8fff640160f0f065509020c0c065509020d -0d0655094e194750182b10f62b2b2b2b2b2b2b5d712bed105d712bf65d712b2b2b2b2b2b2b2b -2b2b2b3cfde4003fed3f3f3c39390111123931304379401a04100e0d0f0d0206070806080508 -030610040c1b000d08111b00002b012b2a2a81005d012b2b2b21350623222626272635113311 -141716163332363635113311033f7cd55ea34f100bb40b116e51518e3bb49cb4486d4f357302 -92fdb38d314751538f880239fbda0000000200880000013c05ba0003000700cd405e09360b0b -02554f099009a009b009c009df09f0090700091f09700980099f09b009c009df09e009ff090a -1f09010001070402030906037e0100060506040a0607250500049f04a004b004c004e00406c0 -04f0040200042004d004e0040404b8fff8b41010025504b8fffa40170e0e025504040c0c0255 -040a0b0b025504140b0b065504b8ffeab41010065504b8fffeb40d0d065504b8fffc400a0c0c -0655044e084750182b10f62b2b2b2b2b2b2b2b5d71723cfd3c003f3f3c3fed01111239391112 -39393130015d72712b133533150311331188b4b4b404ebcfcffb150426fbda00000100870000 -03e6043e0016017d40130503061302a810b810e303e713f003f6130604b8fff0403c0b0d3479 -10019810d018e018ff18042008140e1416121c05070106160d0a0d0e0c0e2418401010025518 -400b0b02550b28101002550b140e0e02550bb8ffec40110d0d02550b040c0c02550b220b0b02 -550bb8fff4400b0b0b06550b14101006550bb8fff9400b0d0d06550b0a0f0f06550bb8fff640 -120c0c06550b40333634ff0b01ff0b010b4e18b8ffc0401a343634b018f018027018a018b018 -c01804180302331516250100b8fff6b41111025500b8fffab41010025500b8fffa40170e0e02 -5500040c0c0255000a0b0b025500040b0b065500b8fffa40110f0f065500020c0c065500040d -0d065500b8ffc04012333634f0000100002000d000e00004004e1710f65d712b2b2b2b2b2b2b -2b2b2b3cfd3cf43c105d712bf65d712b2b2b2b2b2b2b2b2b2b2b2b2bed3c103c003f3c3f3fed -11390112393130437940160611090a080a070a0306102611060e1b010f0a121b01002b012b2b -2a81015d71002b5d71331133153633321616171615112311342626232206151187a275dd60a1 -50100ab42a6b4873a7042697af45704d327dfd7302866e6d4192ccfdbc0000000001000f0000 -03f10426001001dcb1020243545840150f010b060402090602060d0a000a0f180f0f02550f2f -2b003f3f3f3f11173931301bb70f12010f22193906b8ffde405019395a0f96049608990e9a0f -c005c006c007cb0f090f4016391a031309150d1a1035013a0b81018e0b082f1257045907590b -580e9701980a980bb702b80cc80bca0ecc10da03d509d10ddb10e50a1212b10602435458400b -0c0012110f180d10065506b8ffe8400e0d1006550f0600020d000a0a0206003f3c3f3c111239 -392b2b01111239391b40660606030708090901060609050403030b0f0f100e0d0d010f0f0d10 -0b010009020d0b030c100a060f020f0a10c600c60902102500091400000903020dc60d010d25 -0c03140c0c030a090903030206100d0d0c0c000a4f120112490d7e0c220a0f6106097e400ab8 -011bb74006500680060306b80243400e20037e02224f00010049117cc4182b10f65df4ed1a19 -fd5dfd1a18ed10e510f4ede65d003f3c103c103c3f3c103c103c87052e2b5d877dc4872e182b -5d7d10c400111239390f0f8708c4870e10c408c4870e10c4c408c4070e103c3c083c59313001 -435c58b40e181d390bb8ffde400b1d390c221739032217390bb8ffdeb2213910b8ffc0400a15 -390122213909401c392b2b2b2b2b2b2b2b595d71002b5d2b2b015d5933010133171617363737 -330101230327010f0184fe99e1a32e1c2c25b3d7fe91018bddda3afee9022801fef947304233 -fbfe0cfdce014a59fe5d0002009e000004fd05ba000d001800b2402c65116b14024b104b145b -105b14040b0c1e0f0e0e0017181e02010200081226080a0d0d025508100b0b065508b8fff440 -1b0c0c0655081a201a01201a011a180d200120000100201010025500b8fff6b40f0f025500b8 -fff6b40d0d025500b8fffa400b0c0c0255000c0b0b065500b8fffab40c0c065500b8fff0400a -0d0d0655005d193b5c182b10f62b2b2b2b2b2b2b5d3cfd3c4e10715df62b2b2b4ded003f3f3c -fd3c12392f3cfd3c3130015d005d33112132171e021514022121111121323635342627262321 -9e0229924d6c9259eefec9fe88017bbc9e5d4c3184fe8905ba0e1265b66dbbfefdfdac03018c -7f5c83150d000000000100960000042a05ba0005006d400c010204031e05000820040104b802 -a7400f070203200120000100201010025500b8fff6b40f0f025500b8fff6b40d0d025500b8ff -fab40c0c025500b8fff6b40c0c065500b8fff8400a0d0d0655005d063b5c182b10f62b2b2b2b -2b2b5d3cfd3c10e65d003f3cfd3c3f313033113311211596c202d205bafaf3ad000000010083 -0000013705ba000300e3b605360b0b025505b8ffc0b337383405b8ffc0b334353405b8ffc0b3 -30313405b8ffc0b322253405b8ffc040251517340f051f059f05df05044f05df05f005031f05 -70058005ff05040100000a0203250100b8ffc0b337383400b8ffc040153335349f0001c000f0 -000200002000d000e0000400b8fff8b41010025500b8fffa401d0e0e025500040c0c0255000a -0b0b025500140b0b065500081010065500b8fffeb40d0d065500b8ffffb40c0c065500b8fffc -400a0c0c0655004e044750182b10f62b2b2b2b2b2b2b2b2b5d71722b2b3cfd3c003f3f313001 -5d71722b2b2b2b2b2b3311331183b405bafa460000020042fe5103ea043e001e002a016f4060 -0b0b05142c0b25144c0b451406091d191d2c0b26142c23390b36144a0b46145607580b680bfa -0af5150e2e232c273e233e274c27902ca02c07362136293f2c460b4621452954215429690763 -216329602c802cda27e821ee23ef271117160615b802b1b4281c130701b802aa401020003000 -600070008000c000d0000700b8027d4032051c1c0f0a45221c0c0a16153325330a251818d017 -011017401760178017042c400b0c02552c400d0d025517121010025517b8fff440110f0f0255 -17060e0e025517160d0d025517b8ffea400b0b0b065517121010065517b8ffeeb40c0c065517 -b8fffc404a0d0d065517740f012500221f24bf0fcf0fdf0fff0f041f0f3f0f4f0f030f200b0b -02550f1a0c0c02550f220d0d02550f1c0b0b06550f0c0d0d06550f1a0c0c06550f192b2c7421 -3450182b2b4ef42b2b2b2b2b2b5d714dedf4ed10fd2b2b2b2b2b2b2b2b2b2b5d713c10fde4f6 -3c003fede43fedfd5de43fede43f3c3130015d71005d71171716171633323637362706232202 -3534123633321735331114060623222613141633323635342623220666af0b3243747d88180e -0176b0dbf06ed18dbc7aa665dba0beea99a67d7ca8ad7a78a8581a512532645a37b08b013cdd -9801018c9880fc6af8cf78ab032ad1c0bfccc3c6c3000001007cfe51026005d30010003d400a -270f0100101207081010b80133b3009f0e08b801334011079f0e5e0003100320030303ac119d -8c182b10f65dfdf6ed10f6ed003f3c3f3c3130015d0126021134373637330607060706151001 -01df95ce4d5abc8179273d232b012bfe51bc01f8010eeedafdfbd0598a96bbbdfe1ffe200001 -007cfe51026005d300100065400c2802281002090a1001001209b80133b30a9f0301b80133b4 -009f035e0eb8fff0b4101002550eb8fff8b40f0f02550eb8ffe4b40d0d02550eb8ffec400f0a -0a02550f0e1f0e020eac129d8c182b10f65d2b2b2b2bfdf6ed10f6ed003f3c3f3c3130015d13 -23001134272627262733161716151002fd81012b2b223d277a81bc5a4dcffe5101e001e1bcb9 -968a5ad2fbfddaeefef2fe0800000001008700000626043e002301c7b9000dfff4b40d0d0655 -08b8fff4b40d0d065509b8ffd8404d0b0d342504e404e409e117e52005d505f6200217082023 -09181b20090303231e1c06151c0b0b06070106231a19100ad025019025a025022517171a0e25 -90110111041010025511180f0f025511b8ffec400b0e0e025511140c0c025511b8ffe840170b -0b025511020b0b0655110c1010065511060f0f065511b8fffab40c0c065511b8fff8b40d0d06 -5511b8015d400c1825901b011b180f0f02551bb8ffec400b0e0e02551b140c0c02551bb8ffee -40110b0b02551b040b0b06551b0a101006551bb8fffe400b0d0d06551b0c0f0f06551bb8fffc -b40c0c06551bb8015d4016000233232501d000019000a000021f003f004f000300b8fffe401d -0e0e025500100d0d025500100c0c0255000c0b0b025500160b0b065500b8fffcb41010065500 -b8fff440140f0f0655000a0c0c0655000e0d0d065500192425b80178b3214750182b2b4ef42b -2b2b2b2b2b2b2b2b5d71723c4dfde410f42b2b2b2b2b2b2b2b2b5dedf42b2b2b2b2b2b2b2b2b -2b5dfd4e456544e67172003f3c3c3c3f3f3c4d10ed10ed11173901111239123931304379400e -0c141326140c111b01120d151b01002b012b2b81015d005d2b2b2b3311331536363332161736 -3332161511231134262623220615112311342623220606151187a132a66a76971f7eca9eaab3 -235c3e7094b458644c813a0426954e5f6258baafb6fd27029d6c5f3a95a4fd9702b27878509a -91fdd900000100bf0000018105ba000300ccb5010200080205b8ffc0b3383d3405b8ffc0b333 -343405b8ffc0b32d303405b8ffc0b328293405b8ffc0b323253405b8ffc0b31d1e3405b8ffc0 -b3181a3405b8ffc0402a0d103420059005af050303200100008f00a000b000042f0040005000 -df00f000051220008f0090000305b8ffc0400b0d0d025500181010025500b8ffecb40f0f0255 -00b8ffeeb40d0d025500b8fff640100c0c025500200b0b065500a204d659182b10f62b2b2b2b -2b2b5d435c58b2800001015d5971723cfd5d2b2b2b2b2b2b2b2b3c003f3f313033113311bfc2 -05bafa460001009c0000051f05ba0009017db1120bb8ffc0400a13153408180c16025503b8ff -e840210c1602550802030320070814070708020703030809040202090708040320060605b8ff -ecb40f0f025505b8fff2400b0d0d025505120c0c025505b8fff7401a0b0b0655055d200b0120 -0b500b600b700b800b050b0809200100b8ffc0400d13153420000100201010025500b8fff6b4 -0f0f025500b8fff6b40d0d025500b8fffa400b0c0c025500040b0b065500b8fff7b40c0c0655 -00b8fff8400a0d0d0655005d0a3b59182b10f62b2b2b2b2b2b2b5d2b3cfd3c105d71f42b2b2b -2b3c10fd3c003f3c3f3c1239390111393987042e2b877dc4b10602435458b90003ffe0b70c11 -3408200c1134002b2b5931302b2b012b435c58b40840463903b8ffc0b646390840323903b8ff -c0b632390722193902b8ffdeb619390722323902b8ffdeb632390722233902b8ffde400b2339 -070e1439070e133902b8fff4b61339070e1d3902b8fff4b61d39070e153902b8fff8b115392b -2b2b2b2b2b2b012b2b2b2b2b2b002b2b2b2b59331133011133112301119cc70302bac7fcfe05 -bafb81047ffa460480fb800000000001ffe1fe69048afeeb0003001a400c013f00021a050019 -044341182b4e10e410e6002f4ded3130033521151f04a9fe69828200000200a1000005ad05ba -0018002201fc4021120b0e0112361c5a1f66086d1f0409100d0d065508100d0d065507100d0d -065524b8ffc0b40c0c02550db8fff4b40c0c02550cb8fff4b40c0c02550bb8fff4b40c0c0255 -12b8ffe2b3121a3412b8fff0b322273411b8ffe2b31d273410b8ffe2b31d27340fb8ffe2b31d -273412b8ffd8b31d263411b8ffe2b3121a3410b8ffe2b3121a340fb8ffe24049121a34250e4a -1c4a20530b5c1c6d1c7209780e790f850a880f970da90fb80fe80ee70f100e0c0c20110f1411 -110f110f0c09121b02211a160a061211100d0c0518090916171a191e17b8ffc040190b0b0655 -17170021221e0201020018180f0f0e081e260e9c06b8ffe8b40f0f025506b8fff6b40d0d0255 -06b8ffe040220c0c025506060d0d0655065d2024702480240324221820012000010020101002 -5500b8fff6b40f0f025500b8fff6b40d0d025500b8fffa400b0c0c025500060b0b065500b8ff -f7b40c0c065500b8fff8400a0d0d0655005d233ba8182b4e10f42b2b2b2b2b2b2b5d3c4dfd3c -105df62b2b2b2b19e418ed003f3c103c103c3f3cfd3c12392f2bfd3c103c392f121739011117 -39870e2e2b057d10c43130015d2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b5d435c58400a0840 -0f390f103a11123a2b2b2b590171435c58b9000effde401a193911221939122219390e401c39 -1022143910221f39102215392b2b2b2b2b2b2b5933112132161615140607161716171323032e -02272623231111213236363534262321a1028ac4cc7acad34d28554cfff4c2556e572d214be1 -01a185964e97a3fe3005ba4fc8799cd61d25244e75fe710131848c380b07fd75033337794768 -8600000100a2000004e805ba000b0095401506051e080807070003041e0201020a091e0b0008 -07b8ffc0401d1012340754034a200a200d020a1a0d0409200120000100201010025500b8fff6 -b40f0f025500b8fff6b40d0d025500b8fffab40c0c025500b8fffab40c0c065500b8fff0400a -0d0d0655005d0c3b5b182b4e10f42b2b2b2b2b2b5d3c4dfd3c4e10f65d4df4e42b003f3cfd3c -3f3cfd3c12392f3c10fd3c3130331121152111211521112115a20424fc9e032bfcd5038405ba -adfe3facfe0dad0000020058ff8e05ee05d400150028016840955f269f260219183715020b1c -041f04231b1c141f1423062a052d172b263b053c173a264c054c1749265d05552358266f057b -037a058c038c0595009a03a400ab03d500d516e500e517e5181a1c052b002a053b05045d0592 -189626d5260425162a26341639264918491c451f45234b265608581155155a1c5a1d561f5720 -5722690566156b267b268e1c8e26db18dc26190b180115b8ffd4b21b3900b8ffd440381b3904 -1814182a053a0504020316280307282618160500062103131a0502282618160005241e1e0f03 -0208241e07091a2613180f0f025513b8ffeeb40d0d025513b8ffe8b40c0c025513b8fff0b40b -0b065513b8fff4b40d0d065513b8fff440250c0c0655134a021a202a802a022a2126200b010b -180b0b06550b060c0c06550b1929635c182b4e10f42b2b5d4ded4e105df64df42b2b2b2b2b2b -ed003fed3f3fed11173912390111123912173900113310c910c95d3130012b2b5d5d0072715d -015d717225161707262706232224023534122433320412151402251617361134022623220011 -1000333237262704f58772399e9da3c5c7febcafb00145c9cb0146ab6efde6a86dab79e991d9 -fee2011bdc685c5b659d5d2b87397b5bc0015cdad90164bac1fea5dab5fedf8d2f5d9c0139b2 -010a93fed7fed9fee2fece273b19000100a1ffe7052205ba001400d9400a260f58045808c908 -0416b8ffc0401613153434043b0846044a08760fa605e80f070c000211b802bbb40609142602 -b8ffecb40f0f025502b8fff2400b0d0d025502100c0c025502b8ffe0401c0b0b0655025d2016 -01201650160260167016801603160d26200a010ab8ffc0400a1315340a20101002550ab8fff6 -b40f0f02550ab8fff6b40d0d02550ab8fffa400b0c0c02550a040b0b06550ab8fff7b40c0c06 -550ab8fff8400a0d0d06550a5d153b59182b4e10f42b2b2b2b2b2b2b2b5ded4d105d5d71f62b -2b2b2b4ded003fed3f3c3130015d2b005d013311140204232224023511331114161633323611 -0460c264fefbd4cefefa70c247ad7dd6b605bafcb1ddfefca38e010de9034ffcb2bfb562c201 -14000002009e0000055a05ba000f001d00e5402f201f0143081c1d1e02010211101e0f000817 -262009011f400d0d0255092010100255090a0f0f025509180d0d025509b8fff440150c0c0655 -091a1f1d10200120000100201010025500b8fff6b40f0f025500b8fff6b40d0d025500b8fffa -b40c0c025500b8fff7b40c0c065500b8fff8400a0d0d0655005d1e3b5c182b10f62b2b2b2b2b -2b5d3cfd3c10f62b2b2b2b2b5ded003f3cfd3c3f3cfd3c313043794036031b07080608050804 -08040619181a1802060b0a0c0a0d0a030615161416131603061b03172101120e17210118081c -2101160a1121002b2b012b2b2a2a2a2a81015d3311213217161716121514020e022325213236 -373636353426272623219e01f9ab5a7e5974734e7a91cd85feb1013991a531454d976c4eadfe -cc05ba151d4c62fecfc4a7fefea96132ad363145e9a6e6f72a1e0002fffd0000055905ba0007 -000e0167b6010e0f10025502b8fff2b40f10025502b8fff8b40d0d065502b8fff440590c0c06 -55090c0c0c0655050c0c0c06552f10301067086809601088039010c905c606c010f0100b0805 -590156025010680bb010f30cf30df30e09040c040d040e030b0a090504040c0d0e080607070c -09050408060c07010000b8fff8400f0c0c02550020070c1407070c020303b8fff840150c0c02 -550320040c1404040c091e0505081e060306b80270400900080ce94002010202ba010b000101 -0b40120c2000650703525004cf04df040390040104b80101400b500cc007df0c03900c010cb8 -010140100f07cf07027f0780070207930fd6d7182b10f45d7119f45d71f45d7118ed10ed1a19 -10eded00183f3c1aed3fe43c10ed3c10ed87052e2b2b7d10c4872e182b2b7d10c40111123939 -1139398710c4c40ec4c4870510c4c40ec4c43130014bb00b534bb01e515a58b4040f030807ba -fff00000fff838383838590172715d2b2b2b2b2b2b2301330123032103132103262706070302 -33d10258ddabfd9ba1d901f19946221c3305bafa4601bcfe44025a0196b9778d8b0000000001 -0066ffe7057605d3001d00d3b563026a1d0201b8ffe8b40b0b065500b8ffe8405f0b0b065520 -00320d63007000741d8000841d90009a05ab03a50db903b40dc70dd000e41df31d110e121d11 -1d1d032a0628112a1c201f470d56145715561968056b1d7b128b129a03990e9a1ca801a402a8 -11d50e130014001a1014101a0402b8ffdeb2283901b8ffc0402d2839100f0001041b131e0c03 -1b1e040910260f4a0026200101011a1f1726200801080c0b0b065508191e635c182b4e10f42b -5d4ded4e10f65d4dedf4ed003fed3fed1117393130012b2b5d5d71005d2b2b01720117060423 -2224023534122433320417072626232206021514121633323604b4c23dfec3e5edfed79baf01 -43c2dc012c3bbf33c293a9e35c6de686a3e2020231effbc1016ed2e50155b1e0cb2da092a2fe -ef91bbfee98abc000000000100960000055205ba000b01fe401e0322373908093a270a350636 -0a470a57038603d70307760ad903d90a0306b8fff440180d0d025528058c048a05aa04ea0805 -0a04013504d6040209b8ffe04009122134032012213403b8ffdeb30c391209b8ffe0b3122134 -08b8ffe0b312213404b8ffe0b31d213404b8ffc0b312163408b8ffde403d1939080925253d08 -0919193d060607090a09080a0503040420050a1405050a090808200706140707060a0a000502 -040102070b0800080a03020b010004b8023a400f300501a005b005c005e00504054a08b8023a -400b30070120078007b0070307b80286400c0b2020000100201010025500b8fff6b40f0f0255 -00b8fff6b40d0d025500b8fffab40c0c025500b8fffab40c0c065500b8fff2400a0d0d065500 -5d0c3ba8182b10f42b2b2b2b2b2b5dedfd5d71edf45d71ed103c103c3c3c003f3c3c3c3f3c3c -3c12392f87052e2b0e7d10c487052e182b047d10c40708103c083c014bb018534bb01b515a58 -b90004ffd83859b10602435458b90004fff0b30c113403b8fff040170c113406100e11340810 -0e103409100e11340a100d1034002b2b2b2b2b2b593130012b2b2b2b2b2b2b435c5840110922 -1939082c1939042c193904221b3905b8ffdeb616390422163906b8ffde400b12390822143904 -40143908b8ffdeb52539044015392b2b2b2b2b2b2b2b2b2b2b59002b2b2b0171725d2b00715d -2b2b33113311012101012101071196c202d80107fd990282ff00fdf6f005bafd2902d7fdaefc -9802e6eafe040000000000020003000000000014000100000000003400040020000000040004 -00010000f026ffff0000f000ffff100000010000000000060058000000000027000000010002 -0003000400050006000700080009000a000b000c000d000e000f001000110012001300140015 -0016001700180019001a001b001c001d001e001f002000210022002300240025002605ba0019 -05ba001a05a70019042600180000ffe70000ffe80000ffe7fe69ffe805ba0019fe69ffe802ea -000000b8000000b80000000000a800ad016900ad00bf00c201f0001800af00b900b400c80017 -0044009c007c009400870006005a00c80089005200520005004400940119ffb4002f00a10003 -00a100cd00170057007e00ba00160118ffe9007f008503d300870085000d002200410050006f -008d014cff75005c00df04830037004c006e00700180ff58ff8eff92ffa400a500b903c8fffd -000b001a0063006300cdffee05d8ffdc002d005c0095009900df019209b500400057008000b9 -039d0072009a035d0401ff67fffa00030021007700cd0004004d00cd01c0022b004c006500e7 -0118017c034305d8ffa3ffb0ffc40003001c005d0068009a00ba013501470221055cff4dffcd -0016002d00780080009900b200b600b600b800bd00da010c05f0ffa4fff00019002c0049007f -00b400ce01c003fefd81fe3f000000050018002900390049006f00be00c700d0012301c1026f -050c05320540057affd4001400310055005700a700b400e601f7027e027e027f03c60446ff42 -000e0085009100bf00c200c500e1011a012f014f01560229026f029e03720008002c00310031 -006400690089009800c700de012b01b6020c02cf03a304ab04fb061dfee0ff0e00060026009b -009d00c1010d011801200173018201d601e30243025f029b02e2039404a904d20761001c005e -006d008d00ab00f7011201380151015b0168017c01870191019901cd01d001e802410254026b -02ef0368037103bd044204420453047304830586058b06e8fe58fec4fed1fef7ff32ff860051 -007c008100910095009e00b400b900cf00d900d900df00e20105010b010e010e012001210155 -017b017b017e018d01a201a801a901b401d001d001e201e901f201f501fb020002000206021b -0221022202220223027202770294029c02cf02cf02d002ec02f903170322032b0335033c0359 -036f037103870390039003b503e1041a04cf04ff053205320596059f05a805ab05c205f0060c -0782080008ccfca3fd2afddefe00fe88fe96feb2feb4ffe100150019001a001c001f003c0051 -00610061006a0078009600a500af00d3010c0118011a012a013e014c0151015f016a01710178 -01820184019a01a501a801a901ae01bc01cd01d701ef0200020d021c02210222022e02350242 -024f024f025e026502710290029202b402d602fa0307030b030f0315032a0347035d03650374 -0379039603b003cc03dd03e203f603fc03fc03ff040a041f04220426042b0447045f0475049e -04e704e7055c05cb05e5060a066d068606b806f10736073e07500751075d078f07b607d40860 -00b600c300b500b700000000000000000000000001e00381034503b5008e0233041902ce02ce -002d005f0064034d023f000002a80188027d01b402240578063b023b014e00f00426029402c6 -029f02f6023b034d014b0153006a0231000000000000061404aa0000003c04c300ed04bc0265 -02ce03b50078060c017e02ef060c00b201000239000001c50330042b03cb00da03df010704a1 -00db040a011701ed02a70350010b01bd043e05580021039c00ae0371017d00b5024500000afb -088c012b014e01aa00870054013201f803ff0003024e00b4003703e30083006b02d800ed0077 -0088009701640467008e0033017c00e700a6029e0329056e062a061501c90269048a021301b4 -000204a9000002390124010305140084015d039a06ef02d9007500cf040a00de03ac04bc02cf -02ae034d04f005520168006d007d00860071ff810079055804d2016700030156002504e00094 -007c033204210094007f0072005c002f00b6001800ba00b80041034d00720018001f004c016a -01550099009a009a009800b200040078006900140057006e00ce00b4065402b80067050e0165 -00e7000004cbfe52005affa60099ff67006eff92002dffd40087ff7c00b800a800e5008f00a8 -0185fe7b0070001e00d900de014c054602cf0546ff2d028a02d90253029600b7000000000000 -00000000000000000125011800ea00ea00ae0000003e05bb008a04d70053003fff8cffd50015 -0028002200990062004a00e4006d00ee00e5004803c00033fe4e02b1ff460370007905df0051 -ffa7ff1f010a0068ff6c004f00bc00a507050061072b4043555441403f3e3d3c3b3a39383735 -34333231302f2e2d2c2b2a292827262524232221201f1e1d1c1b1a191817161514131211100f -0e0d0c0b0a090807060504030201002c4523466020b02660b004262348482d2c452346236120 -b02661b004262348482d2c45234660b0206120b04660b004262348482d2c4523462361b02060 -20b02661b02061b004262348482d2c45234660b0406120b06660b004262348482d2c45234623 -61b0406020b02661b04061b004262348482d2c0110203c003c2d2c20452320b0cd442320b801 -5a51582320b08d44235920b0ed51582320b04d44235920b09051582320b00d44235921212d2c -20204518684420b001602045b04676688a4560442d2c01b10b0a432343650a2d2c00b10a0b43 -23430b2d2c00b0172370b101173e01b0172370b10217453ab10200080d2d2c45b01a234445b0 -1923442d2c2045b00325456164b050515845441b2121592d2cb00143632362b0002342b00f2b -2d2c2045b0004360442d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc08a8cb810 -0062602b0c642364615c58b00361592d2c45b0112bb0172344b0177ae4182d2c45b0112bb017 -23442d2cb01243588745b0112bb0172344b0177ae41b038a45186920b01723448a8a8720b0a0 -5158b0112bb0172344b0177ae41b21b0177ae45959182d2c2d2cb0022546608a46b040618c48 -2d2c4b53205c58b002855958b00185592d2c20b0032545b019234445b01a23444565234520b0 -0325606a20b009234223688a6a606120b01a8ab000527921b21a1a40b9ffe0001a45208a5458 -2321b03f1b235961441cb114008a5279b31940201945208a54582321b03f1b235961442d2cb1 -10114323430b2d2cb10e0f4323430b2d2cb10c0d4323430b2d2cb10c0d432343650b2d2cb10e -0f432343650b2d2cb11011432343650b2d2c4b525845441b2121592d2c0120b003252349b040 -60b0206320b000525823b002253823b002256538008a63381b212121212159012d2c4bb06451 -584569b00943608a103a1b212121592d2c01b005251023208af500b0016023edec2d2c01b005 -251023208af500b0016123edec2d2c01b0062510f500edec2d2c20b001600110203c003c2d2c -20b001610110203c003c2d2cb02b2bb02a2a2d2c00b00743b006430b2d2c3eb02a2a2d2c352d -2c76b8022323701020b802234520b0005058b00161593a2f182d2c21210c6423648bb8400062 -2d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648b -b81555621bb200802f2b59b002602d2c0c6423648bb84000626023212d2cb4000100000015b0 -0826b00826b00826b008260f10161345683ab001162d2cb4000100000015b00826b00826b008 -26b008260f1016134568653ab001162d2c4b53234b515a5820458a60441b2121592d2c4b5458 -20458a60441b2121592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb01343 -58031b02592d2cb0134358021b03592d2c4b54b012435c5a58381b2121592d2cb012435c580c -b00425b00425060c6423646164b807085158b00425b00425012046b01060482046b010604859 -0a21211b2121592d2cb012435c580cb00425b00425060c6423646164b807085158b00425b004 -25012046b8fff060482046b8fff06048590a21211b2121592d2c4b53234b515a58b03a2b1b21 -21592d2c4b53234b515a58b03b2b1b2121592d2c4b53234b515ab012435c5a58381b2121592d -2c0c8a034b54b00426024b545a8a8a0ab012435c5a58381b2121592d2c4b5258b00425b00425 -49b00425b00425496120b0005458212043b0005558b00325b00325b8ffc038b8ffc038591bb0 -4054582043b0005458b00225b8ffc038591b2043b0005458b00325b00325b8ffc038b8ffc038 -1bb00325b8ffc03859595959212121212d2c462346608a8a462320468a608a61b8ff80622320 -10238ab902c202c28a70456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2cb1 -020042b123018851b1400188535a58b910000020885458b202010243604259b12401885158b9 -20000040885458b2020202436042b12401885458b2022002436042004b014b5258b202080243 -6042591bb940000080885458b202040243604259b94000008063b80100885458b20208024360 -4259b94000010063b80200885458b202100243604259b94000020063b80400885458b2024002 -43604259595959592d2cb0024354584b53234b515a58381b2121591b21212121592d00000001 -000000030000ea930bd45f0f3cf5081b080000000000a2e3272a00000000b9d5b4f6faaffd67 -1000080c00000009000100010000000000010000073efe4e00431000faaffe26100000010000 -000000000000000000000000002706000100078d00190473004402aa0085040000880400003f -047300870473004a040000500473004b02390000047300860239002404e30030047300870473 -00460556005c0473008301c70088047300870400000f0556009e0473009601c7008304730042 -02aa007c02aa007c06aa0087023900bf05c7009c0473ffe105c700a1055600a20639005805c7 -00a105c7009e0556fffd05c7006605560096000000000000002c0000026c0000043000000538 -000007d000000b7800000d3c00001010000011c4000013840000138400001564000016880000 -1738000018dc00001a9000001d3c00001edc00001fd000002198000023bc000024c400002550 -0000264c0000283c000028bc0000296400002b9400002c7800002e2400002e58000030c40000 -31880000337c000034a0000035e800003794000038d000003b080001000000270100003f0076 -000700020010002f00560000040d0aff00030002b1540f4122031700ef031700ff0317000300 -1f0317002f0317004f0317005f0317008f0317009f03170006000f0317005f0317006f031700 -7f031700bf031700f00317000600400317b2923340b80317b28b3340b80317b36a6c3240b803 -17b2613340b80317b35c5d3240b80317b357593240b80317b34d513240b80317b344493240b8 -0317b23a3340b80317b331343240b80317b32e423240b80317b3272c3240b80317b312253280 -b80317b30a0d32c04116031600d00316000200700316000102c4000f0101001f00a0031500b0 -031500020306000f0101001f00400312b32426329fbf03040001030203010064001fffc00301 -b20d1132410a02ff02ef0012001f02ee02ed0064001fffc002edb30e11329f414a02e200af02 -e200bf02e2000302e202e202e102e1007f02e00001001002e0003f02e0009f02e000bf02e000 -cf02e000ef02e0000602e002e002df02df02de02de000f02dd002f02dd003f02dd005f02dd00 -9f02dd00bf02dd00ef02dd000702dd02dd001002dc0001000002dc0001001002dc003f02dc00 -0202dc02dc001002db000102db02db000f02da000102da02daffc002d3b2373932b9ffc002d3 -b22b2f32b9ffc002d3b21f2532b9ffc002d3b2171b32b9ffc002d3b2121632b802d2b2f9291f -b802e3b3202b1fa0413002d400b002d40002000002d4001002d4002002d4005002d4006002d4 -007002d40006006002d6007002d6008002d6009002d600a002d600b002d60006000002d60010 -02d6002002ca002002cc002002d6003002d6004002d6005002d6000802d0b2202b1fb802cfb2 -26421f411602ce02c70017001f02cd02c80017001f02cc02c60017001f02cb02c50017001f02 -c902c5001e001f02ca02c6b21e1f00410b02c6000002c7001002c6001002c7002f02c5000502 -c1b324121fff411102bf0001001f02bf002f02bf003f02bf004f02bf005f02bf008f02bf0006 -02bf0222b2641f12410b02bb00ca0800001f02b200e90800001f02a600a20800406a1f402643 -4932402043493240263a3d3240203a3d329f209f26024026969932402096993240268e923240 -208e92324026848c324020848c3240267a813240207a813240266c763240206c76324026646a -324020646a3240265a5f3240205a5f3240264f543240204f5432b8029eb724271f374f6b0120 -410f0277003002770040027700500277000402770277027700f90400001f029bb22a2a1fb802 -9a402b292a1f80ba0180bc0180520180a201806501807e01808101803c01805e01802b01801c -01801e0180400180bb0138000100800140b40180400180bb013800010080013940180180ca01 -80ad018073018026018025018024018020013740b80221b2493340b80221b2453340b80221b3 -41423240b80221b33d3e320f410f0221003f0221007f0221000300bf022100cf022100ff0221 -000300400221b320223240b80221b3191e3240b80222b32a3f3240b80221b32e3a326f414802 -c3007f02c3008f02c300df02c30004002f02c3006002c300cf02c30003000f02c3003f02c300 -5f02c300c002c300ef02c300ff02c3000600df02220001008f02220001000f0222002f022200 -3f0222005f0222007f022200ef0222000600bf022100ef02210002006f0221007f022100af02 -210003002f0221003f0221004f0221000302c302c30222022202210221401d101c102b104803 -8f1c010f1e014f1eff1e023700161600000012110811b8010db6f70df8f70d00094109028e02 -8f001d001f0290028f001d001f028fb2f91d1fb80198b226bb1f41150197001e0401001f0139 -00260125001f013800730401001f0135001c0801001f0134001c02ab001f0132b21c561fb801 -0fb2262c1fba010e001e0401b61ff91ce41fe91cb80201b61fe81cbb1fd720b80401b21fd51c -b802abb61fd41c891fc92fb80801b21fbc26b80101b21fba20b80201b61fb91c381fadcab804 -01b21f8126b8019ab21f7e26b8019ab61f7d1c471f6b1cb80401b21f6526b8019ab21f5e73b8 -0401400f1f52265a1f481c891f441c621f4073b80801b61f3f1c5e1f3c26b8019ab21f351cb8 -0401b61f301cbb1f2b1cb80401b61f2a1c561f291cb80101b21f231eb80401b21f5537b80168 -402c07960758074f07360732072c0721071f071d071b071408120810080e080c080a08080806 -0804080208000814b8ffe0402b00000100140610000001000604000001000410000001001002 -000001000200000001000002010802004a00b013034b024b5342014bb0c063004b6220b0f653 -23b8010a515ab005234201b0124b004b5442b0382b4bb807ff52b0372b4bb007505b58b10101 -8e59b0382bb00288b801005458b801ffb101018e851bb0124358b900010111858d1bb9000101 -28858d5959001816763f183f123e113946443e113946443e113946443e113946443e11394660 -443e11394660442b2b2b2b2b2b2b2b2b2b2b182b2b2b2b2b2b2b2b2b2b2b182b1db0964b5358 -b0aa1d59b0324b5358b0ff1d594bb09353205c58b901f201f04544b901f101f045445958b903 -3e01f2455258b901f2033e4459594bb8015653205c58b9002001f14544b9002601f145445958 -b9081e0020455258b90020081e4459594bb8019a53205c58b9002501f24544b9002401f24544 -5958b909090025455258b9002509094459594bb8040153205c58b173244544b1242445445958 -b917200073455258b9007317204459594bb8040153205c58b1ca254544b1252545445958b916 -8000ca455258b900ca16804459594bb03e53205c58b11c1c4544b11e1c45445958b9011a001c -455258b9001c011a4459594bb05653205c58b11c1c4544b12f1c45445958b90189001c455258 -b9001c01894459594bb8030153205c58b11c1c4544b11c1c45445958b90de0001c455258b900 -1c0de04459592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b -2b2b2b2b2b2b2b2b2b65422b2b01b33b59635c456523456023456560234560b08b766818b080 -622020b163594565234520b003266062636820b003266165b059236544b063234420b13b5c45 -65234520b003266062636820b003266165b05c236544b03b2344b1005c455458b15c406544b2 -3b403b4523614459b347503437456523456023456560234560b089766818b080622020b13450 -4565234520b003266062636820b003266165b050236544b034234420b147374565234520b003 -266062636820b003266165b037236544b0472344b10037455458b137406544b2474047452361 -4459004b5342014b5058b108004259435c58b108004259b3020b0a124358601b215942161070 -3eb0124358b93b21187e1bba040001a8000b2b59b00c2342b00d2342b0124358b92d412d411b -ba04000400000b2b59b00e2342b00f2342b0124358b9187e3b211bba01a80400000b2b59b010 -2342b0112342002b7475737500184569444569444569447373737374757374752b2b2b2b7475 -2b2b2b2b2b737373737373737373737373737373737373737373737373732b2b2b45b0406144 -737400004bb02a534bb03f515a58b1070745b040604459004bb03a534bb03f515a58b10b0b45 -b8ffc0604459004bb02e534bb03a515a58b1030345b040604459004bb02e534bb03c515a58b1 -090945b8ffc06044592b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b752b2b2b2b2b2b2b435c58 -b9008002bbb301401e017400735903b01e4b5402b0124b545ab012435c5a58ba009f02220001 -007359002b7473012b01732b2b2b2b2b2b2b2b737373732b002b2b2b2b2b2b00456944734569 -4473456944737475456944734569444569444569447374456944456944732b2b2b2b2b732b00 -2b732b74752b2b2b2b2b2b2b2b2b2b2b2b2b2b7374752b0000> -] def -FontName currentdict end definefont pop -%%Page: 1 1 -%%BeginPageSetup -%%PageBoundingBox: 0 0 196 229 -%%EndPageSetup -q -1 g -84.574 223.767 111.258 -223.258 re f -0 g -0.8 w -0 J -0 j -[] 0.0 d -4 M q 1 0 0 -1 0 228.91925 cm -84.574 5.152 111.258 223.258 re S Q -BT -9.6 0 0 9.6 0.084375 2.047373 Tm -/f-0-0 1 Tf -[<010203>-1<04050607>-1<08090a0b07>-1<0509>]TJ -0 22.916667 Td -[<010203>-1<04050607>-1<08090a0c>1<02>-1<06>]TJ -ET -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.16 205.164 m 195.816 205.164 l S Q -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.602 56.379 m 195.859 56.379 l S Q -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.602 116.379 m 195.859 116.379 l S Q -BT -9.6 0 0 9.6 98.925002 8.414549 Tm -/f-0-0 1 Tf -[<0d0e>-1<03>-1<0907>-1<0f0a10>-1<0c>1<03>-1<11>-1<080c>1<11>-1<03>-1<09>]TJ -0.68164 11.25 Td -[<1213>-1<0c>1<080c140a100c03>-1<11080c1103>-1<09>]TJ -0.343913 7.916667 Td -[<0d0e>-1<03>-1<0907>-1<0f0a10>-1<0c>1<07>-1<0804>]TJ --11.375163 -8.809407 Td -[<10>-1<0c>1<07>-1<08040a>1<15>-1<02>-1<1213>-1<0c>1<09>-1<03>]TJ -ET -0.558281 w -[] 0.0 d -q 1 0 0 -1 0 228.91925 cm -76.48 227.523 m 83.652 227.523 l S Q -81.422 1.396 m 80.305 0.279 l 84.211 1.396 l 80.305 2.513 l 81.422 -1.396 l h -81.422 1.396 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.422 -227.523 m -80.305 -228.641 l -84.211 -227.523 l -80.305 --226.406 l -81.422 -227.523 l h --81.422 -227.523 m S Q -0.558281 w -q 1 0 0 -1 0 228.91925 cm -76.48 115.523 m 83.652 115.523 l S Q -81.422 113.396 m 80.305 112.279 l 84.211 113.396 l 80.305 114.513 l -81.422 113.396 l h -81.422 113.396 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.422 -115.523 m -80.305 -116.641 l -84.211 -115.523 l -80.305 --114.406 l -81.422 -115.523 l h --81.422 -115.523 m S Q -0.558281 w -q 1 0 0 -1 0 228.91925 cm -76.332 6.035 m 83.504 6.035 l S Q -81.27 222.884 m 80.152 221.767 l 84.063 222.884 l 80.152 224.001 l -81.27 222.884 l h -81.27 222.884 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.27 -6.035 m -80.152 -7.152 l -84.063 -6.035 l -80.152 -4.918 l --81.27 -6.035 l h --81.27 -6.035 m S Q -0.8 w -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.145 181.18 m 195.801 181.18 l S Q -BT -9.6 0 0 9.6 88.22969 31.844237 Tm -/f-0-0 1 Tf -[<0d0e>-1<03>-1<0907>-1<0f0a1602>-1<080717>-1<0a>1<10>-1<0c0203>-1<07>-1<18 -09>]TJ -ET -0.558281 w -[] 0.0 d -q 1 0 0 -1 0 228.91925 cm -76.332 206.035 m 83.504 206.035 l S Q -81.27 22.884 m 80.152 21.767 l 84.063 22.884 l 80.152 24.001 l 81.27 -22.884 l h -81.27 22.884 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.27 -206.035 m -80.152 -207.152 l -84.063 -206.035 l -80.152 --204.918 l -81.27 -206.035 l h --81.27 -206.035 m S Q -BT -9.6 0 0 9.6 -0.310938 25.150499 Tm -/f-0-0 1 Tf -[<080e0d>-1<0e0f>-1<1610>-1<19>-1<1a>]TJ -0.0843099 2.006672 Td -[<10>-1<0c>1<07>-1<08040a>1<16>-1<121b>-1<12>-1<0c>]TJ -ET -0.558281 w -q 1 0 0 -1 0 228.91925 cm -76.332 182.035 m 83.504 182.035 l S Q -81.27 46.884 m 80.152 45.767 l 84.063 46.884 l 80.152 48.001 l 81.27 -46.884 l h -81.27 46.884 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.27 -182.035 m -80.152 -183.152 l -84.063 -182.035 l -80.152 --180.918 l -81.27 -182.035 l h --81.27 -182.035 m S Q -0.8 w -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.543 97.18 m 195.801 97.18 l S Q -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.543 77.18 m 195.801 77.18 l S Q -BT -9.6 0 0 9.6 102.637498 156.583295 Tm -/f-0-0 1 Tf -[<09140c080c140a>1<10>-1<0c0311>-1<080c>1<11>-1<03>-1<09>]TJ --1.601887 -1.938639 Td -[<1c1d0d1e>-1<1f20>-1<21221c1f20>-1<23>-1<1e10>-1<0d>-1<24>-1<25>]TJ -10.675781 0 Td -<26>Tj -ET -Q -showpage -%%Trailer -count op_count sub {pop} repeat -countdictstack dict_count sub {end} repeat -cairo_eps_state restore -%%EOF diff --git a/doc/rt/rsc/workspace.png b/doc/rt/rsc/workspace.png deleted file mode 100644 index 689178c0b6ea28cca19c76df0ae5410ce0c75b3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20994 zcmd74cR1F4|37|;r0kTWZ0$%TN>*kiNkc*dMakZKW+kMZEu(~rva<=5nH93hUKx?` zeZ21D^Zny@9G~NN{CZHPX z{B@Q>q2i&V#oxW$>V5=&p|O%Xb&(GLai+WJhkssge)5VHe!rRgk4kQLm_2^D)ml;0 z`huB(wVkfzEsC9;o$wvgyH@(T=C_2+EDgiPB{?Y+Udkzj6Bq5nM}OIAUR3@kJ~>ez zwuwqHlwWgDk>(~VYg|j9`oUCP|1ov-hL(*g&d$lHJLWb%2rYeg@V@7(SG>_DSvQ?? zWL0-OkURfx-GSe~4Nla(coVjuv!&Ux`uoe5SF`5BkKOXI>nUAd-_)eEy0Tnn{3Ahi z@KahGsv1_JGNo%T5slGn|$sZPJHrY zlW|){pmxaP$6inOUA~{9onyV{;-yQSiH}A{jYUO8m-@e~{P_I&^TTJ)=3>H%M9dVw zR8=u*XPSDS+kFpz+VoeBw?*%l?)rEY{*nFr_eUotuBY5KHZF}MrHC`e;#YwH&nScZoYG3$^_J#E&WMP*`QqN%AFotCyyS6A15x^KON-8jR60|$2R z*~53}(8dS}8@X%OxO;kgyGKVE@M7;C>{5&Ds*X7R=IvY0ygaG!@Nk9UimIxzz-{8^ z&YxeSt*sp*rlh3QQ{=U-wz;{ytH_H_NJyyZOGU-WhK2@SQPE9mk&+$}5nK$6jCHlO z?kdlP`NYMyWMpJ?{aI)iD=I1)Y)snnDmE5NLX8Kp9;)w;SUt+{M>uXf7nl0w%f5gA z+EWUv!o<6Kd%ebgb&cw~ao z(he=n7pyAk>kCkBEY1vZ$hb=4S5r-YN!Z)l%kr}LxrkI&R=#=vUfJ1Ml3zeTT~pJ~ z$A@-iq?tK@T}TeEOv}vuVDml=^ET(%#>*UH#vHa|t={`CzbpLub%WhR$MQZm9v=rM z1%>hP@lQ4*8vOi+4jzp0^jxErs<$??x~1hsb@(xP1%>h;E&=SU(e2y3{I5z&6&^i$ z^lE0tT6p5Y*29CBw6wG~v9ZZtcU{=Au(){M#6*ad^=g4@1dh*}9bW60cN!WRnlAi~ za!WWHArW$J_oi>#Hg8rmGBRpUi;3Yg`I)A;zZ2Vi^6J%yy?gg&*v+oE5; zR`&PzZ@0X0gV$!b!QW{jH8oXGNJ#bP&!0MZKVGZ-o<5-U$xl*BN_&5p?uzhvO4q=E zPnftFKTg1*Lx%=iQU!FbUd^@{8X6jGe$PYc>d15A5V=9QdGjWPGB7Yu`{PFm9x&^` z1|A-s)C0jd`6txXSqoMc_x1JnQ&F6yc_g`+#l*xkGflZ7rJQ!A1^W7~o6pV66yLC6 z!^5a3X39~AX~F!ZX%*{{CPubhXBDno*@_P_Ir{VPO+!QdzKRe%6FO#Q-?wk~4t#$} zEh8iIcVXeg>C+odojPT*xaPCn1UDW(d)`!EpBgJ%`sItI1NlMcI;QP@FJ8P5ds-zj z5x`Kpsi7^yME>^e-CI6aS67phASW-cxcH;KzFyBaDKIdQe;EsJl6v2VnJ1{z^&ewm zVq*Iha|Z{9((>}&*7UpNIlq7ZZa&qcn3a`9aX%@w#)G0jvuDp9d{W)H(Vtn4vwN{) z=X7)!u3o(wVk^pHT5!L-_r&GPTMipm_cc|8A7gWLbTnD~5EmDx@O1}2Zpg_~r~IAS z->+2nPPJYXqu}_5wORa64FrJYZrGzj8WIsTpGV`W`WvnIqD zS1}>|Zu3USd!y9ZX1`ABf-yq-_MWt*s){p zB<1DhLl52B@Z4=>X+hMytC0Ph=_yOgLsJXRp;As_SM!};a&Fs}7#DYs@_}dWM*zR=npt*W5V z-`^jXlA=oPn#Av(p&^6>fdEx00e_tvwKcM>yhDeM;)6%|A) zoSvMF#`8TwS&_1zjBezOJZi!3;N%prboA)ahsnwNr|c!qU%VK1Q2)!rw{M3>^65Ez z{QU5?C$C+Lv{z7&{juZK@0utp-+T(W6F54BMMYGnPoHjg z2@CDryCESVfxr2a06+f?6BEW;w{B4id&`4Sq}QP)D<~@q2njJ>&9OcaCGEnyZy!B{ z3^e#j~+Y5CoRpL=Qz7D+aW$9gB@l697_AgkB5s(N{W8}$zB=%_WXdw?`p1# z7cUl8S2N-Aw`ZVuqJepnrfFhQm*-^nDdE+tHB(blA_ot81O+kOljAEcE`AsmMvqRV zsikGCcl`KqR7Ki|<915Vg|D8| z(rO*BeBt)GwN>j)Qj!<_aImV?IkgChS$XmJs!*@iqN47IjGF3dpPZbWiYB~;(i)H#k2~`0*|Wih#2>zlzr$F=r&7Qc$4Lcz-RhtE-Fshl+{{>-OyrYHQE!-o3l<%NJVx@*r=t z9q}!T|6Z*1srjuxKmO}OM#jpwTY1dJYE_?3IXX&+nRV>XkVa)kVd05ZR6Tqil`H+l zP8PZw`ubj|QRHO(%C#%U1E`-nN1^=f_T~BD@^5awK8Sf?>!*8Ti7z$sBw~k9Kv*_y zy4RR=IiO#FUnkFT^MUL6rG`;1U#cEzp@k|3a~FO8&VVxn#6h-|W(}36msdz+Bood- z$V&|zMvFfKs++cKDZ%ei(=xCmjtu>Ho#nbLLEzY)#HRUETZDDo!^5|`{u>jYw3nn5 zj{f{eMM0f7sj3R7Rl4x!cT9Zz+AUkQe72ujgHnWrkZpc<^`QOajSvX}9{Rs-2EZr; z?vs|5CO0(c`2PJ2xLG{LHC1yB->+xftlYTtw>LP;eu^L9XKHD|iXwaF48u;4;@@8{h}6;1 z$?8XueH0QBgZh)2_Gfzf8S5#K|qvF@ZyG@mCxoKd~WE8e#zosnKGw%I+ zHLKs%@t;143IlT7;vZZ2h^B1RnJ-mVUe3l^_jjuIPRj>fp@Ac!qH*|8qyYqS9Q1sf zl%y>*KhYpLB-wW1u-ngveDYbHCdS4rn>UvUjf{+xw6}+AGchwOtEw_CEiHBZ{_WfU z?YaD^Q|p6yWN0b(?%lib^~oN;!sew|RL`1Z}~+-?P9@IY|6S70EcL3McLGCAx_OiXVQ6N~V9 zu}0ScsMno5dD0!X4?V4@cdD>=sI)4B@B_aT zm6fdpdQ?P9oSB))T8xX2R~%mXs9WO0w}1bG<4;x}qT;N+Sy}!kfFq0dGq<$#eEgUV zfIH^hyP&MBqr3O+E&lO??d#XCbnDljP*hy&o^XKL$;k<;WqvE&b`L#^jDV^_MNQ4R z<<+4UMh1p+nwk~yzx(_7PGt5Ad0u zzJBLeiGy0pPqP7@BZk%6b#iSPX=!OWq@9oAgIX*v+5l`7S5~ga!6AL5HPbBk!2<^C z(Uy=l+ukpM97oN0@gk&>fM02h9CKTd1kCrsrvf~n#u6+>-H@CHA zzv4DOewB13->xfHuAsTdqiCw@=sduum>F(VN&XCu6qk_j>T0enet*C-Gc}bJm8NUT z-rU0Cgq+-(?^RXV(;q*6WaZ{&Vq;??5Ef+W#6(A)wy~9#7H3aS&pCBqc?J1Yl2&21qaU7~W7xm{;X^#Avy31tL^xA-9eTiqNt{?-w zkxz)o{x@5dia$jEpZ}q;Pmr1{m`jH7PfzeJT#!=@cR_nXo<8-)o_uUB_#67{8LfwG zA?=^lmLtpq*DqeA;a?M6uK#{Cy{tJjl=JqTJE>B$ujRC~7Ujh~7Ah($M7T=@Ud zjwkl-*|Q#)!RSH<;OJ;eYH!5I#tq&_o&Sm`1#)`7yPE4+^Sjq=^&ii3*U^@PeZPMf zSS^^PInA41)X-Ql=`T>*|K_C~I|@XU>tdp+L(V=J3PO+i$mRlTp9d)}s z%VMVS@^$r_HwB+(xGp>9*o?4eIxkG$YRz{!-rv_(>rO>oQCfO$X?gih{;rd-Pl#htq|R3A^{j^C*4?2N)`y4{)YVm&u{#WWWORV&Z&$a-(NRI#A# z#~x`UYu4%g3+9$O9U2-c>NsOo5|8v|>?6!qLdGYs^4I34(@<(H^!UY8Ic6-~-s~x=R9QfFsp&{SGV zONPm|1hpt80Re&inja`=#Vm9*5G`;&C#R-7f`ge+^9z6fnZmmB9X!a2X3lZMXj5`> zGD>u5>tIihCty=II?HZhVfIrW)6zWe-`{{53n7CVFN#ueW27nN1+YKhZFhIK2PB}S z#gX^?ZK#7iKp+%%aA^I%lik3|<;C9gXwGOl8;(jy;1qM3nwpa501iHX;ey3@`>~KT zthv|pv?Zkw9qypR^i9C|8`FK2C=x|Dom~?X%*x8j_KuEvb*~iZ7#N&++~m|JW|KS} zCRWC!Yzz!`R(}0@-quzu)07Y^ynv|#4olzo_*s+`B0!ifqa6+Xsge2p%v+8RN3agN zST?+8?_Pc|)zn#;F4fIwj}5rpI>d@TQ!zw?CRG41_T{Hm3OXh?rQyzxfHPTglh*a>^DjUA(9;H@NF;I4{(p z5J|A8Cy|k76%_LG^ZUlegdTO|yEtKQdY(~JQ&(13ziXUd$_Slr7~PZNmJJZ(QQlkh zPh3us)t%!g|nsEj{}ut)`ELHRm)mXnA;|#F{674ye~L@d^tw z0U+K!67}fO#x-l!;F`LFzUpJUu;eFBoS@pYX_HpF68 zIuK{HJD2vG9cE-?1Ui*;m{v%Rl=*F9i(iB`B8!HM$1%GQhLWCYSi_AfaL>mlBUJ6| z*|U8imjE$9qs+enh_}ax2batLn;X+McCuPbg3wUTWkju7lUJZ6Ry(8Ea0aasb%m%8 z^T%Gt$MYRH@Sbtv@7RavmFFKbGJM{>6V6{4Jv(qU=N=9@2Pdbc$*I$)9mkx;AP@r8hJ=Q0 z;Fr5`Bf8?&Tb#OH+-v)}(XEu|oSe|M#}K*hKdJfshoBCijT5^!>7jf<88uEf#RD;L zOLA-zH|@)3xF@HZbe-R=(&>1#;R^d|>CXuWW@#Tk3LH6dg!~0hxq*Qp4v#PlOvoi+ z?e{I$yjyO1W=0Sq#u^WIR18_L$DP}@ZR6+vT3H$6y1W?j>J>jkuMp^EjZIA(S?eH1 zRn*r%vbMI~y>q7zM6RJWvx5GwE2#99#l-})mbG%Qun^?ikbd`aeO(C=NBYorAr zi;#y06c|sQ1=p$U=!nFd5B8J=C@9QSiFcm!W#XzREOZAY*x&RTmnQe*ubL>C*C)Ja zLx3%b`e1EiLt22@>bkp%R#BmhhBF~|xvK}GvXr#WpZ5e99~>MskG=glX`n>?>eXNK zVnzY7yt23h_LAIqFWw!qrt3m+<_M2|`_?F6=+dQ2_9)$WUBJSBt!W@fyf_NU$?XG+ zVc(kT>VT)0w9}Vu{tIb*+5N9&`SFP==hjfK(AmWQ23m{;rK!mR$j^=c3P6`=X=z!C zzr1VLuJ+FkY^aB$vuuvDQ&UB#od@+w{WPxEgdd}hIag8b>NX0XnUI42^9eck|AJaZ z8lre(&iPH`|6^KRsBw!XDjGdSm3e6%SS-(Jp4~yh2!zpos>i#+7Okul_&mEGom3~^c`H`l*V}vT&a>fk zICjFz1T^4WQBcE7uUcD+LckS4`Awa7B1Q6p4}{sGZ{O&lytZfT*s(*1Nm&xgQp?Yu ze9-yPI?$79>+3y3LRiBiA^_Strq`|P!hxjQut5$l_bENSF4OEfxdc#Om9Q@XZCSaw zC5?@nWq(-pLCbW1|Ng)kRn@ZTox67RqSX)@jLt&K$VnqjR8;FhmgJNaT{AQ0=sPn{ zpvV=1Swoekv_vjG7G$COU{J*={DN>({7tfEs^>R>O&e12_aSx1C|$s!bWBX97o_mH z3Drd@CyflWmJN-7U*N@PYdSrYhGx_!esRdjXvC|z@7ZGXoyJENnc-EomoMb-suIWUkRBrN;|@04|dXJ!A< zqa1|pgS_EoKcHR$`u3LdxH`dhg-@Kvf|d|fAh*Hl&Nm3uBpyWbE81uasjut zOWLz&XBZb{n6zn~v9h*Szi(PanH@pO$ zN3}QwWAgJODX>X4vL0cy8bKR{^!()ELsFwq~0vYnBblG0D>V{K{q z3TOMAgTt}ek>+3@#%*61<%)dho{2y%dvVyuU33_cJ`aF`UE z4qQp2$u#|Cl&&(F0WIa+wQJRkNi)LGrSL*N&`|r+7f7FOY0;E)S)7R&UJnTbY9Mej z1A2M5l+!bn<2J+pQ3ng$+(Jx%{1kI`qTEkTPP#`%a>E@F5UX87Z?rxQV$3~XUnrM7 zdCzjqI;EXgm**$v=6tfVkI^!4@II2h+q9q5HyK~T7 z3I-B-h2Ci*aeB9qP+7LsZxJAC3Mmca9eLjvr(0To&l*DF{{l<#gIQ-j`;RNQ(Z;WAt?VgAyTh!-zm{f^W%Q^?{D090C;(N zdb(XV8;28C!tO`E(b7@EjM7yN3=CR8T7-47+{*&C^un7^fb(=R620&KrxDfOcfazS zGF6>UMTW+~NhABCwtRk~)2(+) zD4a-Wg;VH=HvmxdhOpod(Eo_^3D8_HpC+__KY()Z`+}7m)dj<|&Pn&_-wyB4AKr>Hg)t zx`6yIV58(O4(~HvhCQOFbO^ri-sUKL9B&|d2p+&<_W^NwzCPUt4c5)%YL)U{XezL* z(DJ;JlJ?OuZU5Ukwvmku2X$AI>g3Ff0zj*2$7g?h+}`gm4-<>*Z1_Wuf zPdEvvAZepoo&P%vkTnbY;34FJ)YPeMBk$h6Eymr=s+*-QfiuY?$RZ1 z9E(gHpd1hnfgL;6!l4sl+J4ksJyyxz_`=nzfe;)eo#q%I)p+Br>>huM>NEpUf|VFz6Q%5xM;*aF<*R3mj6?TLGM)26cCJ z@jjctis0XORd0i0AOQSb78{IKfKM0$LA2eFTq4vXc@-6UXX&WiE4#$R*wKLR0h(vJ zC@ImRr`0B1K5*N}C@p%W62eR|o$>t<{p8I%3`>yZ=gBAN8j{x^2*IN%CPb*@2z{MWa`8wz2rKnQRP}aI^D?s(f`u-m|eN@ zvVuj~Y#&y%si}#aBiP4Jo<3EiwIfuXXq4GY;uf~HUx4^lGp0Lt*-nTH$U#E`pQVI; z>0Ml&@9ggH_wMSt0S@+GIw9_^BJ^WW77MtDL`rRI+a~+NUWeES!ooi3=|@n(eL+Xu z{mk(j6nA(S(DGoX`$C(ex*eLkPeOuI-iLuIxSZ`yGYa1%GzJT{wV(Iy+(`>jFU#eh z*tLA;^=L0};@69tb=T*BX{A#<86=kA3n?m=UV3q)O;U257Y_s)fJadW}V#e@$oPi3V~l? zi4YrzNVO>Hlhe~1Upn-<=sFoGDZoAw|7`B!B1QbZ2b@PXpsy4Iv*_ySd4Bn#1U;Bf zN{XwjtjzDhgFc@RjO*8XBqr{Gm_+0}BrB-U#M-kuAVuOA6mH$xfify`qmY8B@*QEEy5*mB?+ue9{F(F#47 z`|UF_08b)Ej*!BtuCDHZWC8vdHJpA3JNA=ZR3xGSeHJF-jjGTi{I>#mWFp(b%zmb= z1zmjsV-?5$9Et&UuCS?z9UYHE2Vj|_J^tIWswZUMd*=H0b&d5j4sNeuLxuzd(6b&< z&7yS&U-=dv78Z5^mMWAiN&AP=t4mfPV+aNe0sBX3W}|dKAlZ@80qsrc0mljCWa3d6 ztR7D-UqO3j4(`zDt<)*;A+ZD8#Ndy?XK_-OskRfb@C% zK?MaO+rWGS#XYTDt-e4}*!)Bs4D_F+uU{j!c$Dmp0EueG)Q8x8#I-2tH(;YU)`SCz#mc3}- z{8rZszSh>V6s)cs2N|^(s^2l%mdPx$G)WyP=}_Mj$wh)4r31^35x`XQ61UW?>}YOF zB&(e|RRnR+9PTfr5a9jclP5DB!*{=UhC0L!+_82~czIy$niByFq14kR)f)|O-GWHL zj8Y1IL(JE^f3|UQ>OuPdJN@lIUE+mZz+QT(5UCHA(C^9zuT{QUj9^J#EJ=UOYr;BGKOLjih+<>CKtVc%sMtrED1 z$E|E^i1`E{T9=|NKH8DD4IHJ!k5#}N;x4W_E?yU^2}nlqi-Y=I-Q85649VJ=Oe8Y~ zsQ|bRlx=VLe~}eEo2p2uZQ0q`gk3>}AU?|jj)QB^yb%RRA%Ls-x?34gLoNLF)I+$p z2hkZIITp9Ja^la`*41^_XPUIpnwgow+$aVsg(2UPes>GfZXT)nn{^Ei z`d!O&B+zKEDPr>jT>Zl$Ms%8r<4~X+xG0CFzBV>U?*04kK`r|0oL}+jq+6Mc^b0otBnTneqlTZ= zUcP)OA}VS;d+*z8A4bE{Pn*TV)d75n6vx0JLizIL3lLQ)aw`JU3ptz^)v<-wu!mPuG9?bJ zGM$IURLtYH?Wj4q<9~;j zK38S-2|;2~OVDeZP(t+ZN01p_WaD%dDA;ZPQE$N3ogEi6p@?a~}5*GM2Fbtu_ z^9cxe0S6W%ZWO`u-T>{58aAVt!mVqz=(>-*qx2fulERE(uR4vvj6;wQHe;)98bG7J7J94YN`A21)14ik2ghVu9CUlQKLGQobA z56GNdo@+DH%(mQ79VOG5@R;Vnwa@Me2|H0|S+;Ch$IQ%3G!~$@GP_O}U*fHww1bU} z?Ik%naJ@3<8X`swyYad=u*Z<@N|2s}tC0$|A3vnrZdFN$iz|eqjAW%}R1^jhDPr)4k5pU*cOM|ag62A!m;IhEnOyUAR4FM`LXle_rAWH zF!lZ8#Kpu2UI7Q$+}2T575ML0X($4q-4en<&9!sx3&kPOFP5bBf zf^~L({IU5cp#kvXxDgBn4jo_$9D2%j3zVGn2~ST?il|gzz4J$MesFDgS?IDxLf>23 z*nnU2;nsLzxANxhJ&TXu0k$lZk)Iu8fI5YnRNK&CoErYD6zjyfF%1FJ zpk*a)D}Q)M6a(=tb8~Z+tvlqkwYL#A4gW;<_H8}KSnYtg4c$oZf;dU$wD%nV#k*7P9B2NJG^9z$GSyeo1k+wuA$;2y_5)`&!{;bw)Z z&IK!r#6hZ(V#;K zDJxTL3NP(o(BIi7HnOASBP1S#tR8&ig2C+;1&q~K*u|$ zt^M!$zJUApK`E8ProX^616UAB2t@V}6wCFs*n@52#AKvUHf`Pve`F-$tL}^7r<*9S z@~NSAo`AY7DJh9ik*|Pqkon8cd3jS%n+tTVAO->Lto4bwu<*OaXl~?SAkwY#G=?N0aV!CjaO>!x z_M?4=i~+HG0@ugp)ycM83m==L{4;=8YHMp{LESM~5E2#^06Hy?Bz9zEq=_kYiF0xsB^qJ{*p#xX zYrdur))Zhx0HP51Adr%Rsi`m#C{e5l5Cfeig(Bk^G*z@7q7A@*1L!@Q+z!fD`0E!J z5?W@PYbhU)9snJnreFzt0fCEP{DTB?NLcSi+m^?Ga6oxf6r2U5YWtbyA$Jotw27TP|9Q^J zS%frckYq%-)*MqZ@VsAr_yDxF*?wi|7`VYyaK6@+D}2X~hvm8QzX#$nT~s!@6C4s1 zrH1wVk1NvSGz`du-h&lG(gJn9}!X`QkWCp4u=phKd2o2Rkdz?rawIicC*o$}js3-t!JRcOl zzxGpBXh2&Y9K21`NDu*ZuMgPbN=;}f7}6nfGHw#6y{x&p$jt1lu8Bz?^i*(h?{87K z^w`Z;hyfs@FxZ;D4{Y$^qepAjty@Q-u%gm!2Nw7bL7ISjYrph2RnzOLj?TjuFX-UG z+`fBP0O?9_aFW?;uEzDZvY`}?wPkh>4${H=Mks;2IhL0CdE}EP_kcpdSyyJ&W~BB( zjzelo)BLd6MQv?*8=KjL=#|<)U9EDo$)tg3gL&8gHUy^f2AUkRqooku7|J(K^2+6Y zM7o|U`^s$I|3>Bner9fEb$9kRL~xSc5;JL?DQdlKV)ARaH;2q6L7iGn%|P4+THC9# zPbg7@k-#)1@pX7$)sa&46d>+@UGu`9>0dJcq6~~dtRQf)eH!RK74a!J+!TuA+^9eN zP3DFi@c{7In3!%~Q(DRma7@tKa)RuIujcTgTH@4GLb(~4=;+)F3Rc&d_P6PtSYF>V zWzTQdidROGTWNIsc=XW07922=(E#fv1eXHkm*(+KRirC;p)2|$zZHv}!c9^{G)MHv zk%I_m;&iN`z^m~?zH{rHJ9lcEn!cbR)j@lH7YV_7X|jYFJ6ena(6Nw*rRx1RQJ@U% z3R5c|ZrAbSV3-dP1O|)?yj%-I8U!j9(*RI3!tbx(vx}p(2xF`PElkbLE4VD`-6pY zaB$q{F7`&za~X5e^X=S-!lR$%wki#s&I5&77c5by72H$=!~!zB9{xSWouqAd@1`S@ zAP7fv_4E`o&Od>AfvQYHLsJOoj=%yqCN%{$sR&LyOkbR*5;P)cjLS`9(CF`Bh6b%( z#I*frJ9sW4t2&FGYw152HSR@%lpgOZPvA9XTDC(KCN+Qr5eo|o+1D-I_9rY8o;gat z-)!!JvovBFB-@7c8F~f6wIuFJl4VFte*oJf^K+Dy33Hd$Pj`qpf`#SVv?1i>OMe7f z^^5PVhlS6+P#*?XidmOHl%?pnIC5%=(JH7!Z9YPJ@FEveO;qCOQFG;uDT@!)o{E^w z4gYCK!HmdjG&sLx6mRZh5)zi*h)Rg0im$eYhDHJz2_hlwUBoMVJ%Uf6h{xWvClld7 zZW-4z$nZzwvLgl#SF!Tjw}5X54k%H;)Rl!YGTl~JNH{HZ7S(1KiBM!`WxYW88$zp_ zL5G6Lp8#VleeoF1kK^LZ9+K)oODakcKYTbAB1UGGDw2spI#~|^Y}CM-L~-7~e*Z4W z4^+etnz^x32J=CLG(JO{JA*wzDN#XXq;ZGG{6p_5Y^WI|3Le7cWMxH}3PH#hGgjsf zNKhz{j3rcGDaR*x(-Sb(RWd(*ylb<4O~~s{9F+|?^W%2VC6RK-3?;=2k+GJxHmebo z$moOw+UTK`1(?CFu*+n)#=v0b{5@?Wqqh|#+vp1=h{in(7AwM&3-d+UsZf>Vw zMvH(i_yH0U5)|GhMlw?c5VIc9HHZ^Le!%&GuSM&=>cqt94nIs!PmdzHtQslfR&C?q zp1|g0#`!yVZ90upx>_Z&koDJHa?W13z=n*LJw{^V;!2%v!Fc!r2_aj476~Ma-~n`T ztJP@P3k83#3LD-rGU7+a*Jj_~O-vaOQq&-INLJ|5smkiaz=3vQ!A!aO*`5`;h;vd7 z_M&@u_&%K~0?t72lBjXvUj&<*@9>>zlf^7EPDT1p)B08AD{SN^~<`a=t zFx1>K2p@mQ?~W_9qV#2pLP{aYaHx86P!Eaw`tTu(FlO>%{DOkMV8AB(z;loh%Zc10 z?|)s;zH+4-6R_mFV1d=?li3Gtw;PDSnyj7YGiwS|2lD^8v zQwZ|N!MFzUZYgk+LH3!HI?@mj`^0#22~b;>2~2YGIjko-xE2=|!FmRioJ>?@Whs!H zv-(kYQLO37`9_cgr5CZ1ATTIdJR)Th*$rI~ECOIxcJWBsyWNmJctws z26J*%C;p-NOwP}v+42DzlPm$wnYpsqK8<7&h`9FI-Xl7i_e_*D7X$-&9FVLoH=BnK zWwv36mpI302cCW+c)8TYT^RU5d|&g*72Sq6>Le3MAi$97~|#&r>tUYiBB6phUrvk3sU8)MOl8 zp&+?dbY-Gul=v`Gv+}|DC!wfC&*QeEvOsQVZ0jjx3L2@C`|yGDQn`3ynWqN(@mnBj z6v%TS@)jPl?x=i_RMWGrLgL1~P!K+m7l7&{38@AFA0gYd1T7#8KZvVmy^mOujEsR| zSHC)50+vNNV1hNQ(b*P-iWu|imFI|Z!6}eH9GdwrR*b^J!bsB+r&=IQT1JKkz#o{x zG<9F&l62PZ#BX1}n$Hejf+-%0&jhp46XQe;jg1xWJRXWtH()!FnHT3Lm{nD)#A$5+b4WLD zZ`T=@=u9F>8l*CjDtx>x5(Ai|Ta$i;`+EJKhwFouKMjw@aB7JC2Wkf6)f1eXS4=FU zv1Fn74wKPK^g(^JSGXl)n#2ML44?>e`K=3(j6rE; z3m=Z8D&c;#-`)*&J}~#z>=kMgHiKvbaPagxdq6n*JhNUx)q~{3vVHr~DcU0fKk`x#9ikt95d+fxPQ+c@DheKtnq}igPhzVlngjm7>+FMJg9cq( zUcL?~doLI#uB*#-6jgD#&k}Z*@8;M|1VK911r~q>_=P}JWS~qbrJx)k?xqH?dXZBS zOMj`matbZhe&q1189y+oHyMZu)rFGZJ^}WK1dx$ccZ$h2jM`IC)0*EgJN&DPXeU^G zBHE$5!1n2`E;YDyE4{_Hxv}vUTlc|LPT2bANuc*gNzyJUwD;_9Tqbp`8Is&;apBF4 zog1-WBsvI)S+eE2vj;?&H53F}v_6Y~eb5UC#Ad$r(v`k+-dTDz{dM0e=AM}Nn|rS< zFWVr>;)C@Mv4O$Wenj%{;g9S*^EgSpOm$n8>MM;~Kdr~A6Y4<*_VH`Jmw$QyMdo&PzQ|I71psTi6R7hIWX2aF z$M~UeS>D25tIZwR<)SWmZcC~{RKq=Mb(1wM7!)2F^`8w$TN4m8^wv~l^UI$0?VN^U z;%qjR8`VGF`EG5cEq0(X&Hg8caP`{vWqa9^pRp&MSKL%&nW&Myc{ppqd6hSuhv&qt zm5ZBX-j_Di{BW&4#;+z*a}59e*N}M4Z1Q)vLx%-Fzva>GXeHi_MrD9gtXy1-$kX0V z*MiHHDyo5d??(ssJJ|#00th7hquXW*$?at8RM%@lnt+98puL0(6QhxI5TY+kHQCoc zbbCtu$sqrC1FOuuTy$6^fd2jL`0|7eK%DDRH5ua1R|c`IDMZi>6YUSMC{z>@)hXZEsLG#gBcp<}UNOPSjmL3Sa(*sq%}%2QvR~ZKb7?lM z^Vsa4Gq_uTU7*mM%Ls#^=_nv_fP89&QF=Wp`a<*T87&PBB@AKLG>*XOr~o;&_YRW2 z+40!{c}UuF4Ln|KonKRvMpjOaT>SZNoN|1F!$hq5wB&)wwBt3rVquJks-ic*>Z8Gt z#IVShnnVZ3wQW0Fo2k1OWc=t5_Ublv>yLQ(yP){^>|uq=JI-=PDtjMzR9Nz(rYj=U z_jOd!@gvM?GG2B@+>x%dm|m1zW^kSTx0Zk3z9j9RiD%(1vqGZtrr**75lPMACKswg zVPoUdJ=fY*uqkLUl-N4DRLutz#{b?||;LNXo9L5&30G`Cig&#g{=L@2@ zOIXvntuBj~H?_AvfUzXasjh61A9;3^N){sH%|lzie)~pp^O!&&{C{*ACmgDdbZY9J zP4`W6S0gX|-8D;(@%W8^!W2q+disa9vF)?p5e1=e?HYvFPckr&05tOIZyqAkhmbPJ znK~WsslZhLfl5uLFk6*P)(jr4vctqH_fzql>0fr8-Lb*a zJ%b)LdLkTXMDFlkdca{Go{nb;C?i}DksJ&7$GCF>h{70rd>Omul|~W<T;Y>R0g;d@;9!EWLj2Lr7}AM4=5x-0PJ04#JxIZ0&GpGhM{%NxP~5svJCN7zL- z8ciG*M)3_lW|dH$b`c7sM@csZMp>;TxbWxHuUzp5px1EjH27F_^H4XwrKGDpEHbkC z-U{S{06-Aqj?Y_dbGe|^mg6CyIo+F^v&8}rT1(*g%O*AIK~D(Jz>Lt(AI_MY1UD!F z@K(Qejmfu!Dp1J_P>NJtR8O=sw?h{q@+F^^{xNqHcsRcsMEVJY*P7I!S;sZ9S}D)` zBxsry_*s7%i}CZHR#V%BFU&A9Gc%m8=(p5D3(oDxvDt^%On$jE6ymdx8}WrCsH_;1 zgB}V52@XMWDL_$!Qymypa{M=zd208jM`w1%0=iq3F2$YS69F0ZDkiVlC}3ke9|>;) zQ#m%axUis(zR1dof#3`Hs*B*|f|+`io2i;Dv+%5oSl0^jbE4xtefA6qXhaNiXE#G- zMI+O12HbxQHDlDx-0;l z7gYvL9hhHYPS*+q%wk~$Fs6?dc;dFu|NP3!J%)zA*ZFi|yp*8Tch?Jo;0Z1vh0>CC ziyka;T)X|+?oE~(bfh1k!|Rvb-<-FyR5HlfkB#YqVSO&CaX)|RPh+*XuRmtsaOADLY_x(to?CDekhogBqo2;)+5p&dx+( zLGzW}&yEOTaBP;tL_z$BQ5NPw>E>BcN;q3)OYWQ7_IG4}h2;!s&tH7#hENo)Rk$s; z_)>W2?~oxKX9-|JOvL_-s`eI4*J6x6?@x?&AcgQp=MTMPz|B8uH@@9HNZ*UOz91(v zx(}OHS6^Rz|7;M)!Je4ubVS^;oEHv3SD~UvL@X@RG$jP&#+ zU^TgSET<$_m!P8CkECRp<9kYWKRvCvpB=Bc4*b6y!Ylr?Z$^d~HZLeG074r{vSLh$ z3X+hIQmjMQL^*CBOnEdh+yM_z9D?Hy9y~~q(3k@s3PKmUfrfzi!(h`F$l*{S{h)?c z+&o0)sy=;y)OQaSo<4*gQYFspWOH4bQhvZK#R-#K4imMgsU*UUKZ7>P$Iripk}+};#=&4WzG^4Sc8n9-4$_om{4Zk!wU zMPg5slQHi6kUrN^K;h%PlJ*z{Lk8Jud!=b+EG%U>@!t(ZIJ!ng=EXA2XqROGg^teVc;%8C zA|H-f<8ox)&t&qY_V)HB(}pks7-;2#W3r2GxHlSkpHD1Bivs-ozC8_e74Yf9Ph&E4 zg4P%o1hC$XZNWe5#n`yIN{`wezvi}VgW8ByA(EHD$F0ByUx1L0x!?;;Fc!j0vW#HR zP!x`GTCMVE_CE$HJfC=xL>^&y66S)Mg?mPlNo}a@nr~n=_}~XP1K6N5;YUM`I0J7( zMIiL_N zLD<(N0XU>1TAawtD|qsUyUoJTarDPp(~ZYJVuFo~nu9Z8hEZNluGsB7S9iC=0N-#$ zjSFfp;(`+sY8pvT$#*3gKt_m#LxVC31+5a}lUmx^{(gg?)qql(uGKX)!O|;#_0O(+ z$M@pkVKAdsi-LP)PZRFaqto$H1MToZ#T5ddAYBc zX?x3<6=$H255v~tN;B~IddSKSo$c4J|B0J!kX#O~mQ1Hmo}Au6zG(}>2(%P?2M0be zv1dO)c7HZWYW&p6lQ-O=BpnVVYwUv%jW45n`4ZohR0KGP5WEhFN#Ra`k7J5qLVX6!nc0h$ zu^6+;U_E4#1z+88jrH;C>wGj4;g0x9AmaO2UGtXnXlS^&{kSc|`NSte4`&4*HA5kP z`F!q46a*Mf!lZQY%|t@g_4NEpv?(BdfZV)nVK{b+Fj6j=V6b zYRtLpmXr*aUg%>p`1bvK97K^+7OnTqkI(InLoZ}gSN{7eyXpfQ0zwi%i?<969x3q0 zz?EfVwaD1Ek+mvHCJF~iUV*FI4u&y(CQ?HuHu~Q~`%{4-_X-m^ww59+<*$y|VIVfeRd&b1uh;z4mA! z;za@(u+vBlZ9}4sl~o;+tPYNj=TUvhc;v;so68fAa59qMEKr}2cE$sEx<5G!-(E_( z4I%1DXy|E`XZvGd_ewyO)nD$G-U}7y72JcMKs%$zj{2d7wd#tC%3+9 zRijuENYlM}^BpK0YdT!!ui``LLqwdH@-Hp - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - Workspace base Workspace top - - - Thread Structure intctx Structure Thread Stack Stack Pointer - - - - Thread Local Storage - chThdLS() Stack Limit - - - extctx Structure INT_REQUIRED_STACK - diff --git a/doc/rt/rsync_web.sh b/doc/rt/rsync_web.sh deleted file mode 100644 index 833be52f3..000000000 --- a/doc/rt/rsync_web.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -rsync -avP -e ssh --delete --exclude=.* ./html/ gdisirio,chibios@web.sourceforge.net:/home/groups/c/ch/chibios/htdocs/docs3/rt \ No newline at end of file diff --git a/doc/rt/src/concepts.dox b/doc/rt/src/concepts.dox deleted file mode 100644 index 0c9c6528b..000000000 --- a/doc/rt/src/concepts.dox +++ /dev/null @@ -1,409 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @page concepts Kernel Concepts - * @brief ChibiOS/RT Kernel Concepts - * - @ref naming - * - @ref api_suffixes - * - @ref interrupt_classes - * - @ref system_states - * - @ref scheduling - * - @ref thread_states - * - @ref priority - * - @ref warea - * . - * @section naming Naming Conventions - * ChibiOS/RT APIs are all named following this convention: - * @a ch\\\(). - * The possible groups are: @a Sys, @a Sch, @a Time, @a VT, @a Thd, @a Sem, - * @a Mtx, @a Cond, @a Evt, @a Msg, @a Reg, @a SequentialStream, @a IO, @a IQ, - * @a OQ, @a Dbg, @a Core, @a Heap, @a Pool. - * - * @section api_suffixes API Name Suffixes - * The suffix can be one of the following: - * - None, APIs without any suffix can be invoked only from the user - * code in the Normal state unless differently specified. See - * @ref system_states. - * - @anchor I-Class "I", I-Class APIs are invokable only from the - * I-Locked or S-Locked states. See @ref system_states. - * - @anchor S-Class "S", S-Class APIs are invokable only from the - * S-Locked state. See @ref system_states. - * . - * Examples: @p chThdCreateStatic(), @p chSemSignalI(), @p chIQGetTimeout(). - * - * @section interrupt_classes Interrupt Classes - * In ChibiOS/RT there are three logical interrupt classes: - * - Regular Interrupts. Maskable interrupt sources that cannot - * preempt (small parts of) the kernel code and are thus able to invoke - * operating system APIs from within their handlers. The interrupt handlers - * belonging to this class must be written following some rules. See the - * system APIs group and the web article - * - * How to write interrupt handlers. - * - Fast Interrupts. Maskable interrupt sources with the ability - * to preempt the kernel code and thus have a lower latency and are less - * subject to jitter, see the web article - * - * Response Time and Jitter. - * Such sources are not supported on all the architectures.
- * Fast interrupts are not allowed to invoke any operating system API from - * within their handlers. Fast interrupt sources may, however, pend a lower - * priority regular interrupt where access to the operating system is - * possible. - * - Non Maskable Interrupts. Non maskable interrupt sources are - * totally out of the operating system control and have the lowest latency. - * Such sources are not supported on all the architectures. - * . - * The mapping of the above logical classes into physical interrupts priorities - * is, of course, port dependent. See the documentation of the various ports - * for details. - * - * @section system_states System States - * When using ChibiOS/RT the system can be in one of the following logical - * operating states: - * - Init. When the system is in this state all the maskable - * interrupt sources are disabled. In this state it is not possible to use - * any system API except @p chSysInit(). This state is entered after a - * physical reset. - * - Normal. All the interrupt sources are enabled and the system APIs - * are accessible, threads are running. - * - Suspended. In this state the fast interrupt sources are enabled but - * the regular interrupt sources are not. In this state it is not possible - * to use any system API except @p chSysDisable() or @p chSysEnable() in - * order to change state. - * - Disabled. When the system is in this state both the maskable - * regular and fast interrupt sources are disabled. In this state it is not - * possible to use any system API except @p chSysSuspend() or - * @p chSysEnable() in order to change state. - * - Sleep. Architecture-dependent low power mode, the idle thread - * goes in this state and waits for interrupts, after servicing the interrupt - * the Normal state is restored and the scheduler has a chance to reschedule. - * - S-Locked. Kernel locked and regular interrupt sources disabled. - * Fast interrupt sources are enabled. @ref S-Class and @ref I-Class APIs are - * invokable in this state. - * - I-Locked. Kernel locked and regular interrupt sources disabled. - * @ref I-Class APIs are invokable from this state. - * - Serving Regular Interrupt. No system APIs are accessible but it is - * possible to switch to the I-Locked state using @p chSysLockFromIsr() and - * then invoke any @ref I-Class API. Interrupt handlers can be preemptable on - * some architectures thus is important to switch to I-Locked state before - * invoking system APIs. - * - Serving Fast Interrupt. System APIs are not accessible. - * - Serving Non-Maskable Interrupt. System APIs are not accessible. - * - Halted. All interrupt sources are disabled and system stopped into - * an infinite loop. This state can be reached if the debug mode is activated - * and an error is detected or after explicitly invoking - * @p chSysHalt(). - * . - * Note that the above states are just Logical States that may have no - * real associated machine state on some architectures. The following diagram - * shows the possible transitions between the states: - * - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - init [label="Init", style="bold"]; - norm [label="Normal", shape=doublecircle]; - susp [label="Suspended"]; - disab [label="Disabled"]; - slock [label="S-Locked"]; - ilock [label="I-Locked"]; - slock [label="S-Locked"]; - sleep [label="Sleep"]; - sri [label="SRI"]; - init -> norm [label="chSysInit()"]; - norm -> slock [label="chSysLock()", constraint=false]; - slock -> norm [label="chSysUnlock()"]; - norm -> susp [label="chSysSuspend()"]; - susp -> disab [label="chSysDisable()"]; - norm -> disab [label="chSysDisable()"]; - susp -> norm [label="chSysEnable()"]; - disab -> norm [label="chSysEnable()"]; - disab -> susp [label="chSysSuspend()"]; - slock -> ilock [label="Context Switch", dir="both"]; - norm -> sri [label="Regular IRQ", style="dotted"]; - sri -> norm [label="Regular IRQ return", fontname=Helvetica, fontsize=8]; - sri -> ilock [label="chSysLockFromIsr()", constraint=false]; - ilock -> sri [label="chSysUnlockFromIsr()", fontsize=8]; - norm -> sleep [label="Idle Thread"]; - sleep -> sri [label="Regular IRQ", style="dotted"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - init [label="Init", style="bold"]; - norm [label="Normal", shape=doublecircle]; - susp [label="Suspended"]; - disab [label="Disabled"]; - slock [label="S-Locked"]; - ilock [label="I-Locked"]; - slock [label="S-Locked"]; - sleep [label="Sleep"]; - sri [label="SRI"]; - init -> norm [label="chSysInit()"]; - norm -> slock [label="chSysLock()", constraint=false]; - slock -> norm [label="chSysUnlock()"]; - norm -> susp [label="chSysSuspend()"]; - susp -> disab [label="chSysDisable()"]; - norm -> disab [label="chSysDisable()"]; - susp -> norm [label="chSysEnable()"]; - disab -> norm [label="chSysEnable()"]; - disab -> susp [label="chSysSuspend()"]; - slock -> ilock [label="Context Switch", dir="both"]; - norm -> sri [label="Regular IRQ", style="dotted"]; - sri -> norm [label="Regular IRQ return", fontname=Helvetica, fontsize=8]; - sri -> ilock [label="chSysLockFromIsr()", constraint=false]; - ilock -> sri [label="chSysUnlockFromIsr()", fontsize=8]; - norm -> sleep [label="Idle Thread"]; - sleep -> sri [label="Regular IRQ", style="dotted"]; - } - * @enddot - * @endif - * Note, the SFI, Halted and SNMI states were not shown - * because those are reachable from most states: - * - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - any1 [label="Any State\nexcept *"]; - sfi [label="SFI"]; - any1 -> sfi [style="dotted", label="Fast IRQ"]; - sfi -> any1 [label="Fast IRQ return"]; - } - * @enddot - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - any2 [label="Any State"]; - halt [label="Halted"]; - SNMI [label="SNMI"]; - any2 -> halt [label="chSysHalt()"]; - any2 -> SNMI [label="Synchronous NMI"]; - any2 -> SNMI [label="Asynchronous NMI", style="dotted"]; - SNMI -> any2 [label="NMI return"]; - halt -> SNMI [label="Asynchronous NMI", style="dotted"]; - SNMI -> halt [label="NMI return"]; - } - * @enddot - * @attention * except: Init, Halt, SNMI, Disabled. - * - * @section scheduling Scheduling - * The strategy is very simple the currently ready thread with the highest - * priority is executed. If more than one thread with equal priority are - * eligible for execution then they are executed in a round-robin way, the - * CPU time slice constant is configurable. The ready list is a double linked - * list of threads ordered by priority.

- * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - edge [fontname=Helvetica, fontsize=8]; - - subgraph cluster_running { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - currp [label="'currp'\npointer", style="bold"]; - T4 [label="Tuser(4)\nprio=100"]; - label = "Currently Running Thread"; - penwidth = 0; - } - - subgraph cluster_rlist { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - rh [label="ready list\nheader\nprio=0", style="bold"]; - Ti [label="Tidle\nprio=1"]; - Tm [label="Tmain\nprio=64"]; - T1 [label="Tuser(1)\nprio=32"]; - T2 [label="Tuser(2)\nprio=32"]; - T3 [label="Tuser(3)\nprio=80"]; - label = "Threads Ready for Execution"; - penwidth = 0; - } - - currp -> T4 - rh -> Ti -> T1 -> T2 -> Tm -> T3 -> rh [label="p_next"]; - rh -> T3 -> Tm -> T2 -> T1 -> Ti -> rh [label="p_prev"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - edge [fontname=Helvetica, fontsize=8]; - - subgraph cluster_running { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - currp [label="'currp'\npointer", style="bold"]; - T4 [label="Tuser(4)\nprio=100"]; - label = "Currently Running Thread"; - penwidth = 0; - } - - subgraph cluster_rlist { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - rh [label="ready list\nheader\nprio=0", style="bold"]; - Ti [label="Tidle\nprio=1"]; - Tm [label="Tmain\nprio=64"]; - T1 [label="Tuser(1)\nprio=32"]; - T2 [label="Tuser(2)\nprio=32"]; - T3 [label="Tuser(3)\nprio=80"]; - label = "Threads Ready for Execution"; - penwidth = 0; - } - - currp -> T4 - rh -> Ti -> T1 -> T2 -> Tm -> T3 -> rh [label="p_next"]; - rh -> T3 -> Tm -> T2 -> T1 -> Ti -> rh [label="p_prev"]; - } - * @enddot - * @endif - *
- * Note that the currently running thread is not in the ready list, the list - * only contains the threads ready to be executed but still actually waiting. - * - * @section thread_states Thread States - * The image shows how threads can change their state in ChibiOS/RT.
- * @if LATEX_PDF - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - size="5, 7"; - - edge [fontname=Helvetica, fontsize=8]; - start [label="Start", style="bold"]; - - run [label="Running"]; - ready [label="Ready"]; - suspend [label="Suspended"]; - sleep [label="Sleeping"]; - stop [label="Stop", style="bold"]; - - start -> suspend [label="\n chThdCreateI()", constraint=false, dir=back]; - start -> run [label="chThdCreate()"]; - start -> ready [label="chThdCreate()"]; - run -> ready [label="Reschedule", dir="both"]; - suspend -> run [label="chThdResume()"]; - suspend -> ready [label="chThdResume()"]; - run -> sleep [label="chSchGoSleepS()"]; - sleep -> run [label="chSchWakepuS()"]; - sleep -> ready [label="chSchWakepuS()"]; - run -> stop [label="chThdExit()"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - - edge [fontname=Helvetica, fontsize=8]; - start [label="Start", style="bold"]; - - run [label="Running"]; - ready [label="Ready"]; - suspend [label="Suspended"]; - sleep [label="Sleeping"]; - stop [label="Stop", style="bold"]; - - start -> suspend [label="\n chThdCreateI()", constraint=false, dir=back]; - start -> run [label="chThdCreate()"]; - start -> ready [label="chThdCreate()"]; - run -> ready [label="Reschedule", dir="both"]; - suspend -> run [label="chThdResume()"]; - suspend -> ready [label="chThdResume()"]; - run -> sleep [label="chSchGoSleepS()"]; - sleep -> run [label="chSchWakepuS()"]; - sleep -> ready [label="chSchWakepuS()"]; - run -> stop [label="chThdExit()"]; - } - * @enddot - * @endif - * - * @section priority Priority Levels - * Priorities in ChibiOS/RT are a contiguous numerical range but the initial - * and final values are not enforced.
- * The following table describes the various priority boundaries (from lowest - * to highest): - * - @p IDLEPRIO, this is the lowest priority level and is reserved for the - * idle thread, no other threads should share this priority level. This is - * the lowest numerical value of the priorities space. - * - @p LOWPRIO, the lowest priority level that can be assigned to an user - * thread. - * - @p NORMALPRIO, this is the central priority level for user threads. It is - * advisable to assign priorities to threads as values relative to - * @p NORMALPRIO, as example NORMALPRIO-1 or NORMALPRIO+4, this ensures the - * portability of code should the numerical range change in future - * implementations. - * - @p HIGHPRIO, the highest priority level that can be assigned to an user - * thread. - * - @p ABSPRO, absolute maximum software priority level, it can be higher than - * @p HIGHPRIO but the numerical values above @p HIGHPRIO up to @p ABSPRIO - * (inclusive) are reserved. This is the highest numerical value of the - * priorities space. - * . - * @section warea Thread Working Area - * Each thread has its own stack, a Thread structure and some preemption - * areas. All the structures are allocated into a "Thread Working Area", - * a thread private heap, usually statically declared in your code. - * Threads do not use any memory outside the allocated working area - * except when accessing static shared data.

- * @if LATEX_PDF - * @image latex workspace.eps - * @else - * @image html workspace.png - * @endif - *
- * Note that the preemption area is only present when the thread is not - * running (switched out), the context switching is done by pushing the - * registers on the stack of the switched-out thread and popping the registers - * of the switched-in thread from its stack. - * The preemption area can be divided in up to three structures: - * - External Context. - * - Interrupt Stack. - * - Internal Context. - * . - * See the port documentation for details, the area may change on - * the various ports and some structures may not be present (or be zero-sized). - */ diff --git a/doc/rt/src/main.dox b/doc/rt/src/main.dox deleted file mode 100644 index 22bf45261..000000000 --- a/doc/rt/src/main.dox +++ /dev/null @@ -1,63 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @mainpage Introduction - * @author Giovanni Di Sirio (gdisirio@users.sourceforge.net). - * - *

Chibi ?

- * I didn't want a serious name for this project. It is the Japanese word for - * small as in small child. So ChibiOS/RT - * @htmlonly (ちびOS/RT) @endhtmlonly - * means small Real Time Operating System. - * Source Wikipedia. - * - *

Features

- * - Free software, GPL3 licensed. Stable releases include a exception clause - * to the GPL. - * - Designed for realtime applications. - * - Easily portable. - * - Preemptive scheduling. - * - 128 priority levels. Multiple threads at the same priority level allowed. - * - Round robin scheduling for threads at the same priority level. - * - Offers threads, virtual timers, semaphores, mutexes, condvars, - * event flags, messages, mailboxes, I/O queues. - * - No static setup at compile time, there is no need to configure a maximum - * number of all the above objects. - * - PC simulator target included, the development can be done on a PC - * under Linux or Windows.
- * Timers, I/O channels and other HW resources are simulated in a guest OS - * process and the application code does not need to be aware of it. - * - No *need* for a memory allocator, all the kernel structures are static - * and declaratively allocated. - * - Optional, thread safe, Heap Allocator subsystem. - * - Optional, thread safe, Memory Pools Allocator subsystem. - * - Blocking and non blocking I/O channels with timeout and events generation - * capability. - * - Minimal system requirements: about 6KiB ROM with all options enabled and - * speed optimizations on. The size can shrink under 2KiB by disabling the - * the unused subsystems and optimizing for size. - * - Almost totally written in C with little ASM code required for ports. - * - Compatible with ChibiOS/HAL. - * . - *

Related pages

- * - @subpage concepts - * - @subpage testsuite - * . - */ diff --git a/os/hal/osal/nil/osal.c b/os/hal/osal/nil/osal.c deleted file mode 100644 index f1d8c5e2a..000000000 --- a/os/hal/osal/nil/osal.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file osal.c - * @brief OSAL module code. - * - * @addtogroup OSAL - * @{ - */ - -#include "osal.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief Dequeues and wakes up one thread from the queue, if any. - * - * @param[in] tqp pointer to the threads queue object - * @param[in] msg the message code - * - * @iclass - */ -void osalThreadDequeueNextI(threads_queue_t *tqp, msg_t msg) { - semaphore_t *sp = &tqp->sem; - - if (chSemGetCounterI(&tqp->sem) < (cnt_t)0) { - thread_t *tp = nil.threads; - while (true) { - /* Is this thread waiting on this semaphore?*/ - if (tp->u1.semp == sp) { - sp->cnt++; - - chDbgAssert(NIL_THD_IS_WTSEM(tp), "not waiting"); - - (void) chSchReadyI(tp, msg); - return; - } - tp++; - - chDbgAssert(tp < &nil.threads[NIL_CFG_NUM_THREADS], - "pointer out of range"); - } - } -} - -/** - * @brief Dequeues and wakes up all threads from the queue. - * - * @param[in] tqp pointer to the threads queue object - * @param[in] msg the message code - * - * @iclass - */ -void osalThreadDequeueAllI(threads_queue_t *tqp, msg_t msg) { - semaphore_t *sp = &tqp->sem; - thread_t *tp; - cnt_t cnt; - - cnt = sp->cnt; - sp->cnt = (cnt_t)0; - tp = nil.threads; - while (cnt < (cnt_t)0) { - - chDbgAssert(tp < &nil.threads[NIL_CFG_NUM_THREADS], - "pointer out of range"); - - /* Is this thread waiting on this semaphore?*/ - if (tp->u1.semp == sp) { - - chDbgAssert(NIL_THD_IS_WTSEM(tp), "not waiting"); - - cnt++; - (void) chSchReadyI(tp, msg); - } - tp++; - } -} - -/** @} */ diff --git a/os/hal/osal/nil/osal.h b/os/hal/osal/nil/osal.h deleted file mode 100644 index aac0d5e77..000000000 --- a/os/hal/osal/nil/osal.h +++ /dev/null @@ -1,920 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file osal.h - * @brief OSAL module header. - * - * @addtogroup OSAL - * @{ - */ - -#ifndef _OSAL_H_ -#define _OSAL_H_ - -#include -#include -#include - -#include "nil.h" - -#if defined(__SPC5_HAL__) -#include "platform.h" -#endif - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @name Common constants - * @{ - */ -#if !defined(FALSE) || defined(__DOXYGEN__) -#define FALSE 0 -#endif - -#if !defined(TRUE) || defined(__DOXYGEN__) -#define TRUE (!FALSE) -#endif - -#define OSAL_SUCCESS FALSE -#define OSAL_FAILED TRUE -/** @} */ - -#if 0 -/** - * @name Messages - * @{ - */ -#define MSG_OK RDY_OK -#define MSG_RESET RDY_RESET -#define MSG_TIMEOUT RDY_TIMEOUT -/** @} */ -#endif - -#if 0 -/** - * @name Special time constants - * @{ - */ -#define TIME_IMMEDIATE ((systime_t)0) -#define TIME_INFINITE ((systime_t)-1) -/** @} */ -#endif - -/** - * @name Systick modes. - * @{ - */ -#define OSAL_ST_MODE_NONE 0 -#define OSAL_ST_MODE_PERIODIC 1 -#define OSAL_ST_MODE_FREERUNNING 2 -/** @} */ - -/** - * @name Systick parameters. - * @{ - */ -/** - * @brief Size in bits of the @p systick_t type. - */ -#define OSAL_ST_RESOLUTION NIL_CFG_ST_RESOLUTION - -/** - * @brief Required systick frequency or resolution. - */ -#define OSAL_ST_FREQUENCY NIL_CFG_ST_FREQUENCY - -/** - * @brief Systick mode required by the underlying OS. - */ -#if (NIL_CFG_ST_TIMEDELTA == 0) || defined(__DOXYGEN__) -#define OSAL_ST_MODE OSAL_ST_MODE_PERIODIC -#else -#define OSAL_ST_MODE OSAL_ST_MODE_FREERUNNING -#endif -/** @} */ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if NIL_CFG_USE_EVENTS == FALSE -#error "OSAL requires NIL_CFG_USE_EVENTS=TRUE" -#endif - -#if !(OSAL_ST_MODE == OSAL_ST_MODE_NONE) && \ - !(OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) && \ - !(OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) -#error "invalid OSAL_ST_MODE setting in osal.h" -#endif - -#if (OSAL_ST_RESOLUTION != 16) && (OSAL_ST_RESOLUTION != 32) -#error "invalid OSAL_ST_RESOLUTION, must be 16 or 32" -#endif - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -#if 0 -/** - * @brief Type of a system status word. - */ -typedef uint32_t syssts_t; -#endif - -#if 0 -/** - * @brief Type of a message. - */ -typedef int32_t msg_t; -#endif - -#if 0 -/** - * @brief Type of system time counter. - */ -typedef uint32_t systime_t; -#endif - -#if 0 -/** - * @brief Type of realtime counter. - */ -typedef uint32_t rtcnt_t; -#endif - -#if 0 -/** - * @brief Type of a thread reference. - */ -typedef thread_t * thread_reference_t; -#endif - -/** - * @brief Type of an event flags object. - * @note The content of this structure is not part of the API and should - * not be relied upon. Implementers may define this structure in - * an entirely different way. - * @note Retrieval and clearing of the flags are not defined in this - * API and are implementation-dependent. - */ -typedef struct event_source event_source_t; - -/** - * @brief Type of an event source callback. - * @note This type is not part of the OSAL API and is provided - * exclusively as an example and for convenience. - */ -typedef void (*eventcallback_t)(event_source_t *p); - -/** - * @brief Type of an event flags mask. - */ -typedef uint32_t eventflags_t; - -/** - * @brief Events source object. - * @note The content of this structure is not part of the API and should - * not be relied upon. Implementers may define this structure in - * an entirely different way. - * @note Retrieval and clearing of the flags are not defined in this - * API and are implementation-dependent. - */ -struct event_source { - volatile eventflags_t flags; /**< @brief Stored event flags. */ - eventcallback_t cb; /**< @brief Event source callback. */ - void *param; /**< @brief User defined field. */ -}; - -/** - * @brief Type of a mutex. - * @note If the OS does not support mutexes or there is no OS then them - * mechanism can be simulated. - */ -typedef semaphore_t mutex_t; - -/** - * @brief Type of a thread queue. - * @details A thread queue is a queue of sleeping threads, queued threads - * can be dequeued one at time or all together. - * @note In this implementation it is implemented as a single reference - * because there are no real threads. - */ -typedef struct { - semaphore_t sem; -} threads_queue_t; - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @name Debug related macros - * @{ - */ -/** - * @brief Condition assertion. - * @details If the condition check fails then the OSAL panics with a - * message and halts. - * @note The condition is tested only if the @p OSAL_ENABLE_ASSERTIONS - * switch is enabled. - * @note The remark string is not currently used except for putting a - * comment in the code about the assertion. - * - * @param[in] c the condition to be verified to be true - * @param[in] remark a remark string - * - * @api - */ -#define osalDbgAssert(c, remark) chDbgAssert(c, remark) - -/** - * @brief Function parameters check. - * @details If the condition check fails then the OSAL panics and halts. - * @note The condition is tested only if the @p OSAL_ENABLE_CHECKS switch - * is enabled. - * - * @param[in] c the condition to be verified to be true - * - * @api - */ -#define osalDbgCheck(c) chDbgAssert(c, "parameter check") - -/** - * @brief I-Class state check. - * @note Not implemented in this simplified OSAL. - */ -#define osalDbgCheckClassI() /*chDbgCheckClassI()*/ - -/** - * @brief S-Class state check. - * @note Not implemented in this simplified OSAL. - */ -#define osalDbgCheckClassS() /*chDbgCheckClassS()*/ -/** @} */ - -/** - * @name IRQ service routines wrappers - * @{ - */ -/** - * @brief Priority level verification macro. - */ -#define OSAL_IRQ_IS_VALID_PRIORITY(n) CH_IRQ_IS_VALID_KERNEL_PRIORITY(n) - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers. - */ -#define OSAL_IRQ_PROLOGUE() CH_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers. - */ -#define OSAL_IRQ_EPILOGUE() CH_IRQ_EPILOGUE() - -/** - * @brief IRQ handler function declaration. - * @details This macro hides the details of an ISR function declaration. - * - * @param[in] id a vector name as defined in @p vectors.s - */ -#define OSAL_IRQ_HANDLER(id) CH_IRQ_HANDLER(id) -/** @} */ - -/** - * @name Time conversion utilities - * @{ - */ -/** - * @brief Seconds to system ticks. - * @details Converts from seconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * - * @param[in] sec number of seconds - * @return The number of ticks. - * - * @api - */ -#define OSAL_S2ST(sec) S2ST(sec) - -/** - * @brief Milliseconds to system ticks. - * @details Converts from milliseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * - * @param[in] msec number of milliseconds - * @return The number of ticks. - * - * @api - */ -#define OSAL_MS2ST(msec) MS2ST(msec) - -/** - * @brief Microseconds to system ticks. - * @details Converts from microseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * - * @param[in] usec number of microseconds - * @return The number of ticks. - * - * @api - */ -#define OSAL_US2ST(usec) US2ST(usec) -/** @} */ - -/** - * @name Time conversion utilities for the realtime counter - * @{ - */ -/** - * @brief Seconds to realtime counter. - * @details Converts from seconds to realtime counter cycles. - * @note The macro assumes that @p freq >= @p 1. - * - * @param[in] freq clock frequency, in Hz, of the realtime counter - * @param[in] sec number of seconds - * @return The number of cycles. - * - * @api - */ -#define OSAL_S2RTC(freq, sec) S2RTC(freq, sec) - -/** - * @brief Milliseconds to realtime counter. - * @details Converts from milliseconds to realtime counter cycles. - * @note The result is rounded upward to the next millisecond boundary. - * @note The macro assumes that @p freq >= @p 1000. - * - * @param[in] freq clock frequency, in Hz, of the realtime counter - * @param[in] msec number of milliseconds - * @return The number of cycles. - * - * @api - */ -#define OSAL_MS2RTC(freq, msec) MS2RTC(freq, msec) - -/** - * @brief Microseconds to realtime counter. - * @details Converts from microseconds to realtime counter cycles. - * @note The result is rounded upward to the next microsecond boundary. - * @note The macro assumes that @p freq >= @p 1000000. - * - * @param[in] freq clock frequency, in Hz, of the realtime counter - * @param[in] usec number of microseconds - * @return The number of cycles. - * - * @api - */ -#define OSAL_US2RTC(freq, usec) US2RTC(freq, usec) -/** @} */ - -/** - * @name Sleep macros using absolute time - * @{ - */ -/** - * @brief Delays the invoking thread for the specified number of seconds. - * @note The specified time is rounded up to a value allowed by the real - * system tick clock. - * @note The maximum specifiable value is implementation dependent. - * - * @param[in] sec time in seconds, must be different from zero - * - * @api - */ -#define osalThreadSleepSeconds(sec) osalThreadSleep(OSAL_S2ST(sec)) - -/** - * @brief Delays the invoking thread for the specified number of - * milliseconds. - * @note The specified time is rounded up to a value allowed by the real - * system tick clock. - * @note The maximum specifiable value is implementation dependent. - * - * @param[in] msec time in milliseconds, must be different from zero - * - * @api - */ -#define osalThreadSleepMilliseconds(msec) osalThreadSleep(OSAL_MS2ST(msec)) - -/** - * @brief Delays the invoking thread for the specified number of - * microseconds. - * @note The specified time is rounded up to a value allowed by the real - * system tick clock. - * @note The maximum specifiable value is implementation dependent. - * - * @param[in] usec time in microseconds, must be different from zero - * - * @api - */ -#define osalThreadSleepMicroseconds(usec) osalThreadSleep(OSAL_US2ST(usec)) -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void osalThreadDequeueNextI(threads_queue_t *tqp, msg_t msg); - void osalThreadDequeueAllI(threads_queue_t *tqp, msg_t msg); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief OSAL module initialization. - * - * @api - */ -static inline void osalInit(void) { - -} - -/** - * @brief System halt with error message. - * - * @param[in] reason the halt message pointer - * - * @api - */ -static inline void osalSysHalt(const char *reason) { - - chSysHalt(reason); -} - -/** - * @brief Disables interrupts globally. - * - * @special - */ -static inline void osalSysDisable(void) { - - chSysDisable(); -} - -/** - * @brief Enables interrupts globally. - * - * @special - */ -static inline void osalSysEnable(void) { - - chSysEnable(); -} - -/** - * @brief Enters a critical zone from thread context. - * @note This function cannot be used for reentrant critical zones. - * - * @special - */ -static inline void osalSysLock(void) { - - chSysLock(); -} - -/** - * @brief Leaves a critical zone from thread context. - * @note This function cannot be used for reentrant critical zones. - * - * @special - */ -static inline void osalSysUnlock(void) { - - chSysUnlock(); -} - -/** - * @brief Enters a critical zone from ISR context. - * @note This function cannot be used for reentrant critical zones. - * - * @special - */ -static inline void osalSysLockFromISR(void) { - - chSysLockFromISR(); -} - -/** - * @brief Leaves a critical zone from ISR context. - * @note This function cannot be used for reentrant critical zones. - * - * @special - */ -static inline void osalSysUnlockFromISR(void) { - - chSysUnlockFromISR(); -} - -/** - * @brief Returns the execution status and enters a critical zone. - * @details This functions enters into a critical zone and can be called - * from any context. Because its flexibility it is less efficient - * than @p chSysLock() which is preferable when the calling context - * is known. - * @post The system is in a critical zone. - * - * @return The previous system status, the encoding of this - * status word is architecture-dependent and opaque. - * - * @xclass - */ -static inline syssts_t osalSysGetStatusAndLockX(void) { - - return chSysGetStatusAndLockX(); -} - -/** - * @brief Restores the specified execution status and leaves a critical zone. - * @note A call to @p chSchRescheduleS() is automatically performed - * if exiting the critical zone and if not in ISR context. - * - * @param[in] sts the system status to be restored. - * - * @xclass - */ -static inline void osalSysRestoreStatusX(syssts_t sts) { - - chSysRestoreStatusX(sts); -} - -/** - * @brief Polled delay. - * @note The real delay is always few cycles in excess of the specified - * value. - * - * @param[in] cycles number of cycles - * - * @xclass - */ -#if (PORT_SUPPORTS_RT == TRUE) || defined(__DOXYGEN__) -static inline void osalSysPolledDelayX(rtcnt_t cycles) { - - chSysPolledDelayX(cycles); -} -#endif - -/** - * @brief Systick callback for the underlying OS. - * @note This callback is only defined if the OSAL requires such a - * service from the HAL. - */ -#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__) -static inline void osalOsTimerHandlerI(void) { - - chSysTimerHandlerI(); -} -#endif - -/** - * @brief Checks if a reschedule is required and performs it. - * @note I-Class functions invoked from thread context must not reschedule - * by themselves, an explicit reschedule using this function is - * required in this scenario. - * @note Not implemented in this simplified OSAL. - * - * @sclass - */ -static inline void osalOsRescheduleS(void) { - - chSchRescheduleS(); -} - -/** - * @brief Current system time. - * @details Returns the number of system ticks since the @p osalInit() - * invocation. - * @note The counter can reach its maximum and then restart from zero. - * @note This function can be called from any context but its atomicity - * is not guaranteed on architectures whose word size is less than - * @p systime_t size. - * - * @return The system time in ticks. - * - * @xclass - */ -static inline systime_t osalOsGetSystemTimeX(void) { - - return chVTGetSystemTimeX(); -} - -/** - * @brief Checks if the specified time is within the specified time window. - * @note When start==end then the function returns always true because the - * whole time range is specified. - * @note This function can be called from any context. - * - * @param[in] time the time to be verified - * @param[in] start the start of the time window (inclusive) - * @param[in] end the end of the time window (non inclusive) - * @retval true current time within the specified time window. - * @retval false current time not within the specified time window. - * - * @xclass - */ -static inline bool osalOsIsTimeWithinX(systime_t time, - systime_t start, - systime_t end) { - - return chVTIsTimeWithinX(time, start, end); -} - -/** - * @brief Suspends the invoking thread for the specified time. - * - * @param[in] time the delay in system ticks, the special values are - * handled as follow: - * - @a TIME_INFINITE is allowed but interpreted as a - * normal time specification. - * - @a TIME_IMMEDIATE this value is not allowed. - * . - * - * @sclass - */ -static inline void osalThreadSleepS(systime_t time) { - - chThdSleepS(time); -} - -/** - * @brief Suspends the invoking thread for the specified time. - * - * @param[in] time the delay in system ticks, the special values are - * handled as follow: - * - @a TIME_INFINITE is allowed but interpreted as a - * normal time specification. - * - @a TIME_IMMEDIATE this value is not allowed. - * . - * - * @api - */ -static inline void osalThreadSleep(systime_t time) { - - chThdSleep(time); -} - -/** - * @brief Sends the current thread sleeping and sets a reference variable. - * @note This function must reschedule, it can only be called from thread - * context. - * - * @param[in] trp a pointer to a thread reference object - * @return The wake up message. - * - * @sclass - */ -static inline msg_t osalThreadSuspendS(thread_reference_t *trp) { - - return chThdSuspendTimeoutS(trp, TIME_INFINITE); -} - -/** - * @brief Sends the current thread sleeping and sets a reference variable. - * @note This function must reschedule, it can only be called from thread - * context. - * - * @param[in] trp a pointer to a thread reference object - * @param[in] timeout the timeout in system ticks, the special values are - * handled as follow: - * - @a TIME_INFINITE the thread enters an infinite sleep - * state. - * - @a TIME_IMMEDIATE the thread is not enqueued and - * the function returns @p MSG_TIMEOUT as if a timeout - * occurred. - * . - * @return The wake up message. - * @retval MSG_TIMEOUT if the operation timed out. - * - * @sclass - */ -static inline msg_t osalThreadSuspendTimeoutS(thread_reference_t *trp, - systime_t timeout) { - - return chThdSuspendTimeoutS(trp, timeout); -} - -/** - * @brief Wakes up a thread waiting on a thread reference object. - * @note This function must not reschedule because it can be called from - * ISR context. - * - * @param[in] trp a pointer to a thread reference object - * @param[in] msg the message code - * - * @iclass - */ -static inline void osalThreadResumeI(thread_reference_t *trp, msg_t msg) { - - chThdResumeI(trp, msg); -} - -/** - * @brief Wakes up a thread waiting on a thread reference object. - * @note This function must reschedule, it can only be called from thread - * context. - * - * @param[in] trp a pointer to a thread reference object - * @param[in] msg the message code - * - * @iclass - */ -static inline void osalThreadResumeS(thread_reference_t *trp, msg_t msg) { - - chThdResumeI(trp, msg); - chSchRescheduleS(); -} - -/** - * @brief Initializes a threads queue object. - * - * @param[out] tqp pointer to the threads queue object - * - * @init - */ -static inline void osalThreadQueueObjectInit(threads_queue_t *tqp) { - - chSemObjectInit(&tqp->sem, (cnt_t)0); -} - -/** - * @brief Enqueues the caller thread. - * @details The caller thread is enqueued and put to sleep until it is - * dequeued or the specified timeouts expires. - * - * @param[in] tqp pointer to the threads queue object - * @param[in] time the timeout in system ticks, the special values are - * handled as follow: - * - @a TIME_INFINITE the thread enters an infinite sleep - * state. - * - @a TIME_IMMEDIATE the thread is not enqueued and - * the function returns @p MSG_TIMEOUT as if a timeout - * occurred. - * . - * @return The message from @p osalQueueWakeupOneI() or - * @p osalQueueWakeupAllI() functions. - * @retval MSG_TIMEOUT if the thread has not been dequeued within the - * specified timeout or if the function has been - * invoked with @p TIME_IMMEDIATE as timeout - * specification. - * - * @sclass - */ -static inline msg_t osalThreadEnqueueTimeoutS(threads_queue_t *tqp, - systime_t time) { - - return chSemWaitTimeoutS(&tqp->sem, time); -} - -/** - * @brief Initializes an event flags object. - * - * @param[out] esp pointer to the event flags object - * - * @init - */ -static inline void osalEventObjectInit(event_source_t *esp) { - - osalDbgCheck(esp != NULL); - - esp->flags = 0; - esp->cb = NULL; - esp->param = NULL; -} - -/** - * @brief Add flags to an event source object. - * - * @param[in] esp pointer to the event flags object - * @param[in] flags flags to be ORed to the flags mask - * - * @iclass - */ -static inline void osalEventBroadcastFlagsI(event_source_t *esp, - eventflags_t flags) { - - osalDbgCheck(esp != NULL); - - esp->flags |= flags; - if (esp->cb != NULL) { - esp->cb(esp); - } -} - -/** - * @brief Add flags to an event source object. - * - * @param[in] esp pointer to the event flags object - * @param[in] flags flags to be ORed to the flags mask - * - * @iclass - */ -static inline void osalEventBroadcastFlags(event_source_t *esp, - eventflags_t flags) { - - osalDbgCheck(esp != NULL); - - chSysLock(); - osalEventBroadcastFlagsI(esp, flags); - chSchRescheduleS(); - chSysUnlock(); -} - -/** - * @brief Event callback setup. - * @note The callback is invoked from ISR context and can - * only invoke I-Class functions. The callback is meant - * to wakeup the task that will handle the event by - * calling @p osalEventGetAndClearFlagsI(). - * - * @param[in] esp pointer to the event flags object - * @param[in] cb pointer to the callback function - * @param[in] param parameter to be passed to the callback function - * - * @api - */ -static inline void osalEventSetCallback(event_source_t *esp, - eventcallback_t cb, - void *param) { - - osalDbgCheck(esp != NULL); - - esp->cb = cb; - esp->param = param; -} - -/** - * @brief Initializes s @p mutex_t object. - * - * @param[out] mp pointer to the @p mutex_t object - * - * @init - */ -static inline void osalMutexObjectInit(mutex_t *mp) { - - chSemObjectInit((semaphore_t *)mp, (cnt_t)1); -} - -/** - * @brief Locks the specified mutex. - * @post The mutex is locked and inserted in the per-thread stack of owned - * mutexes. - * - * @param[in,out] mp pointer to the @p mutex_t object - * - * @api - */ -static inline void osalMutexLock(mutex_t *mp) { - - (void) chSemWait((semaphore_t *)mp); -} - -/** - * @brief Unlocks the specified mutex. - * @note The HAL guarantees to release mutex in reverse lock order. The - * mutex being unlocked is guaranteed to be the last locked mutex - * by the invoking thread. - * The implementation can rely on this behavior and eventually - * ignore the @p mp parameter which is supplied in order to support - * those OSes not supporting a stack of the owned mutexes. - * - * @param[in,out] mp pointer to the @p mutex_t object - * - * @api - */ -static inline void osalMutexUnlock(mutex_t *mp) { - - chSemSignal((semaphore_t *)mp); -} - -#endif /* _OSAL_H_ */ - -/** @} */ diff --git a/os/hal/osal/nil/osal.mk b/os/hal/osal/nil/osal.mk deleted file mode 100644 index b4872a691..000000000 --- a/os/hal/osal/nil/osal.mk +++ /dev/null @@ -1,5 +0,0 @@ -# OSAL files. -OSALSRC += ${CHIBIOS}/os/hal/osal/nil/osal.c - -# Required include directories -OSALINC += ${CHIBIOS}/os/hal/osal/nil diff --git a/os/nil/dox/nil.dox b/os/nil/dox/nil.dox deleted file mode 100644 index c4953e001..000000000 --- a/os/nil/dox/nil.dox +++ /dev/null @@ -1,50 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup NIL NIL Kernel - * @details The kernel is the portable part of ChibiOS/NIL, this section - * documents the various kernel subsystems. - */ - -/** - * @defgroup NIL_CONFIG Configuration - * @ingroup NIL - */ - -/** - * @defgroup NIL_TYPES Kernel Types - * @ingroup NIL - */ - -/** - * @defgroup NIL_KERNEL API - * @ingroup NIL - */ - -/** - * @defgroup NIL_CORE Port Layer - * @ingroup NIL - */ - -/** - * @defgroup NIL_TIMER Timer Interface - * @ingroup NIL - */ - diff --git a/os/nil/include/nil.h b/os/nil/include/nil.h deleted file mode 100644 index 1170c7286..000000000 --- a/os/nil/include/nil.h +++ /dev/null @@ -1,1003 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file nil.h - * @brief Nil RTOS main header file. - * @details This header includes all the required kernel headers so it is the - * only header you usually need to include in your application. - * - * @addtogroup NIL_KERNEL - * @{ - */ - -#ifndef _NIL_H_ -#define _NIL_H_ - -/** - * @brief Type of a structure representing a thread. - * @note It is required as an early definition. - */ -typedef struct nil_thread thread_t; - -#include "nilconf.h" -#include "niltypes.h" -#include "nilcore.h" - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @brief ChibiOS/NIL identification macro. - */ -#define _CHIBIOS_NIL_ - -/** - * @brief Stable release flag. - */ -#define CH_KERNEL_STABLE 1 - -/** - * @name ChibiOS/NIL version identification - * @{ - */ -/** - * @brief Kernel version string. - */ -#define CH_KERNEL_VERSION "1.1.3" - -/** - * @brief Kernel version major number. - */ -#define CH_KERNEL_MAJOR 1 - -/** - * @brief Kernel version minor number. - */ -#define CH_KERNEL_MINOR 1 - -/** - * @brief Kernel version patch number. - */ -#define CH_KERNEL_PATCH 3 -/** @} */ - -/** - * @name Wakeup messages - * @{ - */ -#define MSG_OK (msg_t)0 /**< @brief OK wakeup message. */ -#define MSG_TIMEOUT (msg_t)-1 /**< @brief Wake-up caused by - a timeout condition. */ -#define MSG_RESET (msg_t)-2 /**< @brief Wake-up caused by - a reset condition. */ -/** @} */ - -/** - * @name Special time constants - * @{ - */ -/** - * @brief Zero time specification for some functions with a timeout - * specification. - * @note Not all functions accept @p TIME_IMMEDIATE as timeout parameter, - * see the specific function documentation. - */ -#define TIME_IMMEDIATE ((systime_t)-1) - -/** - * @brief Infinite time specification for all functions with a timeout - * specification. - */ -#define TIME_INFINITE ((systime_t)0) -/** @} */ - -/** - * @name Thread state related macros - * @{ - */ -#define NIL_STATE_READY (tstate_t)0 /**< @brief Thread ready or - executing. */ -#define NIL_STATE_SLEEPING (tstate_t)1 /**< @brief Thread sleeping. */ -#define NIL_STATE_SUSP (tstate_t)2 /**< @brief Thread suspended. */ -#define NIL_STATE_WTSEM (tstate_t)3 /**< @brief On semaphore. */ -#define NIL_STATE_WTOREVT (tstate_t)4 /**< @brief Waiting for events. */ -#define NIL_THD_IS_READY(tr) ((tr)->state == NIL_STATE_READY) -#define NIL_THD_IS_SLEEPING(tr) ((tr)->state == NIL_STATE_SLEEPING) -#define NIL_THD_IS_SUSP(tr) ((tr)->state == NIL_STATE_SUSP) -#define NIL_THD_IS_WTSEM(tr) ((tr)->state == NIL_STATE_WTSEM) -#define NIL_THD_IS_WTOREVT(tr) ((tr)->state == NIL_STATE_WTOREVT) -/** @} */ - -/** - * @name Events related macros - * @{ - */ -/** - * @brief All events allowed mask. - */ -#define ALL_EVENTS ((eventmask_t)-1) - -/** - * @brief Returns an event mask from an event identifier. - */ -#define EVENT_MASK(eid) ((eventmask_t)(1 << (eid))) -/** @} */ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Number of user threads in the application. - * @note This number is not inclusive of the idle thread which is - * implicitly handled. - */ -#if !defined(NIL_CFG_NUM_THREADS) || defined(__DOXYGEN__) -#define NIL_CFG_NUM_THREADS 2 -#endif - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(NIL_CFG_ST_RESOLUTION) || defined(__DOXYGEN__) -#define NIL_CFG_ST_RESOLUTION 32 -#endif - -/** - * @brief System tick frequency. - * @note This value together with the @p NIL_CFG_ST_RESOLUTION - * option defines the maximum amount of time allowed for - * timeouts. - */ -#if !defined(NIL_CFG_ST_FREQUENCY) || defined(__DOXYGEN__) -#define NIL_CFG_ST_FREQUENCY 100 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(NIL_CFG_ST_TIMEDELTA) || defined(__DOXYGEN__) -#define NIL_CFG_ST_TIMEDELTA 0 -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(NIL_CFG_USE_EVENTS) || defined(__DOXYGEN__) -#define NIL_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief System assertions. - */ -#if !defined(NIL_CFG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define NIL_CFG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Stack check. - */ -#if !defined(NIL_CFG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define NIL_CFG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief System initialization hook. - */ -#if !defined(NIL_CFG_SYSTEM_INIT_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_SYSTEM_INIT_HOOK() {} -#endif - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#if !defined(NIL_CFG_THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define NIL_CFG_THREAD_EXT_FIELDS -#endif - -/** - * @brief Threads initialization hook. - */ -#if !defined(NIL_CFG_THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_THREAD_EXT_INIT_HOOK(tr) {} -#endif - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#if !defined(NIL_CFG_IDLE_ENTER_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_IDLE_ENTER_HOOK() {} -#endif - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#if !defined(NIL_CFG_IDLE_LEAVE_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_IDLE_LEAVE_HOOK() {} -#endif - -/** - * @brief System halt hook. - */ -#if !defined(NIL_CFG_SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_SYSTEM_HALT_HOOK(reason) {} -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if NIL_CFG_NUM_THREADS < 1 -#error "at least one thread must be defined" -#endif - -#if NIL_CFG_NUM_THREADS > 12 -#error "Nil is not recommended for thread-intensive applications, consider" \ - "ChibiOS/RT instead" -#endif - -#if (NIL_CFG_ST_RESOLUTION != 16) && (NIL_CFG_ST_RESOLUTION != 32) -#error "invalid NIL_CFG_ST_RESOLUTION specified, must be 16 or 32" -#endif - -#if NIL_CFG_ST_FREQUENCY <= 0 -#error "invalid NIL_CFG_ST_FREQUENCY specified, must be greated than zero" -#endif - -#if (NIL_CFG_ST_TIMEDELTA < 0) || (NIL_CFG_ST_TIMEDELTA == 1) -#error "invalid NIL_CFG_ST_TIMEDELTA specified, must " \ - "be zero or greater than one" -#endif - -#if (NIL_CFG_ENABLE_ASSERTS == TRUE) || (NIL_CFG_ENABLE_STACK_CHECK == TRUE) -#define NIL_DBG_ENABLED TRUE -#else -#define NIL_DBG_ENABLED FALSE -#endif - -/** Boundaries of the idle thread boundaries, only required if stack checking - is enabled.*/ -#if (NIL_CFG_ENABLE_STACK_CHECK == TRUE) || defined(__DOXYGEN__) -extern stkalign_t __main_thread_stack_base__, __main_thread_stack_end__; - -#define THD_IDLE_BASE (&__main_thread_stack_base__) -#define THD_IDLE_END (&__main_thread_stack_end__) -#else -#define THD_IDLE_BASE NULL -#define THD_IDLE_END NULL -#endif - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of internal context structure. - */ -typedef struct port_intctx intctx_t; - -/** - * @brief Type of a structure representing a semaphore. - */ -typedef struct nil_semaphore semaphore_t; - -/** - * @brief Structure representing a counting semaphore. - */ -struct nil_semaphore { - volatile cnt_t cnt; /**< @brief Semaphore counter. */ -}; - -/** - * @brief Thread function. - */ -typedef void (*tfunc_t)(void *p); - -/** - * @brief Type of a structure representing a thread static configuration. - */ -typedef struct nil_thread_cfg thread_config_t; - -/** - * @brief Structure representing a thread static configuration. - */ -struct nil_thread_cfg { - stkalign_t *wbase; /**< @brief Thread working area base. */ - stkalign_t *wend; /**< @brief Thread working area end. */ - const char *namep; /**< @brief Thread name, for debugging. */ - tfunc_t funcp; /**< @brief Thread function. */ - void *arg; /**< @brief Thread function argument. */ -}; - -/** - * @brief Type of a thread reference. - */ -typedef thread_t * thread_reference_t; - -/** - * @brief Structure representing a thread. - */ -struct nil_thread { - intctx_t *ctxp; /**< @brief Pointer to internal context. */ - tstate_t state; /**< @brief Thread state. */ - /* Note, the following union contains a pointer while the thread is in a - sleeping state (!NIL_THD_IS_READY()) else contains the wake-up message.*/ - union { - msg_t msg; /**< @brief Wake-up message. */ - void *p; /**< @brief Generic pointer. */ - thread_reference_t *trp; /**< @brief Pointer to thread reference. */ - semaphore_t *semp; /**< @brief Pointer to semaphore. */ -#if (NIL_CFG_USE_EVENTS == TRUE) || defined(__DOXYGEN__) - eventmask_t ewmask; /**< @brief Enabled events mask. */ -#endif - } u1; - volatile systime_t timeout;/**< @brief Timeout counter, zero - if disabled. */ -#if (NIL_CFG_USE_EVENTS == TRUE) || defined(__DOXYGEN__) - eventmask_t epmask; /**< @brief Pending events mask. */ -#endif -#if (NIL_CFG_ENABLE_STACK_CHECK == TRUE) || defined(__DOXYGEN__) - stkalign_t *stklim;/**< @brief Thread stack boundary. */ -#endif - /* Optional extra fields.*/ - NIL_CFG_THREAD_EXT_FIELDS -}; - -/** - * @brief Type of a structure representing the system. - */ -typedef struct nil_system nil_system_t; - -/** - * @brief System data structure. - * @note This structure contain all the data areas used by the OS except - * stacks. - */ -struct nil_system { - /** - * @brief Pointer to the running thread. - */ - thread_t *current; - /** - * @brief Pointer to the next thread to be executed. - * @note This pointer must point at the same thread pointed by @p current - * or to an higher priority thread if a switch is required. - */ - thread_t *next; -#if (NIL_CFG_ST_TIMEDELTA == 0) || defined(__DOXYGEN__) - /** - * @brief System time. - */ - volatile systime_t systime; -#endif -#if (NIL_CFG_ST_TIMEDELTA > 0) || defined(__DOXYGEN__) - /** - * @brief System time of the last tick event. - */ - systime_t lasttime; - /** - * @brief Time of the next scheduled tick event. - */ - systime_t nexttime; -#endif - /** - * @brief Thread structures for all the defined threads. - */ - thread_t threads[NIL_CFG_NUM_THREADS + 1]; -#if (NIL_DBG_ENABLED == TRUE) || defined(__DOXYGEN__) - /** - * @brief Panic message. - * @note This field is only present if some debug options have been - * activated. - * @note Accesses to this pointer must never be optimized out so the - * field itself is declared volatile. - */ - const char * volatile dbg_panic_msg; -#endif -}; - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @name Threads tables definition macros - * @{ - */ -/** - * @brief Start of user threads table. - */ -#define THD_TABLE_BEGIN \ - const thread_config_t nil_thd_configs[NIL_CFG_NUM_THREADS + 1] = { - -/** - * @brief Entry of user threads table - */ -#define THD_TABLE_ENTRY(wap, name, funcp, arg) \ - {wap, ((stkalign_t *)(wap)) + (sizeof (wap) / sizeof(stkalign_t)), \ - name, funcp, arg}, - -/** - * @brief End of user threads table. - */ -#define THD_TABLE_END \ - {THD_IDLE_BASE, THD_IDLE_END, "idle", NULL, NULL} \ -}; -/** @} */ - -/** - * @name Working Areas and Alignment - */ -/** - * @brief Enforces a correct alignment for a stack area size value. - * - * @param[in] n the stack size to be aligned to the next stack - * alignment boundary - * @return The aligned stack size. - * - * @api - */ -#define THD_ALIGN_STACK_SIZE(n) \ - ((((n) - 1U) | (sizeof(stkalign_t) - 1U)) + 1U) - -/** - * @brief Calculates the total Working Area size. - * - * @param[in] n the stack size to be assigned to the thread - * @return The total used memory in bytes. - * - * @api - */ -#define THD_WORKING_AREA_SIZE(n) \ - THD_ALIGN_STACK_SIZE(PORT_WA_SIZE(n)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - * - * @param[in] s the name to be assigned to the stack array - * @param[in] n the stack size to be assigned to the thread - * - * @api - */ -#define THD_WORKING_AREA(s, n) \ - stkalign_t s[THD_WORKING_AREA_SIZE(n) / sizeof(stkalign_t)] -/** @} */ - -/** - * @name Threads abstraction macros - */ -/** - * @brief Thread declaration macro. - * @note Thread declarations should be performed using this macro because - * the port layer could define optimizations for thread functions. - */ -#define THD_FUNCTION(tname, arg) PORT_THD_FUNCTION(tname, arg) -/** @} */ - -/** - * @name ISRs abstraction macros - */ -/** - * @brief Priority level validation macro. - * @details This macro determines if the passed value is a valid priority - * level for the underlying architecture. - * - * @param[in] prio the priority level - * @return Priority range result. - * @retval false if the priority is invalid or if the architecture - * does not support priorities. - * @retval true if the priority is valid. - */ -#if defined(PORT_IRQ_IS_VALID_PRIORITY) || defined(__DOXYGEN__) -#define CH_IRQ_IS_VALID_PRIORITY(prio) \ - PORT_IRQ_IS_VALID_PRIORITY(prio) -#else -#define CH_IRQ_IS_VALID_PRIORITY(prio) false -#endif - -/** - * @brief Priority level validation macro. - * @details This macro determines if the passed value is a valid priority - * level that cannot preempt the kernel critical zone. - * - * @param[in] prio the priority level - * @return Priority range result. - * @retval false if the priority is invalid or if the architecture - * does not support priorities. - * @retval true if the priority is valid. - */ -#if defined(PORT_IRQ_IS_VALID_KERNEL_PRIORITY) || defined(__DOXYGEN__) -#define CH_IRQ_IS_VALID_KERNEL_PRIORITY(prio) \ - PORT_IRQ_IS_VALID_KERNEL_PRIORITY(prio) -#else -#define CH_IRQ_IS_VALID_KERNEL_PRIORITY(prio) false -#endif - -/** - * @brief IRQ handler enter code. - * @note Usually IRQ handlers functions are also declared naked. - * @note On some architectures this macro can be empty. - * - * @special - */ -#define CH_IRQ_PROLOGUE() PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ handler exit code. - * @note Usually IRQ handlers function are also declared naked. - * - * @special - */ -#define CH_IRQ_EPILOGUE() PORT_IRQ_EPILOGUE() - -/** - * @brief Standard normal IRQ handler declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - * - * @special - */ -#define CH_IRQ_HANDLER(id) PORT_IRQ_HANDLER(id) -/** @} */ - -/** - * @name Fast ISRs abstraction macros - */ -/** - * @brief Standard fast IRQ handler declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - * @note Not all architectures support fast interrupts. - * - * @special - */ -#define CH_FAST_IRQ_HANDLER(id) PORT_FAST_IRQ_HANDLER(id) -/** @} */ - -/** - * @name Time conversion utilities - * @{ - */ -/** - * @brief Seconds to system ticks. - * @details Converts from seconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * - * @param[in] sec number of seconds - * @return The number of ticks. - * - * @api - */ -#define S2ST(sec) \ - ((systime_t)((uint32_t)(sec) * (uint32_t)NIL_CFG_ST_FREQUENCY)) - -/** - * @brief Milliseconds to system ticks. - * @details Converts from milliseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * - * @param[in] msec number of milliseconds - * @return The number of ticks. - * - * @api - */ -#define MS2ST(msec) \ - ((systime_t)(((((uint32_t)(msec)) * \ - ((uint32_t)NIL_CFG_ST_FREQUENCY)) + 999UL) / 1000UL)) - -/** - * @brief Microseconds to system ticks. - * @details Converts from microseconds to system ticks number. - * @note The result is rounded upward to the next tick boundary. - * - * @param[in] usec number of microseconds - * @return The number of ticks. - * - * @api - */ -#define US2ST(usec) \ - ((systime_t)(((((uint32_t)(usec)) * \ - ((uint32_t)NIL_CFG_ST_FREQUENCY)) + 999999UL) / 1000000UL)) -/** @} */ - -/** - * @name Time conversion utilities for the realtime counter - * @{ - */ -/** - * @brief Seconds to realtime counter. - * @details Converts from seconds to realtime counter cycles. - * @note The macro assumes that @p freq >= @p 1. - * - * @param[in] freq clock frequency, in Hz, of the realtime counter - * @param[in] sec number of seconds - * @return The number of cycles. - * - * @api - */ -#define S2RTC(freq, sec) ((freq) * (sec)) - -/** - * @brief Milliseconds to realtime counter. - * @details Converts from milliseconds to realtime counter cycles. - * @note The result is rounded upward to the next millisecond boundary. - * @note The macro assumes that @p freq >= @p 1000. - * - * @param[in] freq clock frequency, in Hz, of the realtime counter - * @param[in] msec number of milliseconds - * @return The number of cycles. - * - * @api - */ -#define MS2RTC(freq, msec) (rtcnt_t)((((freq) + 999UL) / 1000UL) * (msec)) - -/** - * @brief Microseconds to realtime counter. - * @details Converts from microseconds to realtime counter cycles. - * @note The result is rounded upward to the next microsecond boundary. - * @note The macro assumes that @p freq >= @p 1000000. - * - * @param[in] freq clock frequency, in Hz, of the realtime counter - * @param[in] usec number of microseconds - * @return The number of cycles. - * - * @api - */ -#define US2RTC(freq, usec) (rtcnt_t)((((freq) + 999999UL) / 1000000UL) * (usec)) -/** @} */ - -/** - * @name Macro Functions - * @{ - */ -/** - * @brief Returns the current value of the system real time counter. - * @note This function is only available if the port layer supports the - * option @p PORT_SUPPORTS_RT. - * - * @return The value of the system realtime counter of - * type rtcnt_t. - * - * @xclass - */ -#if (PORT_SUPPORTS_RT == TRUE) || defined(__DOXYGEN__) -#define chSysGetRealtimeCounterX() (rtcnt_t)port_rt_get_counter_value() -#endif - -/** - * @brief Enters the kernel lock mode. - * - * @special - */ -#define chSysDisable() port_disable() - -/** - * @brief Enters the kernel lock mode. - * - * @special - */ -#define chSysEnable() port_enable() - -/** - * @brief Enters the kernel lock state. - * - * @special - */ -#define chSysLock() port_lock() - -/** - * @brief Leaves the kernel lock state. - * - * @special - */ -#define chSysUnlock() port_unlock() - -/** - * @brief Enters the kernel lock state from within an interrupt handler. - * @note This API may do nothing on some architectures, it is required - * because on ports that support preemptable interrupt handlers - * it is required to raise the interrupt mask to the same level of - * the system mutual exclusion zone.
- * It is good practice to invoke this API before invoking any I-class - * syscall from an interrupt handler. - * @note This API must be invoked exclusively from interrupt handlers. - * - * @special - */ -#define chSysLockFromISR() port_lock_from_isr() - -/** - * @brief Leaves the kernel lock state from within an interrupt handler. - * - * @note This API may do nothing on some architectures, it is required - * because on ports that support preemptable interrupt handlers - * it is required to raise the interrupt mask to the same level of - * the system mutual exclusion zone.
- * It is good practice to invoke this API after invoking any I-class - * syscall from an interrupt handler. - * @note This API must be invoked exclusively from interrupt handlers. - * - * @special - */ -#define chSysUnlockFromISR() port_unlock_from_isr() - -/** - * @brief Evaluates if a reschedule is required. - * - * @retval true if there is a thread that must go in running state - * immediately. - * @retval false if preemption is not required. - * - * @iclass - */ -#define chSchIsRescRequiredI() ((bool)(nil.current != nil.next)) - -/** - * @brief Returns a pointer to the current @p thread_t. - * - * @xclass - */ -#define chThdGetSelfX() nil.current - -/** - * @brief Delays the invoking thread for the specified number of seconds. - * @note The specified time is rounded up to a value allowed by the real - * system clock. - * @note The maximum specified value is implementation dependent. - * - * @param[in] sec time in seconds, must be different from zero - * - * @api - */ -#define chThdSleepSeconds(sec) chThdSleep(S2ST(sec)) - -/** - * @brief Delays the invoking thread for the specified number of - * milliseconds. - * @note The specified time is rounded up to a value allowed by the real - * system clock. - * @note The maximum specified value is implementation dependent. - * - * @param[in] msec time in milliseconds, must be different from zero - * - * @api - */ -#define chThdSleepMilliseconds(msec) chThdSleep(MS2ST(msec)) - -/** - * @brief Delays the invoking thread for the specified number of - * microseconds. - * @note The specified time is rounded up to a value allowed by the real - * system clock. - * @note The maximum specified value is implementation dependent. - * - * @param[in] usec time in microseconds, must be different from zero - * - * @api - */ -#define chThdSleepMicroseconds(usec) chThdSleep(US2ST(usec)) - -/** - * @brief Suspends the invoking thread for the specified time. - * - * @param[in] timeout the delay in system ticks - * - * @sclass - */ -#define chThdSleepS(timeout) (void) chSchGoSleepTimeoutS(NIL_STATE_SLEEPING, timeout) - -/** - * @brief Suspends the invoking thread until the system time arrives to the - * specified value. - * - * @param[in] abstime absolute system time - * - * @sclass - */ -#define chThdSleepUntilS(abstime) \ - (void) chSchGoSleepTimeoutS(NIL_STATE_SLEEPING, (abstime) - \ - chVTGetSystemTimeX()) - -/** - * @brief Initializes a semaphore with the specified counter value. - * - * @param[out] sp pointer to a @p semaphore_t structure - * @param[in] n initial value of the semaphore counter. Must be - * non-negative. - * - * @init - */ -#define chSemObjectInit(sp, n) ((sp)->cnt = n) - -/** - * @brief Performs a wait operation on a semaphore. - * - * @param[in] sp pointer to a @p semaphore_t structure - * @return A message specifying how the invoking thread has been - * released from the semaphore. - * @retval CH_MSG_OK if the thread has not stopped on the semaphore or the - * semaphore has been signaled. - * @retval CH_MSG_RST if the semaphore has been reset using @p chSemReset(). - * - * @api - */ -#define chSemWait(sp) chSemWaitTimeout(sp, TIME_INFINITE) - -/** - * @brief Performs a wait operation on a semaphore. - * - * @param[in] sp pointer to a @p semaphore_t structure - * @return A message specifying how the invoking thread has been - * released from the semaphore. - * @retval CH_MSG_OK if the thread has not stopped on the semaphore or the - * semaphore has been signaled. - * @retval CH_MSG_RST if the semaphore has been reset using @p chSemReset(). - * - * @sclass - */ -#define chSemWaitS(sp) chSemWaitTimeoutS(sp, TIME_INFINITE) - -/** - * @brief Returns the semaphore counter current value. - * - * @iclass - */ -#define chSemGetCounterI(sp) ((sp)->cnt) - -/** - * @brief Current system time. - * @details Returns the number of system ticks since the @p chSysInit() - * invocation. - * @note The counter can reach its maximum and then restart from zero. - * @note This function can be called from any context but its atomicity - * is not guaranteed on architectures whose word size is less than - * @p systime_t size. - * - * @return The system time in ticks. - * - * @xclass - */ -#if (NIL_CFG_ST_TIMEDELTA == 0) || defined(__DOXYGEN__) -#define chVTGetSystemTimeX() (nil.systime) -#else -#define chVTGetSystemTimeX() port_timer_get_time() -#endif - -/** - * @brief Returns the elapsed time since the specified start time. - * - * @param[in] start start time - * @return The elapsed time. - * - * @xclass - */ -#define chVTTimeElapsedSinceX(start) \ - ((systime_t)(chVTGetSystemTimeX() - (start))) - -/** - * @brief Checks if the specified time is within the specified time window. - * @note When start==end then the function returns always true because the - * whole time range is specified. - * @note This function can be called from any context. - * - * @param[in] time the time to be verified - * @param[in] start the start of the time window (inclusive) - * @param[in] end the end of the time window (non inclusive) - * @retval true current time within the specified time window. - * @retval false current time not within the specified time window. - * - * @xclass - */ -#define chVTIsTimeWithinX(time, start, end) \ - ((bool)((systime_t)((time) - (start)) < (systime_t)((end) - (start)))) - -/** - * @brief Condition assertion. - * @details If the condition check fails then the kernel panics with a - * message and halts. - * @note The condition is tested only if the @p NIL_CFG_ENABLE_ASSERTS - * switch is specified in @p nilconf.h else the macro does nothing. - * @note The remark string is not currently used except for putting a - * comment in the code about the assertion. - * - * @param[in] c the condition to be verified to be true - * @param[in] r a remark string - * - * @api - */ -#if !defined(chDbgAssert) -#define chDbgAssert(c, r) do { \ - /*lint -save -e506 -e774 [2.1, 14.3] Can be a constant by design.*/ \ - if (NIL_CFG_ENABLE_ASSERTS != FALSE) { \ - if (!(c)) { \ - /*lint -restore*/ \ - chSysHalt(__func__); \ - } \ - } \ -} while (false) -#endif /* !defined(chDbgAssert) */ -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern nil_system_t nil; -extern const thread_config_t nil_thd_configs[NIL_CFG_NUM_THREADS + 1]; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void chSysInit(void); - void chSysHalt(const char *reason); - void chSysTimerHandlerI(void); - void chSysUnconditionalLock(void); - void chSysUnconditionalUnlock(void); - syssts_t chSysGetStatusAndLockX(void); - bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end); - void chSysPolledDelayX(rtcnt_t cycles); - void chSysRestoreStatusX(syssts_t sts); - thread_t *chSchReadyI(thread_t *tp, msg_t msg); - void chSchRescheduleS(void); - msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t timeout); - msg_t chThdSuspendTimeoutS(thread_reference_t *trp, systime_t timeout); - void chThdResumeI(thread_reference_t *trp, msg_t msg); - void chThdSleep(systime_t timeout); - void chThdSleepUntil(systime_t abstime); - msg_t chSemWaitTimeout(semaphore_t *sp, systime_t timeout); - msg_t chSemWaitTimeoutS(semaphore_t *sp, systime_t timeout); - void chSemSignal(semaphore_t *sp); - void chSemSignalI(semaphore_t *sp); - void chSemReset(semaphore_t *sp, cnt_t n); - void chSemResetI(semaphore_t *sp, cnt_t n); -#if NIL_CFG_USE_EVENTS == TRUE - void chEvtSignal(thread_t *tp, eventmask_t mask); - void chEvtSignalI(thread_t *tp, eventmask_t mask); - eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout); - eventmask_t chEvtWaitAnyTimeoutS(eventmask_t mask, systime_t timeout); -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _NIL_H_ */ - -/** @} */ diff --git a/os/nil/nil.mk b/os/nil/nil.mk deleted file mode 100644 index 51f0e8083..000000000 --- a/os/nil/nil.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the ChibiOS/NIL kernel files. -KERNSRC = ${CHIBIOS}/os/nil/src/nil.c - -# Required include directories -KERNINC = ${CHIBIOS}/os/nil/include diff --git a/os/nil/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk b/os/nil/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk deleted file mode 100644 index 6fa7d52ea..000000000 --- a/os/nil/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk +++ /dev/null @@ -1,8 +0,0 @@ -# List of the ChibiOS/NIL ARMv6M generic port files. -PORTSRC = $(CHIBIOS)/os/nil/ports/ARMCMx/nilcore.c \ - $(CHIBIOS)/os/nil/ports/ARMCMx/nilcore_v6m.c - -PORTASM = $(CHIBIOS)/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v6m.s - -PORTINC = $(CHIBIOS)/os/nil/ports/ARMCMx \ - $(CHIBIOS)/os/nil/ports/ARMCMx/compilers/GCC diff --git a/os/nil/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk b/os/nil/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk deleted file mode 100644 index 3e9c30125..000000000 --- a/os/nil/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk +++ /dev/null @@ -1,8 +0,0 @@ -# List of the ChibiOS/NIL ARMv7M generic port files. -PORTSRC = $(CHIBIOS)/os/nil/ports/ARMCMx/nilcore.c \ - $(CHIBIOS)/os/nil/ports/ARMCMx/nilcore_v7m.c - -PORTASM = $(CHIBIOS)/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v7m.s - -PORTINC = $(CHIBIOS)/os/nil/ports/ARMCMx \ - $(CHIBIOS)/os/nil/ports/ARMCMx/compilers/GCC diff --git a/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v6m.s b/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v6m.s deleted file mode 100644 index 68862f96e..000000000 --- a/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v6m.s +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARMCMx/compilers/GCC/nilcoreasm_v6m.s - * @brief ARMv6-M architecture port low level code. - * - * @addtogroup ARMCMx_GCC_CORE - * @{ - */ - -#if !defined(FALSE) || defined(__DOXYGEN__) -#define FALSE 0 -#endif - -#if !defined(TRUE) || defined(__DOXYGEN__) -#define TRUE 1 -#endif - -#define _FROM_ASM_ -#include "nilconf.h" -#include "nilcore.h" - -#if !defined(__DOXYGEN__) - - .set CONTEXT_OFFSET, 0 - .set SCB_ICSR, 0xE000ED04 - .set ICSR_PENDSVSET, 0x10000000 - .set ICSR_NMIPENDSET, 0x80000000 - - .cpu cortex-m0 - .fpu softvfp - - .thumb - .text - -/*--------------------------------------------------------------------------* - * Performs a context switch between two threads. - *--------------------------------------------------------------------------*/ - .thumb_func - .globl _port_switch -_port_switch: - push {r4, r5, r6, r7, lr} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4, r5, r6, r7} - - mov r3, sp - str r3, [r1, #CONTEXT_OFFSET] - ldr r3, [r0, #CONTEXT_OFFSET] - mov sp, r3 - - pop {r4, r5, r6, r7} - mov r8, r4 - mov r9, r5 - mov r10, r6 - mov r11, r7 - pop {r4, r5, r6, r7, pc} - -/*--------------------------------------------------------------------------* - * Start a thread by invoking its work function. - * - * Threads execution starts here, the code leaves the system critical zone - * and then jumps into the thread function passed in register R4. The - * register R5 contains the thread parameter. The function chThdExit() is - * called on thread function return. - *--------------------------------------------------------------------------*/ - .thumb_func - .globl _port_thread_start -_port_thread_start: - cpsie i - mov r0, r5 - blx r4 - mov r3, #0 - bl chSysHalt - -/*--------------------------------------------------------------------------* - * Post-IRQ switch code. - * - * Exception handlers return here for context switching. - *--------------------------------------------------------------------------*/ - .thumb_func - .globl _port_switch_from_isr -_port_switch_from_isr: - bl chSchRescheduleS - .globl _port_exit_from_isr -_port_exit_from_isr: - ldr r2, .L2 - ldr r3, .L3 - str r3, [r2, #0] -#if CORTEX_ALTERNATE_SWITCH - cpsie i -#endif -.L1: b .L1 - - .align 2 -.L2: .word SCB_ICSR -#if CORTEX_ALTERNATE_SWITCH -.L3: .word ICSR_PENDSVSET -#else -.L3: .word ICSR_NMIPENDSET -#endif - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v7m.s b/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v7m.s deleted file mode 100644 index a98802798..000000000 --- a/os/nil/ports/ARMCMx/compilers/GCC/nilcoreasm_v7m.s +++ /dev/null @@ -1,130 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARMCMx/compilers/GCC/nilcoreasm_v7m.s - * @brief ARMv7-M architecture port low level code. - * - * @addtogroup ARMCMx_GCC_CORE - * @{ - */ - -#if !defined(FALSE) || defined(__DOXYGEN__) -#define FALSE 0 -#endif - -#if !defined(TRUE) || defined(__DOXYGEN__) -#define TRUE 1 -#endif - -#define _FROM_ASM_ -#include "nilconf.h" -#include "nilcore.h" - -#if !defined(__DOXYGEN__) - - .set CONTEXT_OFFSET, 0 - .set SCB_ICSR, 0xE000ED04 - .set ICSR_PENDSVSET, 0x10000000 - - .syntax unified - .cpu cortex-m4 -#if CORTEX_USE_FPU - .fpu fpv4-sp-d16 -#else - .fpu softvfp -#endif - - .thumb - .text - -/*--------------------------------------------------------------------------* - * Performs a context switch between two threads. - *--------------------------------------------------------------------------*/ - .thumb_func - .globl _port_switch -_port_switch: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} -#if CORTEX_USE_FPU - vpush {s16-s31} -#endif - - str sp, [r1, #CONTEXT_OFFSET] -#if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) && \ - ((CORTEX_MODEL == 3) || (CORTEX_MODEL == 4)) - /* Workaround for ARM errata 752419, only applied if - condition exists for it to be triggered.*/ - ldr r3, [r0, #CONTEXT_OFFSET] - mov sp, r3 -#else - ldr sp, [r0, #CONTEXT_OFFSET] -#endif - -#if CORTEX_USE_FPU - vpop {s16-s31} -#endif - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - -/*--------------------------------------------------------------------------* - * Start a thread by invoking its work function. - * - * Threads execution starts here, the code leaves the system critical zone - * and then jumps into the thread function passed in register R4. The - * register R5 contains the thread parameter. The function chThdExit() is - * called on thread function return. - *--------------------------------------------------------------------------*/ - .thumb_func - .globl _port_thread_start -_port_thread_start: -#if !CORTEX_SIMPLIFIED_PRIORITY - movs r3, #0 - msr BASEPRI, r3 -#else /* CORTEX_SIMPLIFIED_PRIORITY */ - cpsie i -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - mov r0, r5 - blx r4 - mov r3, #0 - bl chSysHalt - -/*--------------------------------------------------------------------------* - * Post-IRQ switch code. - * - * Exception handlers return here for context switching. - *--------------------------------------------------------------------------*/ - .thumb_func - .globl _port_switch_from_isr -_port_switch_from_isr: - bl chSchRescheduleS - .globl _port_exit_from_isr -_port_exit_from_isr: -#if CORTEX_SIMPLIFIED_PRIORITY - movw r3, #:lower16:SCB_ICSR - movt r3, #:upper16:SCB_ICSR - mov r2, ICSR_PENDSVSET - str r2, [r3, #0] - cpsie i -#else /* !CORTEX_SIMPLIFIED_PRIORITY */ - svc #0 -#endif /* !CORTEX_SIMPLIFIED_PRIORITY */ -.L1: b .L1 - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/nil/ports/ARMCMx/compilers/GCC/niltypes.h b/os/nil/ports/ARMCMx/compilers/GCC/niltypes.h deleted file mode 100644 index 402110096..000000000 --- a/os/nil/ports/ARMCMx/compilers/GCC/niltypes.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARMCMx/compilers/GCC/niltypes.h - * @brief ARM Cortex-Mx port system types. - * - * @addtogroup ARMCMx_GCC_CORE - * @{ - */ - -#ifndef _NILTYPES_H_ -#define _NILTYPES_H_ - -#include -#include -#include - -/** - * @name Common constants - */ -/** - * @brief Generic 'false' boolean constant. - */ -#if !defined(FALSE) || defined(__DOXYGEN__) -#define FALSE 0 -#endif - -/** - * @brief Generic 'true' boolean constant. - */ -#if !defined(TRUE) || defined(__DOXYGEN__) -#define TRUE 1 -#endif -/** @} */ - -typedef uint32_t syssts_t; /**< System status word. */ -typedef uint32_t rtcnt_t; /**< Realtime counter. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef int32_t msg_t; /**< Inter-thread message. */ -typedef uint32_t eventmask_t; /**< Mask of event identifiers. */ -typedef int32_t cnt_t; /**< Generic signed counter. */ -typedef uint32_t ucnt_t; /**< Generic unsigned counter. */ - -/** - * @brief Type of system time. - */ -#if (NIL_CFG_ST_RESOLUTION == 32) || defined(__DOXYGEN__) -typedef uint32_t systime_t; -#else -typedef uint16_t systime_t; -#endif - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Makes functions not inlineable. - * @note If the compiler does not support such attribute then the - * realtime counter precision could be degraded. - */ -#define NOINLINE __attribute__((noinline)) - -/** - * @brief Optimized thread function declaration macro. - */ -#define PORT_THD_FUNCTION(tname, arg) \ - __attribute__((noreturn)) void tname(void *arg) - -/** - * @brief Packed variable specifier. - */ -#define PACKED_VAR __attribute__((packed)) - -#endif /* _NILTYPES_H_ */ - -/** @} */ diff --git a/os/nil/ports/ARMCMx/nilcore.c b/os/nil/ports/ARMCMx/nilcore.c deleted file mode 100644 index 7d7738029..000000000 --- a/os/nil/ports/ARMCMx/nilcore.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARMCMx/nilcore.c - * @brief ARM Cortex-Mx port code. - * - * @addtogroup ARMCMx_CORE - * @{ - */ - -#include "nil.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** @} */ diff --git a/os/nil/ports/ARMCMx/nilcore.h b/os/nil/ports/ARMCMx/nilcore.h deleted file mode 100644 index 21b5a0535..000000000 --- a/os/nil/ports/ARMCMx/nilcore.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARMCMx/nilcore.h - * @brief ARM Cortex-Mx port macros and structures. - * - * @addtogroup ARMCMx_CORE - * @{ - */ - -#ifndef _NILCORE_H_ -#define _NILCORE_H_ - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @name Architecture and Compiler - * @{ - */ -/** - * @brief Macro defining a generic ARM architecture. - */ -#define PORT_ARCHITECTURE_ARM - -/* The following code is not processed when the file is included from an - asm module because those intrinsic macros are not necessarily defined - by the assembler too.*/ -#if !defined(_FROM_ASM_) - -/** - * @brief Compiler name and version. - */ -#if defined(__GNUC__) || defined(__DOXYGEN__) -#define PORT_COMPILER_NAME "GCC " __VERSION__ - -#elif defined(__ICCARM__) -#define PORT_COMPILER_NAME "IAR" - -#elif defined(__CC_ARM) -#define PORT_COMPILER_NAME "RVCT" - -#else -#error "unsupported compiler" -#endif - -#endif /* !defined(_FROM_ASM_) */ - -/** @} */ - -/* Inclusion of the Cortex-Mx implementation specific parameters.*/ -#include "cmparams.h" - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an alternative timer implementation. - * @details Usually the port uses a timer interface defined in the file - * @p nilcore_timer.h, if this option is enabled then the file - * @p nilcore_timer_alt.h is included instead. - */ -#if !defined(PORT_USE_ALT_TIMER) -#define PORT_USE_ALT_TIMER FALSE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -/** - * @brief Type of a generic ARM register. - */ -typedef void *regarm_t; - -/** - * @brief Type of stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - -/* The following declarations are there just for Doxygen documentation, the - real declarations are inside the sub-headers being specific for the - sub-architectures.*/ -#if defined(__DOXYGEN__) -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note It is implemented to match the Cortex-Mx exception context. - */ -struct port_extctx {}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switch. - */ -struct port_intctx {}; -#endif /* defined(__DOXYGEN__) */ - -#endif /* !defined(_FROM_ASM_) */ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Total priority levels. - */ -#define CORTEX_PRIORITY_LEVELS (1U << CORTEX_PRIORITY_BITS) - -/** - * @brief Minimum priority level. - * @details This minimum priority level is calculated from the number of - * priority bits supported by the specific Cortex-Mx implementation. - */ -#define CORTEX_MINIMUM_PRIORITY (CORTEX_PRIORITY_LEVELS - 1) - -/** - * @brief Maximum priority level. - * @details The maximum allowed priority level is always zero. - */ -#define CORTEX_MAXIMUM_PRIORITY 0U - -/** - * @brief Priority level to priority mask conversion macro. - */ -#define CORTEX_PRIO_MASK(n) \ - ((n) << (8U - (unsigned)CORTEX_PRIORITY_BITS)) - -/** - * @brief Priority level verification macro. - */ -#define PORT_IRQ_IS_VALID_PRIORITY(n) \ - (((n) >= 0U) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/** - * @brief Priority level verification macro. - */ -#define PORT_IRQ_IS_VALID_KERNEL_PRIORITY(n) \ - (((n) >= CORTEX_MAX_KERNEL_PRIORITY) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/* Includes the sub-architecture-specific part.*/ -#if (CORTEX_MODEL == 0) || (CORTEX_MODEL == 1) -#include "nilcore_v6m.h" -#elif (CORTEX_MODEL == 3) || (CORTEX_MODEL == 4) || (CORTEX_MODEL == 7) -#include "nilcore_v7m.h" -#else -#error "unknown Cortex-M variant" -#endif - -#if !defined(_FROM_ASM_) - -#if NIL_CFG_ST_TIMEDELTA > 0 -#if PORT_USE_ALT_TIMER == FALSE -#include "nilcore_timer.h" -#else /* PORT_USE_ALT_TIMER != FALSE */ -#include "nilcore_timer_alt.h" -#endif /* PORT_USE_ALT_TIMER != FALSE */ -#endif /* NIL_CFG_ST_TIMEDELTA > 0 */ - -#endif /* !defined(_FROM_ASM_) */ - -#endif /* _NILCORE_H_ */ - -/** @} */ diff --git a/os/nil/ports/ARMCMx/nilcore_timer.h b/os/nil/ports/ARMCMx/nilcore_timer.h deleted file mode 100644 index 2c7c98cf6..000000000 --- a/os/nil/ports/ARMCMx/nilcore_timer.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARMCMx/nilcore_timer.h - * @brief System timer header file. - * - * @addtogroup ARMCMx_TIMER - * @{ - */ - -#ifndef _NILCORE_TIMER_H_ -#define _NILCORE_TIMER_H_ - -/* This is the only header in the HAL designed to be include-able alone.*/ -#include "st.h" - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief Starts the alarm. - * @note Makes sure that no spurious alarms are triggered after - * this call. - * - * @param[in] time the time to be set for the first alarm - * - * @notapi - */ -static inline void port_timer_start_alarm(systime_t time) { - - stStartAlarm(time); -} - -/** - * @brief Stops the alarm interrupt. - * - * @notapi - */ -static inline void port_timer_stop_alarm(void) { - - stStopAlarm(); -} - -/** - * @brief Sets the alarm time. - * - * @param[in] time the time to be set for the next alarm - * - * @notapi - */ -static inline void port_timer_set_alarm(systime_t time) { - - stSetAlarm(time); -} - -/** - * @brief Returns the system time. - * - * @return The system time. - * - * @notapi - */ -static inline systime_t port_timer_get_time(void) { - - return stGetCounter(); -} - -/** - * @brief Returns the current alarm time. - * - * @return The currently set alarm time. - * - * @notapi - */ -static inline systime_t port_timer_get_alarm(void) { - - return stGetAlarm(); -} - -#endif /* _NILCORE_TIMER_H_ */ - -/** @} */ diff --git a/os/nil/ports/ARMCMx/nilcore_v6m.c b/os/nil/ports/ARMCMx/nilcore_v6m.c deleted file mode 100644 index 791062db3..000000000 --- a/os/nil/ports/ARMCMx/nilcore_v6m.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file nilcore_v6m.c - * @brief ARMv6-M architecture port code. - * - * @addtogroup ARMCMx_V6M_CORE - * @{ - */ - -#include "nil.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module interrupt handlers. */ -/*===========================================================================*/ - -#if (CORTEX_ALTERNATE_SWITCH == FALSE) || defined(__DOXYGEN__) -/** - * @brief NMI vector. - * @details The NMI vector is used for exception mode re-entering after a - * context switch. - */ -/*lint -save -e9075 [8.4] All symbols are invoked from asm context.*/ -void NMI_Handler(void) { -/*lint -restore*/ - - /* The port_extctx structure is pointed by the PSP register.*/ - struct port_extctx *ctxp = (struct port_extctx *)__get_PSP(); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - - /* Writing back the modified PSP value.*/ - __set_PSP((uint32_t)ctxp); - - /* Restoring the normal interrupts status.*/ - port_unlock_from_isr(); -} -#endif /* !CORTEX_ALTERNATE_SWITCH */ - -#if (CORTEX_ALTERNATE_SWITCH == TRUE) || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - */ -/*lint -save -e9075 [8.4] All symbols are invoked from asm context.*/ -void PendSV_Handler(void) { -/*lint -restore*/ - - /* The port_extctx structure is pointed by the PSP register.*/ - struct port_extctx *ctxp = (struct port_extctx *)__get_PSP(); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - - /* Writing back the modified PSP value.*/ - __set_PSP((uint32_t)ctxp); -} -#endif /* CORTEX_ALTERNATE_SWITCH */ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief IRQ epilogue code. - * - * @param[in] lr value of the @p LR register on ISR entry - */ -void _port_irq_epilogue(regarm_t lr) { - - if (lr != (regarm_t)0xFFFFFFF1U) { - struct port_extctx *ctxp; - - port_lock_from_isr(); - - /* The extctx structure is pointed by the PSP register.*/ - ctxp = (struct port_extctx *)__get_PSP(); - - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - ctxp--; - - /* Writing back the modified PSP value.*/ - __set_PSP((uint32_t)ctxp); - - /* Setting up a fake XPSR register value.*/ - ctxp->xpsr = (regarm_t)0x01000000; - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsRescRequiredI()) { - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (regarm_t)_port_switch_from_isr; - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (regarm_t)_port_exit_from_isr; - } - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - } -} - -/** @} */ diff --git a/os/nil/ports/ARMCMx/nilcore_v6m.h b/os/nil/ports/ARMCMx/nilcore_v6m.h deleted file mode 100644 index 3a500d2b0..000000000 --- a/os/nil/ports/ARMCMx/nilcore_v6m.h +++ /dev/null @@ -1,406 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file chcore_v6m.h - * @brief ARMv6-M architecture port macros and structures. - * - * @addtogroup ARMCMx_V6M_CORE - * @{ - */ - -#ifndef _CHCORE_V6M_H_ -#define _CHCORE_V6M_H_ - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @brief This port does not support a realtime counter. - */ -#define PORT_SUPPORTS_RT FALSE - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to @p 0, - * this handler always has the highest priority that cannot preempt - * the kernel. - */ -#define CORTEX_PRIORITY_PENDSV 0 - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief Alternate preemption method. - * @details Activating this option will make the Kernel use the PendSV - * handler for preemption instead of the NMI handler. - */ -#ifndef CORTEX_ALTERNATE_SWITCH -#define CORTEX_ALTERNATE_SWITCH FALSE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/** - * @name Architecture and Compiler - * @{ - */ -#if ((CORTEX_MODEL == 0) && !defined(__CORE_CM0PLUS_H_DEPENDANT)) || \ - defined(__DOXYGEN__) -/** - * @brief Macro defining the specific ARM architecture. - */ -#define PORT_ARCHITECTURE_ARM_v6M - -/** - * @brief Name of the implemented architecture. - */ -#define PORT_ARCHITECTURE_NAME "ARMv6-M" - -/** - * @brief Name of the architecture variant. - */ -#define PORT_CORE_VARIANT_NAME "Cortex-M0" - -#elif (CORTEX_MODEL == 0) && defined(__CORE_CM0PLUS_H_DEPENDANT) -#define PORT_ARCHITECTURE_ARM_v6M -#define PORT_ARCHITECTURE_NAME "ARMv6-M" -#define PORT_CORE_VARIANT_NAME "Cortex-M0+" -#endif - -/** - * @brief Port-specific information string. - */ -#if (CORTEX_ALTERNATE_SWITCH == FALSE) || defined(__DOXYGEN__) -#define PORT_INFO "Preemption through NMI" -#else -#define PORT_INFO "Preemption through PendSV" -#endif -/** @} */ - -/** - * @brief Maximum usable priority for normal ISRs. - */ -#if (CORTEX_ALTERNATE_SWITCH == TRUE) || defined(__DOXYGEN__) -#define CORTEX_MAX_KERNEL_PRIORITY 1 -#else -#define CORTEX_MAX_KERNEL_PRIORITY 0 -#endif - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - - /* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) -struct port_extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -}; - -struct port_intctx { - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t lr; -}; -#endif /* !defined(__DOXYGEN__) */ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Platform dependent thread stack setup. - * @details This code usually setup the context switching frame represented - * by an @p port_intctx structure. - */ -#define PORT_SETUP_CONTEXT(tp, wend, pf, arg) { \ - (tp)->ctxp = (struct port_intctx *)((uint8_t *)(wend) - \ - sizeof(struct port_intctx)); \ - (tp)->ctxp->r4 = (regarm_t)(pf); \ - (tp)->ctxp->r5 = (regarm_t)(arg); \ - (tp)->ctxp->lr = (regarm_t)_port_thread_start; \ -} - -/** - * @brief Computes the thread working area global size. - * @note There is no need to perform alignments in this macro. - */ -#define PORT_WA_SIZE(n) (sizeof(struct port_intctx) + \ - sizeof(struct port_extctx) + \ - ((size_t)(n)) + ((size_t)(PORT_INT_REQUIRED_STACK))) - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#if defined(__GNUC__) || defined(__DOXYGEN__) -#define PORT_IRQ_PROLOGUE() \ - regarm_t _saved_lr = (regarm_t)__builtin_return_address(0) -#elif defined(__ICCARM__) -#define PORT_IRQ_PROLOGUE() \ - regarm_t _saved_lr = (regarm_t)__get_LR() -#elif defined(__CC_ARM) -#define PORT_IRQ_PROLOGUE() \ - regarm_t _saved_lr = (regarm_t)__return_address() -#endif - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue(_saved_lr) - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if (NIL_CFG_ENABLE_STACK_CHECK == FALSE) || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - struct port_intctx *r13 = (struct port_intctx *)__get_PSP(); \ - if ((stkalign_t *)(r13 - 1) < (otp)->stklim) { \ - chSysHalt("stack overflow"); \ - } \ - _port_switch(ntp, otp); \ -} -#endif - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void _port_irq_epilogue(regarm_t lr); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); - void _port_switch(thread_t *ntp, thread_t *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief Port-related initialization code. - */ -static inline void port_init(void) { - - NVIC_SetPriority(PendSV_IRQn, CORTEX_PRIORITY_PENDSV); -} - -/** - * @brief Returns a word encoding the current interrupts status. - * - * @return The interrupts status. - */ -static inline syssts_t port_get_irq_status(void) { - - return (syssts_t)__get_PRIMASK(); -} - -/** - * @brief Checks the interrupt status. - * - * @param[in] sts the interrupt status word - * - * @return The interrupt status. - * @retvel false the word specified a disabled interrupts status. - * @retvel true the word specified an enabled interrupts status. - */ -static inline bool port_irq_enabled(syssts_t sts) { - - return (sts & (syssts_t)1) == (syssts_t)0; -} - -/** - * @brief Determines the current execution context. - * - * @return The execution context. - * @retval false not running in ISR mode. - * @retval true running in ISR mode. - */ -static inline bool port_is_isr_context(void) { - - return (bool)((__get_IPSR() & 0x1FFU) != 0U); -} - -/** - * @brief Kernel-lock action. - * @details In this port this function disables interrupts globally. - */ -static inline void port_lock(void) { - - __disable_irq(); -} - -/** - * @brief Kernel-unlock action. - * @details In this port this function enables interrupts globally. - */ -static inline void port_unlock(void) { - - __enable_irq(); -} - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details In this port this function disables interrupts globally. - * @note Same as @p port_lock() in this port. - */ -static inline void port_lock_from_isr(void) { - - port_lock(); -} - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details In this port this function enables interrupts globally. - * @note Same as @p port_lock() in this port. - */ -static inline void port_unlock_from_isr(void) { - - port_unlock(); -} - -/** - * @brief Disables all the interrupt sources. - */ -static inline void port_disable(void) { - - __disable_irq(); -} - -/** - * @brief Disables the interrupt sources below kernel-level priority. - */ -static inline void port_suspend(void) { - - __disable_irq(); -} - -/** - * @brief Enables all the interrupt sources. - */ -static inline void port_enable(void) { - - __enable_irq(); -} - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -static inline void port_wait_for_interrupt(void) { - -#if CORTEX_ENABLE_WFI_IDLE == TRUE - __WFI(); -#endif -} - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_V6M_H_ */ - -/** @} */ diff --git a/os/nil/ports/ARMCMx/nilcore_v7m.c b/os/nil/ports/ARMCMx/nilcore_v7m.c deleted file mode 100644 index c381fc3ef..000000000 --- a/os/nil/ports/ARMCMx/nilcore_v7m.c +++ /dev/null @@ -1,165 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file nilcore_v7m.c - * @brief ARMv7-M architecture port code. - * - * @addtogroup ARMCMx_V7M_CORE - * @{ - */ - -#include "nil.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module interrupt handlers. */ -/*===========================================================================*/ - -#if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) || defined(__DOXYGEN__) -/** - * @brief SVC vector. - * @details The SVC vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in advanced kernel mode. - */ -/*lint -save -e9075 [8.4] All symbols are invoked from asm context.*/ -void SVC_Handler(void) { -/*lint -restore*/ - struct port_extctx *ctxp; - -#if CORTEX_USE_FPU == TRUE - /* Enforcing unstacking of the FP part of the context.*/ - FPU->FPCCR &= ~FPU_FPCCR_LSPACT_Msk; -#endif - - /* The port_extctx structure is pointed by the PSP register.*/ - ctxp = (struct port_extctx *)__get_PSP(); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - - /* Restoring real position of the original stack frame.*/ - __set_PSP((uint32_t)ctxp); - - /* Restoring the normal interrupts status.*/ - port_unlock_from_isr(); -} -#endif /* CORTEX_SIMPLIFIED_PRIORITY == FALSE */ - -#if (CORTEX_SIMPLIFIED_PRIORITY == TRUE) || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in compact kernel mode. - */ -/*lint -save -e9075 [8.4] All symbols are invoked from asm context.*/ -void PendSV_Handler(void) { -/*lint -restore*/ - struct port_extctx *ctxp; - -#if CORTEX_USE_FPU == TRUE - /* Enforcing unstacking of the FP part of the context.*/ - FPU->FPCCR &= ~FPU_FPCCR_LSPACT_Msk; -#endif - - /* The port_extctx structure is pointed by the PSP register.*/ - ctxp = (struct port_extctx *)__get_PSP(); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - - /* Writing back the modified PSP value.*/ - __set_PSP((uint32_t)ctxp); -} -#endif /* CORTEX_SIMPLIFIED_PRIORITY == TRUE */ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief Exception exit redirection to _port_switch_from_isr(). - */ -void _port_irq_epilogue(void) { - - port_lock_from_isr(); - if ((SCB->ICSR & SCB_ICSR_RETTOBASE_Msk) != 0U) { - struct port_extctx *ctxp; - -#if CORTEX_USE_FPU == TRUE - /* Enforcing a lazy FPU state save by accessing the FPCSR register.*/ - (void) __get_FPSCR(); -#endif - - /* The port_extctx structure is pointed by the PSP register.*/ - ctxp = (struct port_extctx *)__get_PSP(); - - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - ctxp--; - - /* Setting up a fake XPSR register value.*/ - ctxp->xpsr = (regarm_t)0x01000000; - - /* Writing back the modified PSP value.*/ - __set_PSP((uint32_t)ctxp); - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsRescRequiredI()) { - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (regarm_t)_port_switch_from_isr; - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (regarm_t)_port_exit_from_isr; - } - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - return; - } - port_unlock_from_isr(); -} - -/** @} */ diff --git a/os/nil/ports/ARMCMx/nilcore_v7m.h b/os/nil/ports/ARMCMx/nilcore_v7m.h deleted file mode 100644 index c9ffe87b8..000000000 --- a/os/nil/ports/ARMCMx/nilcore_v7m.h +++ /dev/null @@ -1,576 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file chcore_v7m.h - * @brief ARMv7-M architecture port macros and structures. - * - * @addtogroup ARMCMx_V7M_CORE - * @{ - */ - -#ifndef _NILCORE_V7M_H_ -#define _NILCORE_V7M_H_ - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @brief This port supports a realtime counter. - */ -#define PORT_SUPPORTS_RT TRUE - -/** - * @brief Disabled value for BASEPRI register. - */ -#define CORTEX_BASEPRI_DISABLED 0U - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) || defined(__DOXYGEN__) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) || defined(__DOXYGEN__) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief FPU support in context switch. - * @details Activating this option activates the FPU support in the kernel. - */ -#if !defined(CORTEX_USE_FPU) -#define CORTEX_USE_FPU CORTEX_HAS_FPU -#elif (CORTEX_USE_FPU == TRUE) && (CORTEX_HAS_FPU == FALSE) -/* This setting requires an FPU presence check in case it is externally - redefined.*/ -#error "the selected core does not have an FPU" -#endif - -/** - * @brief Simplified priority handling flag. - * @details Activating this option makes the Kernel work in compact mode. - * In compact mode interrupts are disabled globally instead of - * raising the priority mask to some intermediate level. - */ -#if !defined(CORTEX_SIMPLIFIED_PRIORITY) -#define CORTEX_SIMPLIFIED_PRIORITY FALSE -#endif - -/** - * @brief SVCALL handler priority. - * @note The default SVCALL handler priority is defaulted to - * @p CORTEX_MAXIMUM_PRIORITY+1, this reserves the - * @p CORTEX_MAXIMUM_PRIORITY priority level as fast interrupts - * priority level. - */ -#if !defined(CORTEX_PRIORITY_SVCALL) -#define CORTEX_PRIORITY_SVCALL (CORTEX_MAXIMUM_PRIORITY + 1U) -#elif !PORT_IRQ_IS_VALID_PRIORITY(CORTEX_PRIORITY_SVCALL) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SVCALL" -#endif - -/** - * @brief NVIC VTOR initialization expression. - */ -#if !defined(CORTEX_VTOR_INIT) || defined(__DOXYGEN__) -#define CORTEX_VTOR_INIT 0x00000000U -#endif - -/** - * @brief NVIC PRIGROUP initialization expression. - * @details The default assigns all available priority bits as preemption - * priority with no sub-priority. - */ -#if !defined(CORTEX_PRIGROUP_INIT) || defined(__DOXYGEN__) -#define CORTEX_PRIGROUP_INIT (7 - CORTEX_PRIORITY_BITS) -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/** - * @name Architecture and Compiler - * @{ - */ -#if (CORTEX_MODEL == 3) || defined(__DOXYGEN__) -/** - * @brief Macro defining the specific ARM architecture. - */ -#define PORT_ARCHITECTURE_ARM_v7M - -/** - * @brief Name of the implemented architecture. - */ -#define PORT_ARCHITECTURE_NAME "ARMv7-M" - -/** - * @brief Name of the architecture variant. - */ -#define PORT_CORE_VARIANT_NAME "Cortex-M3" - -#elif (CORTEX_MODEL == 4) -#define PORT_ARCHITECTURE_ARM_v7ME -#define PORT_ARCHITECTURE_NAME "ARMv7E-M" -#if CORTEX_USE_FPU -#define PORT_CORE_VARIANT_NAME "Cortex-M4F" -#else -#define PORT_CORE_VARIANT_NAME "Cortex-M4" -#endif - -#elif (CORTEX_MODEL == 7) -#define PORT_ARCHITECTURE_ARM_v7ME -#define PORT_ARCHITECTURE_NAME "ARMv7E-M" -#if CORTEX_USE_FPU -#define PORT_CORE_VARIANT_NAME "Cortex-M7F" -#else -#define PORT_CORE_VARIANT_NAME "Cortex-M7" -#endif -#endif - -/** - * @brief Port-specific information string. - */ -#if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) || defined(__DOXYGEN__) -#define PORT_INFO "Advanced kernel mode" -#else -#define PORT_INFO "Compact kernel mode" -#endif -/** @} */ - -#if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) || defined(__DOXYGEN__) -/** - * @brief Maximum usable priority for normal ISRs. - */ -#define CORTEX_MAX_KERNEL_PRIORITY (CORTEX_PRIORITY_SVCALL + 1U) - -/** - * @brief BASEPRI level within kernel lock. - */ -#define CORTEX_BASEPRI_KERNEL \ - CORTEX_PRIO_MASK(CORTEX_MAX_KERNEL_PRIORITY) -#else - -#define CORTEX_MAX_KERNEL_PRIORITY 0U -#endif - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to - * @p CORTEX_MAX_KERNEL_PRIORITY, this handler always have the - * highest priority that cannot preempt the kernel. - */ -#define CORTEX_PRIORITY_PENDSV CORTEX_MAX_KERNEL_PRIORITY - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -/* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) -struct port_extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -#if CORTEX_USE_FPU - regarm_t s0; - regarm_t s1; - regarm_t s2; - regarm_t s3; - regarm_t s4; - regarm_t s5; - regarm_t s6; - regarm_t s7; - regarm_t s8; - regarm_t s9; - regarm_t s10; - regarm_t s11; - regarm_t s12; - regarm_t s13; - regarm_t s14; - regarm_t s15; - regarm_t fpscr; - regarm_t reserved; -#endif /* CORTEX_USE_FPU */ -}; - -struct port_intctx { -#if CORTEX_USE_FPU - regarm_t s16; - regarm_t s17; - regarm_t s18; - regarm_t s19; - regarm_t s20; - regarm_t s21; - regarm_t s22; - regarm_t s23; - regarm_t s24; - regarm_t s25; - regarm_t s26; - regarm_t s27; - regarm_t s28; - regarm_t s29; - regarm_t s30; - regarm_t s31; -#endif /* CORTEX_USE_FPU */ - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t lr; -}; -#endif /* !defined(__DOXYGEN__) */ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p port_intctx structure. - */ -#define PORT_SETUP_CONTEXT(tp, wend, pf, arg) { \ - (tp)->ctxp = (struct port_intctx *)((uint8_t *)(wend) - \ - sizeof(struct port_intctx)); \ - (tp)->ctxp->r4 = (regarm_t)(pf); \ - (tp)->ctxp->r5 = (regarm_t)(arg); \ - (tp)->ctxp->lr = (regarm_t)_port_thread_start; \ -} - -/** - * @brief Computes the thread working area global size. - * @note There is no need to perform alignments in this macro. - */ -#define PORT_WA_SIZE(n) (sizeof(struct port_intctx) + \ - sizeof(struct port_extctx) + \ - ((size_t)(n)) + ((size_t)(PORT_INT_REQUIRED_STACK))) - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue() - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if (NIL_CFG_ENABLE_STACK_CHECK == FALSE) || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - struct port_intctx *r13 = (struct port_intctx *)__get_PSP(); \ - if ((stkalign_t *)(r13 - 1) < (otp)->stklim) { \ - chSysHalt("stack overflow"); \ - } \ - _port_switch(ntp, otp); \ -} -#endif - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void _port_irq_epilogue(void); - void _port_switch(thread_t *ntp, thread_t *otp); - void _port_thread_start(void); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief Port-related initialization code. - */ -static inline void port_init(void) { - - /* Initialization of the vector table and priority related settings.*/ - SCB->VTOR = CORTEX_VTOR_INIT; - - /* Initializing priority grouping.*/ - NVIC_SetPriorityGrouping(CORTEX_PRIGROUP_INIT); - - /* DWT cycle counter enable.*/ - CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; -#if CORTEX_MODEL == 7 - DWT->LAR = 0xC5ACCE55U; -#endif - DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; - - /* Initialization of the system vectors used by the port.*/ -#if CORTEX_SIMPLIFIED_PRIORITY == FALSE - NVIC_SetPriority(SVCall_IRQn, CORTEX_PRIORITY_SVCALL); -#endif - NVIC_SetPriority(PendSV_IRQn, CORTEX_PRIORITY_PENDSV); -} - -/** - * @brief Returns a word encoding the current interrupts status. - * - * @return The interrupts status. - */ -static inline syssts_t port_get_irq_status(void) { - syssts_t sts; - -#if CORTEX_SIMPLIFIED_PRIORITY == FALSE - sts = (syssts_t)__get_BASEPRI(); -#else /* CORTEX_SIMPLIFIED_PRIORITY */ - sts = (syssts_t)__get_PRIMASK(); -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - return sts; -} - -/** - * @brief Checks the interrupt status. - * - * @param[in] sts the interrupt status word - * - * @return The interrupt status. - * @retvel false the word specified a disabled interrupts status. - * @retvel true the word specified an enabled interrupts status. - */ -static inline bool port_irq_enabled(syssts_t sts) { - -#if CORTEX_SIMPLIFIED_PRIORITY == FALSE - return sts == (syssts_t)CORTEX_BASEPRI_DISABLED; -#else /* CORTEX_SIMPLIFIED_PRIORITY */ - return (sts & (syssts_t)1) == (syssts_t)0; -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ -} - -/** - * @brief Determines the current execution context. - * - * @return The execution context. - * @retval false not running in ISR mode. - * @retval true running in ISR mode. - */ -static inline bool port_is_isr_context(void) { - - return (bool)((__get_IPSR() & 0x1FFU) != 0U); -} - -/** - * @brief Kernel-lock action. - * @details In this port this function raises the base priority to kernel - * level. - */ -static inline void port_lock(void) { - -#if CORTEX_SIMPLIFIED_PRIORITY == FALSE -#if defined(__CM7_REV) -#if __CM7_REV == 0 - __disable_irq(); -#endif -#endif - __set_BASEPRI(CORTEX_BASEPRI_KERNEL); -#if defined(__CM7_REV) -#if __CM7_REV == 0 - __enable_irq(); -#endif -#endif -#else /* CORTEX_SIMPLIFIED_PRIORITY */ - __disable_irq(); -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ -} - -/** - * @brief Kernel-unlock action. - * @details In this port this function lowers the base priority to user - * level. - */ -static inline void port_unlock(void) { - -#if CORTEX_SIMPLIFIED_PRIORITY == FALSE - __set_BASEPRI(CORTEX_BASEPRI_DISABLED); -#else /* CORTEX_SIMPLIFIED_PRIORITY */ - __enable_irq(); -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ -} - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details In this port this function raises the base priority to kernel - * level. - * @note Same as @p port_lock() in this port. - */ -static inline void port_lock_from_isr(void) { - - port_lock(); -} - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details In this port this function lowers the base priority to user - * level. - * @note Same as @p port_unlock() in this port. - */ -static inline void port_unlock_from_isr(void) { - - port_unlock(); -} - -/** - * @brief Disables all the interrupt sources. - * @note In this port it disables all the interrupt sources by raising - * the priority mask to level 0. - */ -static inline void port_disable(void) { - - __disable_irq(); -} - -/** - * @brief Disables the interrupt sources below kernel-level priority. - * @note Interrupt sources above kernel level remains enabled. - * @note In this port it raises/lowers the base priority to kernel level. - */ -static inline void port_suspend(void) { - -#if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) || defined(__DOXYGEN__) - __set_BASEPRI(CORTEX_BASEPRI_KERNEL); - __enable_irq(); -#else - __disable_irq(); -#endif -} - -/** - * @brief Enables all the interrupt sources. - * @note In this port it lowers the base priority to user level. - */ -static inline void port_enable(void) { - -#if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) || defined(__DOXYGEN__) - __set_BASEPRI(CORTEX_BASEPRI_DISABLED); -#endif - __enable_irq(); -} - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -static inline void port_wait_for_interrupt(void) { - -#if CORTEX_ENABLE_WFI_IDLE == TRUE - __WFI(); -#endif -} - -/** - * @brief Returns the current value of the realtime counter. - * - * @return The realtime counter value. - */ -static inline rtcnt_t port_rt_get_counter_value(void) { - - return DWT->CYCCNT; -} - -#endif /* !defined(_FROM_ASM_) */ - -#endif /* _NILCORE_V7M_H_ */ - -/** @} */ diff --git a/os/nil/ports/AVR/compilers/GCC/mk/port.mk b/os/nil/ports/AVR/compilers/GCC/mk/port.mk deleted file mode 100644 index 0eaec1a5f..000000000 --- a/os/nil/ports/AVR/compilers/GCC/mk/port.mk +++ /dev/null @@ -1,7 +0,0 @@ -# List of the ChibiOS/RT AVR port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/AVR/nilcore.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/nil/ports/AVR \ - ${CHIBIOS}/os/nil/ports/AVR/compilers/GCC diff --git a/os/nil/ports/AVR/compilers/GCC/niltypes.h b/os/nil/ports/AVR/compilers/GCC/niltypes.h deleted file mode 100644 index 3e2e941fa..000000000 --- a/os/nil/ports/AVR/compilers/GCC/niltypes.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/compilers/GCC/niltypes.h - * @brief AVR port system types. - * - * @addtogroup AVR_CORE - * @{ - */ - -#ifndef _NILTYPES_H_ -#define _NILTYPES_H_ - -#include -#include -#include - -/** - * @name Common constants - */ -/** - * @brief Generic 'false' boolean constant. - */ -#if !defined(FALSE) || defined(__DOXYGEN__) -#define FALSE 0 -#endif - -/** - * @brief Generic 'true' boolean constant. - */ -#if !defined(TRUE) || defined(__DOXYGEN__) -#define TRUE (!FALSE) -#endif -/** @} */ - -typedef uint8_t syssts_t; /**< System status word. */ -typedef uint16_t rtcnt_t; /**< Realtime counter. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef int16_t msg_t; /**< Inter-thread message. */ -typedef uint8_t eventmask_t; /**< Mask of event identifiers. */ -typedef int8_t cnt_t; /**< Generic signed counter. */ -typedef uint8_t ucnt_t; /**< Generic unsigned counter. */ - -/** - * @brief Type of system time. - */ -#if (NIL_CFG_ST_RESOLUTION == 32) || defined(__DOXYGEN__) -typedef uint32_t systime_t; -#else -typedef uint16_t systime_t; -#endif - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Makes functions not inlineable. - * @note If the compiler does not support such attribute then the - * realtime counter precision could be degraded. - */ -#define NOINLINE __attribute__((noinline)) - -/** - * @brief Optimized thread function declaration macro. - */ -#define PORT_THD_FUNCTION(tname, arg) \ - __attribute__((noreturn)) void tname(void *arg) - -/** - * @brief Packed variable specifier. - */ -#define PACKED_VAR __attribute__((packed)) - -#endif /* _NILTYPES_H_ */ - -/** @} */ diff --git a/os/nil/ports/AVR/nilcore.c b/os/nil/ports/AVR/nilcore.c deleted file mode 100644 index 83fe441df..000000000 --- a/os/nil/ports/AVR/nilcore.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/nilcore.c - * @brief AVR port code. - * - * @addtogroup AVR_CORE - * @{ - */ - -#include "nil.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * @note The function is declared as a weak symbol, it is possible to - * redefine it in your application code. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !defined(__DOXYGEN__) -__attribute__((naked, weak)) -#endif -void _port_switch(thread_t *ntp, thread_t *otp) { - - asm volatile ("push r2"); - asm volatile ("push r3"); - asm volatile ("push r4"); - asm volatile ("push r5"); - asm volatile ("push r6"); - asm volatile ("push r7"); - asm volatile ("push r8"); - asm volatile ("push r9"); - asm volatile ("push r10"); - asm volatile ("push r11"); - asm volatile ("push r12"); - asm volatile ("push r13"); - asm volatile ("push r14"); - asm volatile ("push r15"); - asm volatile ("push r16"); - asm volatile ("push r17"); - asm volatile ("push r28"); - asm volatile ("push r29"); - - asm volatile ("movw r30, r22"); - asm volatile ("in r0, 0x3d"); - asm volatile ("std Z+0, r0"); - asm volatile ("in r0, 0x3e"); - asm volatile ("std Z+1, r0"); - - asm volatile ("movw r30, r24"); - asm volatile ("ldd r0, Z+0"); - asm volatile ("out 0x3d, r0"); - asm volatile ("ldd r0, Z+1"); - asm volatile ("out 0x3e, r0"); - - asm volatile ("pop r29"); - asm volatile ("pop r28"); - asm volatile ("pop r17"); - asm volatile ("pop r16"); - asm volatile ("pop r15"); - asm volatile ("pop r14"); - asm volatile ("pop r13"); - asm volatile ("pop r12"); - asm volatile ("pop r11"); - asm volatile ("pop r10"); - asm volatile ("pop r9"); - asm volatile ("pop r8"); - asm volatile ("pop r7"); - asm volatile ("pop r6"); - asm volatile ("pop r5"); - asm volatile ("pop r4"); - asm volatile ("pop r3"); - asm volatile ("pop r2"); - asm volatile ("ret"); -} - -/** - * @brief Start a thread by invoking its work function. - * @details If the work function returns @p chThdExit() is automatically - * invoked. - */ -void _port_thread_start(void) { - - chSysUnlock(); - asm volatile ("movw r24, r4"); - asm volatile ("movw r30, r2"); - asm volatile ("icall"); - chSysHalt(0); -} - -/** @} */ diff --git a/os/nil/ports/AVR/nilcore.h b/os/nil/ports/AVR/nilcore.h deleted file mode 100644 index 4d3122c22..000000000 --- a/os/nil/ports/AVR/nilcore.h +++ /dev/null @@ -1,418 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/nilcore.h - * @brief AVR port macros and structures. - * - * @addtogroup AVR_CORE - * @{ - */ - -#ifndef _NILCORE_H_ -#define _NILCORE_H_ - -#include -#include - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @name Architecture and Compiler - * @{ - */ -/** - * @brief Macro defining the port architecture. - */ -#define PORT_ARCHITECTURE_AVR - -/** - * @brief Name of the implemented architecture. - */ -#define PORT_ARCHITECTURE_NAME "AVR" - -/** - * @brief Name of the architecture variant. - */ -#define PORT_CORE_VARIANT_NAME "MegaAVR" - -/** - * @brief Compiler name and version. - */ -#if defined(__GNUC__) || defined(__DOXYGEN__) -#define PORT_COMPILER_NAME "GCC " __VERSION__ - -#else -#error "unsupported compiler" -#endif - -/** - * @brief Port-specific information string. - */ -#define PORT_INFO "16 bits code addressing" - -/** - * @brief This port supports a realtime counter. - */ -#define PORT_SUPPORTS_RT FALSE -/** @} */ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 8. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) || defined(__DOXYGEN__) -#define PORT_IDLE_THREAD_STACK_SIZE 8 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port the default is 32 bytes per thread. - */ -#if !defined(PORT_INT_REQUIRED_STACK) || defined(__DOXYGEN__) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables an alternative timer implementation. - * @details Usually the port uses a timer interface defined in the file - * @p nilcore_timer.h, if this option is enabled then the file - * @p nilcore_timer_alt.h is included instead. - */ -#if !defined(PORT_USE_ALT_TIMER) -#define PORT_USE_ALT_TIMER FALSE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -/** - * @brief Type of stack and memory alignment enforcement. - */ -typedef uint8_t stkalign_t; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching. - */ -struct port_intctx { - uint8_t _next; - uint8_t r29; - uint8_t r28; - uint8_t r17; - uint8_t r16; - uint8_t r15; - uint8_t r14; - uint8_t r13; - uint8_t r12; - uint8_t r11; - uint8_t r10; - uint8_t r9; - uint8_t r8; - uint8_t r7; - uint8_t r6; - uint8_t r5; - uint8_t r4; - uint8_t r3; - uint8_t r2; -#ifdef __AVR_3_BYTE_PC__ - uint8_t pcx; -#endif - uint8_t pcl; - uint8_t pch; -}; - -#endif /* !defined(_FROM_ASM_) */ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Platform dependent thread stack setup. - * @details This code usually setup the context switching frame represented - * by an @p port_intctx structure. - */ -#ifdef __AVR_3_BYTE_PC__ -#define PORT_SETUP_CONTEXT(tp, wend, pf, arg) { \ - (tp)->ctxp = (struct port_intctx*)(((uint8_t *)(wend)) - \ - sizeof(struct port_intctx)); \ - (tp)->ctxp->r2 = (int)pf; \ - (tp)->ctxp->r3 = (int)pf >> 8; \ - (tp)->ctxp->r4 = (int)arg; \ - (tp)->ctxp->r5 = (int)arg >> 8; \ - (tp)->ctxp->pcx = (int)0; \ - (tp)->ctxp->pcl = (int)_port_thread_start >> 8; \ - (tp)->ctxp->pch = (int)_port_thread_start; \ -} -#else /* __AVR_3_BYTE_PC__ */ -#define PORT_SETUP_CONTEXT(tp, wend, pf, arg) { \ - (tp)->ctxp = (struct port_intctx*)(((uint8_t *)(wend)) - \ - sizeof(struct port_intctx)); \ - (tp)->ctxp->r2 = (int)pf; \ - (tp)->ctxp->r3 = (int)pf >> 8; \ - (tp)->ctxp->r4 = (int)arg; \ - (tp)->ctxp->r5 = (int)arg >> 8; \ - (tp)->ctxp->pcl = (int)_port_thread_start >> 8; \ - (tp)->ctxp->pch = (int)_port_thread_start; \ -} -#endif /* __AVR_3_BYTE_PC__ */ -/** - * @brief Computes the thread working area global size. - * @note There is no need to perform alignments in this macro. - */ -#define PORT_WA_SIZE(n) ((sizeof(struct port_intctx) - 1) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - * @note This code tricks the compiler to save all the specified registers - * by "touching" them. - */ -#define PORT_IRQ_PROLOGUE() { \ - asm ("" : : : "r18", "r19", "r20", "r21", "r22", "r23", "r24", \ - "r25", "r26", "r27", "r30", "r31"); \ -} - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() chSchRescheduleS() - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) ISR(id) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) ISR(id) - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#define port_switch(ntp, otp) _port_switch(ntp, otp) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -#ifdef __cplusplus -extern "C" { -#endif - void _port_irq_epilogue(void); - void _port_switch(thread_t *ntp, thread_t *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* !defined(_FROM_ASM_) */ - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -/** - * @brief Port-related initialization code. - */ -static inline void port_init(void) { - -} - -/** - * @brief Returns a word encoding the current interrupts status. - * - * @return The interrupts status. - */ -static inline syssts_t port_get_irq_status(void) { - - return 0; -} - -/** - * @brief Checks the interrupt status. - * - * @param[in] sts the interrupt status word - * - * @return The interrupt status. - * @retvel false the word specified a disabled interrupts status. - * @retvel true the word specified an enabled interrupts status. - */ -static inline bool port_irq_enabled(syssts_t sts) { - - return false; -} - -/** - * @brief Determines the current execution context. - * - * @return The execution context. - * @retval false not running in ISR mode. - * @retval true running in ISR mode. - */ -static inline bool port_is_isr_context(void) { - - return false; -} - -/** - * @brief Kernel-lock action. - */ -static inline void port_lock(void) { - - asm volatile ("cli" : : : "memory"); -} - -/** - * @brief Kernel-unlock action. - */ -static inline void port_unlock(void) { - - asm volatile ("sei" : : : "memory"); -} - -/** - * @brief Kernel-lock action from an interrupt handler. - * @note This function is empty in this port. - */ -static inline void port_lock_from_isr(void) { - -} - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @note This function is empty in this port. - */ -static inline void port_unlock_from_isr(void) { - -} - -/** - * @brief Disables all the interrupt sources. - */ -static inline void port_disable(void) { - - asm volatile ("cli" : : : "memory"); -} - -/** - * @brief Disables the interrupt sources below kernel-level priority. - */ -static inline void port_suspend(void) { - - asm volatile ("cli" : : : "memory"); -} - -/** - * @brief Enables all the interrupt sources. - */ -static inline void port_enable(void) { - - asm volatile ("sei" : : : "memory"); -} - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - */ -static inline void port_wait_for_interrupt(void) { - - asm volatile ("sleep" : : : "memory"); -} - -/** - * @brief Returns the current value of the realtime counter. - * - * @return The realtime counter value. - */ -static inline rtcnt_t port_rt_get_counter_value(void) { - - return 0; -} - -#endif /* !defined(_FROM_ASM_) */ - -/*===========================================================================*/ -/* Module late inclusions. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -#if NIL_CFG_ST_TIMEDELTA > 0 -#if !PORT_USE_ALT_TIMER -#include "nilcore_timer.h" -#else /* PORT_USE_ALT_TIMER */ -#include "nilcore_timer_alt.h" -#endif /* PORT_USE_ALT_TIMER */ -#endif /* NIL_CFG_ST_TIMEDELTA > 0 */ - -#endif /* !defined(_FROM_ASM_) */ - -#endif /* _NILCORE_H_ */ - -/** @} */ diff --git a/os/nil/ports/AVR/nilcore_timer.h b/os/nil/ports/AVR/nilcore_timer.h deleted file mode 100644 index fc00cf50f..000000000 --- a/os/nil/ports/AVR/nilcore_timer.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/nilcore_timer.h - * @brief System timer header file. - * - * @addtogroup AVR_TIMER - * @{ - */ - -#ifndef _NILCORE_TIMER_H_ -#define _NILCORE_TIMER_H_ - -/* This is the only header in the HAL designed to be include-able alone.*/ -#include "st.h" - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief Starts the alarm. - * @note Makes sure that no spurious alarms are triggered after - * this call. - * - * @param[in] time the time to be set for the first alarm - * - * @notapi - */ -static inline void port_timer_start_alarm(systime_t time) { - - stStartAlarm(time); -} - -/** - * @brief Stops the alarm interrupt. - * - * @notapi - */ -static inline void port_timer_stop_alarm(void) { - - stStopAlarm(); -} - -/** - * @brief Sets the alarm time. - * - * @param[in] time the time to be set for the next alarm - * - * @notapi - */ -static inline void port_timer_set_alarm(systime_t time) { - - stSetAlarm(time); -} - -/** - * @brief Returns the system time. - * - * @return The system time. - * - * @notapi - */ -static inline systime_t port_timer_get_time(void) { - - return stGetCounter(); -} - -/** - * @brief Returns the current alarm time. - * - * @return The currently set alarm time. - * - * @notapi - */ -static inline systime_t port_timer_get_alarm(void) { - - return stGetAlarm(); -} - -#endif /* _NILCORE_TIMER_H_ */ - -/** @} */ diff --git a/os/nil/src/nil.c b/os/nil/src/nil.c deleted file mode 100644 index f680f1cd1..000000000 --- a/os/nil/src/nil.c +++ /dev/null @@ -1,832 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file nil.c - * @brief Nil RTOS main source file. - * - * @addtogroup NIL_KERNEL - * @{ - */ - -#include "nil.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/** - * @brief System data structures. - */ -nil_system_t nil; - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes the kernel. - * @details Initializes the kernel structures, the current instructions flow - * becomes the idle thread upon return. The idle thread must not - * invoke any kernel primitive able to change state to not runnable. - * @note This function assumes that the @p nil global variable has been - * zeroed by the runtime environment. If this is not the case then - * make sure to clear it before calling this function. - * - * @special - */ -void chSysInit(void) { - thread_t *tp; - const thread_config_t *tcp; - - /* Port layer initialization.*/ - port_init(); - - /* System initialization hook.*/ - NIL_CFG_SYSTEM_INIT_HOOK(); - - /* Iterates through the list of defined threads.*/ - tp = &nil.threads[0]; - tcp = nil_thd_configs; - while (tp < &nil.threads[NIL_CFG_NUM_THREADS]) { -#if NIL_CFG_ENABLE_STACK_CHECK - tp->stklim = (stkalign_t *)tcp->wbase; -#endif - - /* Port dependent thread initialization.*/ - PORT_SETUP_CONTEXT(tp, tcp->wend, tcp->funcp, tcp->arg); - - /* Initialization hook.*/ - NIL_CFG_THREAD_EXT_INIT_HOOK(tp); - - tp++; - tcp++; - } - -#if NIL_CFG_ENABLE_STACK_CHECK - /* The idle thread is a special case because its stack is set up by the - runtime environment.*/ - tp->stklim = THD_IDLE_BASE; -#endif - - /* Runs the highest priority thread, the current one becomes the idle - thread.*/ - nil.current = nil.next = nil.threads; - port_switch(nil.current, tp); - - /* Interrupts enabled for the idle thread.*/ - chSysEnable(); -} - -/** - * @brief Halts the system. - * @details This function is invoked by the operating system when an - * unrecoverable error is detected, for example because a programming - * error in the application code that triggers an assertion while - * in debug mode. - * @note Can be invoked from any system state. - * - * @param[in] reason pointer to an error string - * - * @special - */ -void chSysHalt(const char *reason) { - - port_disable(); - -#if NIL_DBG_ENABLED - nil.dbg_panic_msg = reason; -#else - (void)reason; -#endif - - NIL_CFG_SYSTEM_HALT_HOOK(reason); - - /* Harmless infinite loop.*/ - while (true) { - } -} - -/** - * @brief Time management handler. - * @note This handler has to be invoked by a periodic ISR in order to - * reschedule the waiting threads. - * - * @iclass - */ -void chSysTimerHandlerI(void) { - -#if NIL_CFG_ST_TIMEDELTA == 0 - thread_t *tp = &nil.threads[0]; - nil.systime++; - do { - /* Is the thread in a wait state with timeout?.*/ - if (tp->timeout > (systime_t)0) { - - chDbgAssert(!NIL_THD_IS_READY(tp), "is ready"); - - /* Did the timer reach zero?*/ - if (--tp->timeout == (systime_t)0) { - /* Timeout on semaphores requires a special handling because the - semaphore counter must be incremented.*/ - /*lint -save -e9013 [15.7] There is no else because it is not needed.*/ - if (NIL_THD_IS_WTSEM(tp)) { - tp->u1.semp->cnt++; - } - else if (NIL_THD_IS_SUSP(tp)) { - *tp->u1.trp = NULL; - } - /*lint -restore*/ - (void) chSchReadyI(tp, MSG_TIMEOUT); - } - } - /* Lock released in order to give a preemption chance on those - architectures supporting IRQ preemption.*/ - chSysUnlockFromISR(); - tp++; - chSysLockFromISR(); - } while (tp < &nil.threads[NIL_CFG_NUM_THREADS]); -#else - thread_t *tp = &nil.threads[0]; - systime_t next = (systime_t)0; - - chDbgAssert(nil.nexttime == port_timer_get_alarm(), "time mismatch"); - - do { - /* Is the thread in a wait state with timeout?.*/ - if (tp->timeout > (systime_t)0) { - - chDbgAssert(!NIL_THD_IS_READY(tp), "is ready"); - chDbgAssert(tp->timeout >= (nil.nexttime - nil.lasttime), "skipped one"); - - tp->timeout -= nil.nexttime - nil.lasttime; - if (tp->timeout == (systime_t)0) { - /* Timeout on semaphores requires a special handling because the - semaphore counter must be incremented.*/ - /*lint -save -e9013 [15.7] There is no else because it is not needed.*/ - if (NIL_THD_IS_WTSEM(tp)) { - tp->u1.semp->cnt++; - } - else if (NIL_THD_IS_SUSP(tp)) { - *tp->u1.trp = NULL; - } - /*lint -restore*/ - (void) chSchReadyI(tp, MSG_TIMEOUT); - } - else { - if (tp->timeout <= (systime_t)(next - (systime_t)1)) { - next = tp->timeout; - } - } - } - /* Lock released in order to give a preemption chance on those - architectures supporting IRQ preemption.*/ - chSysUnlockFromISR(); - tp++; - chSysLockFromISR(); - } while (tp < &nil.threads[NIL_CFG_NUM_THREADS]); - nil.lasttime = nil.nexttime; - if (next > (systime_t)0) { - nil.nexttime += next; - port_timer_set_alarm(nil.nexttime); - } - else { - /* No tick event needed.*/ - port_timer_stop_alarm(); - } -#endif -} - -/** - * @brief Unconditionally enters the kernel lock state. - * @note Can be called without previous knowledge of the current lock state. - * The final state is "s-locked". - * - * @special - */ -void chSysUnconditionalLock(void) { - - if (port_irq_enabled(port_get_irq_status())) { - chSysLock(); - } -} - -/** - * @brief Unconditionally leaves the kernel lock state. - * @note Can be called without previous knowledge of the current lock state. - * The final state is "normal". - * - * @special - */ -void chSysUnconditionalUnlock(void) { - - if (!port_irq_enabled(port_get_irq_status())) { - chSysUnlock(); - } -} - -/** - * @brief Returns the execution status and enters a critical zone. - * @details This functions enters into a critical zone and can be called - * from any context. Because its flexibility it is less efficient - * than @p chSysLock() which is preferable when the calling context - * is known. - * @post The system is in a critical zone. - * - * @return The previous system status, the encoding of this - * status word is architecture-dependent and opaque. - * - * @xclass - */ -syssts_t chSysGetStatusAndLockX(void) { - - syssts_t sts = port_get_irq_status(); - if (port_irq_enabled(sts)) { - if (port_is_isr_context()) { - chSysLockFromISR(); - } - else { - chSysLock(); - } - } - return sts; -} - -/** - * @brief Restores the specified execution status and leaves a critical zone. - * @note A call to @p chSchRescheduleS() is automatically performed - * if exiting the critical zone and if not in ISR context. - * - * @param[in] sts the system status to be restored. - * - * @xclass - */ -void chSysRestoreStatusX(syssts_t sts) { - - if (port_irq_enabled(sts)) { - if (port_is_isr_context()) { - chSysUnlockFromISR(); - } - else { - chSchRescheduleS(); - chSysUnlock(); - } - } -} - -#if (PORT_SUPPORTS_RT == TRUE) || defined(__DOXYGEN__) -/** - * @brief Realtime window test. - * @details This function verifies if the current realtime counter value - * lies within the specified range or not. The test takes care - * of the realtime counter wrapping to zero on overflow. - * @note When start==end then the function returns always true because the - * whole time range is specified. - * @note This function is only available if the port layer supports the - * option @p PORT_SUPPORTS_RT. - * - * @param[in] cnt the counter value to be tested - * @param[in] start the start of the time window (inclusive) - * @param[in] end the end of the time window (non inclusive) - * @retval true current time within the specified time window. - * @retval false current time not within the specified time window. - * - * @xclass - */ -bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end) { - - return (bool)((cnt - start) < (end - start)); -} - -/** - * @brief Polled delay. - * @note The real delay is always few cycles in excess of the specified - * value. - * @note This function is only available if the port layer supports the - * option @p PORT_SUPPORTS_RT. - * - * @param[in] cycles number of cycles - * - * @xclass - */ -void chSysPolledDelayX(rtcnt_t cycles) { - rtcnt_t start = chSysGetRealtimeCounterX(); - rtcnt_t end = start + cycles; - - while (chSysIsCounterWithinX(chSysGetRealtimeCounterX(), start, end)) { - } -} -#endif /* PORT_SUPPORTS_RT == TRUE */ - -/** - * @brief Makes the specified thread ready for execution. - * - * @param[in] tp pointer to the @p thread_t object - * @param[in] msg the wakeup message - * - * @return The same reference passed as parameter. - */ -thread_t *chSchReadyI(thread_t *tp, msg_t msg) { - - chDbgAssert((tp >= nil.threads) && - (tp < &nil.threads[NIL_CFG_NUM_THREADS]), - "pointer out of range"); - chDbgAssert(!NIL_THD_IS_READY(tp), "already ready"); - chDbgAssert(nil.next <= nil.current, "priority ordering"); - - tp->u1.msg = msg; - tp->state = NIL_STATE_READY; - tp->timeout = (systime_t)0; - if (tp < nil.next) { - nil.next = tp; - } - return tp; -} - -/** - * @brief Reschedules if needed. - * - * @sclass - */ -void chSchRescheduleS(void) { - - if (chSchIsRescRequiredI()) { - thread_t *otp = nil.current; - - nil.current = nil.next; - if (otp == &nil.threads[NIL_CFG_NUM_THREADS]) { - NIL_CFG_IDLE_LEAVE_HOOK(); - } - port_switch(nil.next, otp); - } -} - -/** - * @brief Puts the current thread to sleep into the specified state with - * timeout specification. - * @details The thread goes into a sleeping state, if it is not awakened - * explicitly within the specified system time then it is forcibly - * awakened with a @p NIL_MSG_TMO low level message. - * - * @param[in] newstate the new thread state or a semaphore pointer - * @param[in] timeout the number of ticks before the operation timeouts. - * the following special values are allowed: - * - @a TIME_INFINITE no timeout. - * . - * @return The wakeup message. - * @retval NIL_MSG_TMO if a timeout occurred. - * - * @sclass - */ -msg_t chSchGoSleepTimeoutS(tstate_t newstate, systime_t timeout) { - thread_t *ntp, *otp = nil.current; - - chDbgAssert(otp != &nil.threads[NIL_CFG_NUM_THREADS], - "idle cannot sleep"); - - /* Storing the wait object for the current thread.*/ - otp->state = newstate; - -#if NIL_CFG_ST_TIMEDELTA > 0 - if (timeout != TIME_INFINITE) { - systime_t abstime; - - /* TIMEDELTA makes sure to have enough time to reprogram the timer - before the free-running timer counter reaches the selected timeout.*/ - if (timeout < (systime_t)NIL_CFG_ST_TIMEDELTA) { - timeout = (systime_t)NIL_CFG_ST_TIMEDELTA; - } - - /* Absolute time of the timeout event.*/ - abstime = chVTGetSystemTimeX() + timeout; - - if (nil.lasttime == nil.nexttime) { - /* Special case, first thread asking for a timeout.*/ - port_timer_start_alarm(abstime); - nil.nexttime = abstime; - } - else { - /* Special case, there are already other threads with a timeout - activated, evaluating the order.*/ - if (chVTIsTimeWithinX(abstime, nil.lasttime, nil.nexttime)) { - port_timer_set_alarm(abstime); - nil.nexttime = abstime; - } - } - - /* Timeout settings.*/ - otp->timeout = abstime - nil.lasttime; - } -#else - - /* Timeout settings.*/ - otp->timeout = timeout; -#endif - - /* Scanning the whole threads array.*/ - ntp = nil.threads; - while (true) { - /* Is this thread ready to execute?*/ - if (NIL_THD_IS_READY(ntp)) { - nil.current = nil.next = ntp; - if (ntp == &nil.threads[NIL_CFG_NUM_THREADS]) { - NIL_CFG_IDLE_ENTER_HOOK(); - } - port_switch(ntp, otp); - return nil.current->u1.msg; - } - - /* Points to the next thread in lowering priority order.*/ - ntp++; - chDbgAssert(ntp <= &nil.threads[NIL_CFG_NUM_THREADS], - "pointer out of range"); - } -} - -/** - * @brief Sends the current thread sleeping and sets a reference variable. - * @note This function must reschedule, it can only be called from thread - * context. - * - * @param[in] trp a pointer to a thread reference object - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_INFINITE no timeout. - * . - * @return The wake up message. - * - * @sclass - */ -msg_t chThdSuspendTimeoutS(thread_reference_t *trp, systime_t timeout) { - - chDbgAssert(*trp == NULL, "not NULL"); - - *trp = nil.current; - nil.current->u1.trp = trp; - return chSchGoSleepTimeoutS(NIL_STATE_SUSP, timeout); -} - -/** - * @brief Wakes up a thread waiting on a thread reference object. - * @note This function must not reschedule because it can be called from - * ISR context. - * - * @param[in] trp a pointer to a thread reference object - * @param[in] msg the message code - * - * @iclass - */ -void chThdResumeI(thread_reference_t *trp, msg_t msg) { - - if (*trp != NULL) { - thread_reference_t tr = *trp; - - chDbgAssert(NIL_THD_IS_SUSP(tr), "not suspended"); - - *trp = NULL; - (void) chSchReadyI(tr, msg); - } -} - -/** - * @brief Suspends the invoking thread for the specified time. - * - * @param[in] timeout the delay in system ticks - * - * @api - */ -void chThdSleep(systime_t timeout) { - - chSysLock(); - chThdSleepS(timeout); - chSysUnlock(); -} - -/** - * @brief Suspends the invoking thread until the system time arrives to the - * specified value. - * - * @param[in] abstime absolute system time - * - * @api - */ -void chThdSleepUntil(systime_t abstime) { - - chSysLock(); - chThdSleepUntilS(abstime); - chSysUnlock(); -} - -/** - * @brief Performs a wait operation on a semaphore with timeout specification. - * - * @param[in] sp pointer to a @p semaphore_t structure - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return A message specifying how the invoking thread has been - * released from the semaphore. - * @retval NIL_MSG_OK if the thread has not stopped on the semaphore or the - * semaphore has been signaled. - * @retval NIL_MSG_RST if the semaphore has been reset using @p chSemReset(). - * @retval NIL_MSG_TMO if the semaphore has not been signaled or reset within - * the specified timeout. - * - * @api - */ -msg_t chSemWaitTimeout(semaphore_t *sp, systime_t timeout) { - msg_t msg; - - chSysLock(); - msg = chSemWaitTimeoutS(sp, timeout); - chSysUnlock(); - - return msg; -} - -/** - * @brief Performs a wait operation on a semaphore with timeout specification. - * - * @param[in] sp pointer to a @p semaphore_t structure - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return A message specifying how the invoking thread has been - * released from the semaphore. - * @retval NIL_MSG_OK if the thread has not stopped on the semaphore or the - * semaphore has been signaled. - * @retval NIL_MSG_RST if the semaphore has been reset using @p chSemReset(). - * @retval NIL_MSG_TMO if the semaphore has not been signaled or reset within - * the specified timeout. - * - * @sclass - */ -msg_t chSemWaitTimeoutS(semaphore_t *sp, systime_t timeout) { - - /* Note, the semaphore counter is a volatile variable so accesses are - manually optimized.*/ - cnt_t cnt = sp->cnt; - if (cnt <= (cnt_t)0) { - if (TIME_IMMEDIATE == timeout) { - return MSG_TIMEOUT; - } - sp->cnt = cnt - (cnt_t)1; - nil.current->u1.semp = sp; - return chSchGoSleepTimeoutS(NIL_STATE_WTSEM, timeout); - } - sp->cnt = cnt - (cnt_t)1; - return MSG_OK; -} - -/** - * @brief Performs a signal operation on a semaphore. - * - * @param[in] sp pointer to a @p semaphore_t structure - * - * @api - */ -void chSemSignal(semaphore_t *sp) { - - chSysLock(); - chSemSignalI(sp); - chSchRescheduleS(); - chSysUnlock(); -} - -/** - * @brief Performs a signal operation on a semaphore. - * @post This function does not reschedule so a call to a rescheduling - * function must be performed before unlocking the kernel. Note that - * interrupt handlers always reschedule on exit so an explicit - * reschedule must not be performed in ISRs. - * - * @param[in] sp pointer to a @p semaphore_t structure - * - * @iclass - */ -void chSemSignalI(semaphore_t *sp) { - - if (++sp->cnt <= (cnt_t)0) { - thread_reference_t tr = nil.threads; - while (true) { - /* Is this thread waiting on this semaphore?*/ - if (tr->u1.semp == sp) { - - chDbgAssert(NIL_THD_IS_WTSEM(tr), "not waiting"); - - (void) chSchReadyI(tr, MSG_OK); - return; - } - tr++; - - chDbgAssert(tr < &nil.threads[NIL_CFG_NUM_THREADS], - "pointer out of range"); - } - } -} - -/** - * @brief Performs a reset operation on the semaphore. - * @post After invoking this function all the threads waiting on the - * semaphore, if any, are released and the semaphore counter is set - * to the specified, non negative, value. - * - * @param[in] sp pointer to a @p semaphore_t structure - * @param[in] n the new value of the semaphore counter. The value must - * be non-negative. - * - * @api - */ -void chSemReset(semaphore_t *sp, cnt_t n) { - - chSysLock(); - chSemResetI(sp, n); - chSchRescheduleS(); - chSysUnlock(); -} - -/** - * @brief Performs a reset operation on the semaphore. - * @post After invoking this function all the threads waiting on the - * semaphore, if any, are released and the semaphore counter is set - * to the specified, non negative, value. - * @post This function does not reschedule so a call to a rescheduling - * function must be performed before unlocking the kernel. Note that - * interrupt handlers always reschedule on exit so an explicit - * reschedule must not be performed in ISRs. - * - * @param[in] sp pointer to a @p semaphore_t structure - * @param[in] n the new value of the semaphore counter. The value must - * be non-negative. - * - * @iclass - */ -void chSemResetI(semaphore_t *sp, cnt_t n) { - thread_t *tp; - cnt_t cnt; - - cnt = sp->cnt; - sp->cnt = n; - tp = nil.threads; - while (cnt < (cnt_t)0) { - - chDbgAssert(tp < &nil.threads[NIL_CFG_NUM_THREADS], - "pointer out of range"); - - /* Is this thread waiting on this semaphore?*/ - if (tp->u1.semp == sp) { - - chDbgAssert(NIL_THD_IS_WTSEM(tp), "not waiting"); - - cnt++; - (void) chSchReadyI(tp, MSG_RESET); - } - tp++; - } -} - -#if (NIL_CFG_USE_EVENTS == TRUE) || defined(__DOXYGEN__) -/** - * @brief Adds a set of event flags directly to the specified @p thread_t. - * - * @param[in] tp the thread to be signaled - * @param[in] mask the event flags set to be ORed - * - * @api - */ -void chEvtSignal(thread_t *tp, eventmask_t mask) { - - chSysLock(); - chEvtSignalI(tp, mask); - chSchRescheduleS(); - chSysUnlock(); -} - -/** - * @brief Adds a set of event flags directly to the specified @p thread_t. - * @post This function does not reschedule so a call to a rescheduling - * function must be performed before unlocking the kernel. Note that - * interrupt handlers always reschedule on exit so an explicit - * reschedule must not be performed in ISRs. - * - * @param[in] tp the thread to be signaled - * @param[in] mask the event flags set to be ORed - * - * @iclass - */ -void chEvtSignalI(thread_t *tp, eventmask_t mask) { - - tp->epmask |= mask; - if (NIL_THD_IS_WTOREVT(tp) && - ((tp->epmask & tp->u1.ewmask) != (eventmask_t)0)) { - (void) chSchReadyI(tp, MSG_OK); - } -} - -/** - * @brief Waits for any of the specified events. - * @details The function waits for any event among those specified in - * @p mask to become pending then the events are cleared and - * returned. - * - * @param[in] mask mask of the event flags that the function should wait - * for, @p ALL_EVENTS enables all the events - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return The mask of the served and cleared events. - * @retval 0 if the operation has timed out. - * - * @api - */ -eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout) { - eventmask_t m; - - chSysLock(); - m = chEvtWaitAnyTimeoutS(mask, timeout); - chSysUnlock(); - - return m; -} - -/** - * @brief Waits for any of the specified events. - * @details The function waits for any event among those specified in - * @p mask to become pending then the events are cleared and - * returned. - * - * @param[in] mask mask of the event flags that the function should wait - * for, @p ALL_EVENTS enables all the events - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_IMMEDIATE immediate timeout. - * - @a TIME_INFINITE no timeout. - * . - * @return The mask of the served and cleared events. - * @retval 0 if the operation has timed out. - * - * @sclass - */ -eventmask_t chEvtWaitAnyTimeoutS(eventmask_t mask, systime_t timeout) { - thread_t *ctp = nil.current; - eventmask_t m; - - if ((m = (ctp->epmask & mask)) == (eventmask_t)0) { - if (TIME_IMMEDIATE == timeout) { - chSysUnlock(); - - return (eventmask_t)0; - } - ctp->u1.ewmask = mask; - if (chSchGoSleepTimeoutS(NIL_STATE_WTOREVT, timeout) < MSG_OK) { - chSysUnlock(); - - return (eventmask_t)0; - } - m = ctp->epmask & mask; - } - ctp->epmask &= ~m; - - return m; -} -#endif /* NIL_CFG_USE_EVENTS == TRUE */ - -/** @} */ diff --git a/os/nil/templates/nilconf.h b/os/nil/templates/nilconf.h deleted file mode 100644 index c89fd61aa..000000000 --- a/os/nil/templates/nilconf.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file nilconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup NIL_CONFIG - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _NILCONF_H_ -#define _NILCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of user threads in the application. - * @note This number is not inclusive of the idle thread which is - * Implicitly handled. - */ -#define NIL_CFG_NUM_THREADS 1 - -/** @} */ - -/*===========================================================================*/ -/** - * @name System timer settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#define NIL_CFG_ST_RESOLUTION 32 - -/** - * @brief System tick frequency. - * @note This value together with the @p NIL_CFG_ST_RESOLUTION - * option defines the maximum amount of time allowed for - * timeouts. - */ -#define NIL_CFG_ST_FREQUENCY 50000 - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#define NIL_CFG_ST_TIMEDELTA 2 - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#define NIL_CFG_USE_EVENTS TRUE - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System assertions. - */ -#define NIL_CFG_ENABLE_ASSERTS FALSE - -/** - * @brief Stack check. - */ -#define NIL_CFG_ENABLE_STACK_CHECK FALSE - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System initialization hook. - */ -#if !defined(NIL_CFG_SYSTEM_INIT_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_SYSTEM_INIT_HOOK() { \ -} -#endif - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define NIL_CFG_THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - */ -#define NIL_CFG_THREAD_EXT_INIT_HOOK(tr) { \ - /* Add custom threads initialization code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define NIL_CFG_IDLE_ENTER_HOOK() { \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define NIL_CFG_IDLE_LEAVE_HOOK() { \ -} - -/** - * @brief System halt hook. - */ -#if !defined(NIL_CFG_SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_SYSTEM_HALT_HOOK(reason) { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in nilcore.h). */ -/*===========================================================================*/ - -#endif /* _NILCONF_H_ */ - -/** @} */ diff --git a/os/nil/templates/nilcore.c b/os/nil/templates/nilcore.c deleted file mode 100644 index 7bbb020fa..000000000 --- a/os/nil/templates/nilcore.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/nilcore.c - * @brief Port code. - * - * @addtogroup NIL_CORE - * @{ - */ - -#include "nil.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** @} */ diff --git a/os/nil/templates/nilcore.h b/os/nil/templates/nilcore.h deleted file mode 100644 index 1aad42ddc..000000000 --- a/os/nil/templates/nilcore.h +++ /dev/null @@ -1,379 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/nilcore.h - * @brief Port macros and structures. - * - * @addtogroup NIL_CORE - * @{ - */ - -#ifndef _NILCORE_H_ -#define _NILCORE_H_ - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @name Architecture and Compiler - * @{ - */ -/** - * @brief Macro defining the port architecture. - */ -#define PORT_ARCHITECTURE_XXX - -/** - * @brief Name of the implemented architecture. - */ -#define PORT_ARCHITECTURE_NAME "XXX" - -/** - * @brief Name of the architecture variant. - */ -#define PORT_CORE_VARIANT_NAME "XXXX-Y" - -/** - * @brief Compiler name and version. - */ -#if defined(__GNUC__) || defined(__DOXYGEN__) -#define PORT_COMPILER_NAME "GCC " __VERSION__ - -#else -#error "unsupported compiler" -#endif - -/** - * @brief Port-specific information string. - */ -#define PORT_INFO "port description" - -/** - * @brief This port supports a realtime counter. - */ -#define PORT_SUPPORTS_RT FALSE -/** @} */ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - */ -#if !defined(PORT_INT_REQUIRED_STACK) || defined(__DOXYGEN__) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables an alternative timer implementation. - * @details Usually the port uses a timer interface defined in the file - * @p nilcore_timer.h, if this option is enabled then the file - * @p nilcore_timer_alt.h is included instead. - */ -#if !defined(PORT_USE_ALT_TIMER) -#define PORT_USE_ALT_TIMER FALSE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -/** - * @brief Type of stack and memory alignment enforcement. - */ -typedef uint64_t stkalign_t; - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - */ -struct port_extctx { - uint32_t reg1; - uint32_t reg2; -}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switch. - */ -struct port_intctx { - uint32_t reg3; - uint32_t reg4; -}; - -#endif /* !defined(_FROM_ASM_) */ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Platform dependent thread stack setup. - * @details This code usually setup the context switching frame represented - * by an @p port_intctx structure. - */ -#define PORT_SETUP_CONTEXT(tp, wend, pf, arg) do { \ - (void)(tp); \ - (void)(wend); \ - (void)(pf); \ - (void)(arg); \ -} while (false) - -/** - * @brief Computes the thread working area global size. - * @note There is no need to perform alignments in this macro. - */ -#define PORT_WA_SIZE(n) (sizeof(struct port_intctx) + \ - sizeof(struct port_extctx) + \ - (size_t)(n) + \ - (size_t)(PORT_INT_REQUIRED_STACK)) - -/** - * @brief Priority level verification macro. - */ -#define PORT_IRQ_IS_VALID_PRIORITY(n) false - -/** - * @brief Priority level verification macro. - */ -#define PORT_IRQ_IS_VALID_KERNEL_PRIORITY(n) false - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue() - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#define port_switch(ntp, otp) do { \ - (void)ntp; \ - (void)otp; \ - /*_port_switch(ntp, otp)*/ \ -} while (false) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -#ifdef __cplusplus -extern "C" { -#endif - void _port_irq_epilogue(void); - void _port_switch(thread_t *ntp, thread_t *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* !defined(_FROM_ASM_) */ - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -/** - * @brief Port-related initialization code. - */ -static inline void port_init(void) { - -} - -/** - * @brief Returns a word encoding the current interrupts status. - * - * @return The interrupts status. - */ -static inline syssts_t port_get_irq_status(void) { - - return (syssts_t)0; -} - -/** - * @brief Checks the interrupt status. - * - * @param[in] sts the interrupt status word - * - * @return The interrupt status. - * @retval false the word specified a disabled interrupts status. - * @retval true the word specified an enabled interrupts status. - */ -static inline bool port_irq_enabled(syssts_t sts) { - - (void)sts; - - return false; -} - -/** - * @brief Determines the current execution context. - * - * @return The execution context. - * @retval false not running in ISR mode. - * @retval true running in ISR mode. - */ -static inline bool port_is_isr_context(void) { - - return false; -} - -/** - * @brief Kernel-lock action. - */ -static inline void port_lock(void) { - -} - -/** - * @brief Kernel-unlock action. - */ -static inline void port_unlock(void) { - -} - -/** - * @brief Kernel-lock action from an interrupt handler. - */ -static inline void port_lock_from_isr(void) { - -} - -/** - * @brief Kernel-unlock action from an interrupt handler. - */ -static inline void port_unlock_from_isr(void) { - -} - -/** - * @brief Disables all the interrupt sources. - */ -static inline void port_disable(void) { - -} - -/** - * @brief Disables the interrupt sources below kernel-level priority. - */ -static inline void port_suspend(void) { - -} - -/** - * @brief Enables all the interrupt sources. - */ -static inline void port_enable(void) { - -} - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - */ -static inline void port_wait_for_interrupt(void) { - -} - -/** - * @brief Returns the current value of the realtime counter. - * - * @return The realtime counter value. - */ -static inline rtcnt_t port_rt_get_counter_value(void) { - - return (rtcnt_t)0; -} - -#endif /* !defined(_FROM_ASM_) */ - -/*===========================================================================*/ -/* Module late inclusions. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -#if NIL_CFG_ST_TIMEDELTA > 0 -#if PORT_USE_ALT_TIMER == FALSE -#include "nilcore_timer.h" -#else -#include "nilcore_timer_alt.h" -#endif -#endif /* NIL_CFG_ST_TIMEDELTA > 0 */ - -#endif /* !defined(_FROM_ASM_) */ - -#endif /* _NILCORE_H_ */ - -/** @} */ diff --git a/os/nil/templates/nilcore_timer.h b/os/nil/templates/nilcore_timer.h deleted file mode 100644 index 6eab4dd40..000000000 --- a/os/nil/templates/nilcore_timer.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/nilcore_timer.h - * @brief System timer header file. - * - * @addtogroup NIL_TIMER - * @{ - */ - -#ifndef _NILCORE_TIMER_H_ -#define _NILCORE_TIMER_H_ - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief Starts the alarm. - * @note Makes sure that no spurious alarms are triggered after - * this call. - * - * @param[in] abstime the time to be set for the first alarm - * - * @notapi - */ -static inline void port_timer_start_alarm(systime_t abstime) { - - (void)abstime; -} - -/** - * @brief Stops the alarm interrupt. - * - * @notapi - */ -static inline void port_timer_stop_alarm(void) { - -} - -/** - * @brief Sets the alarm time. - * - * @param[in] abstime the time to be set for the next alarm - * - * @notapi - */ -static inline void port_timer_set_alarm(systime_t abstime) { - - (void)abstime; -} - -/** - * @brief Returns the system time. - * - * @return The system time. - * - * @notapi - */ -static inline systime_t port_timer_get_time(void) { - - return (systime_t)0; -} - -/** - * @brief Returns the current alarm time. - * - * @return The currently set alarm time. - * - * @notapi - */ -static inline systime_t port_timer_get_alarm(void) { - - return (systime_t)0; -} - -#endif /* _NILCORE_TIMER_H_ */ - -/** @} */ diff --git a/os/nil/templates/niltypes.h b/os/nil/templates/niltypes.h deleted file mode 100644 index 16043831b..000000000 --- a/os/nil/templates/niltypes.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS 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. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/niltypes.h - * @brief Port system types. - * - * @addtogroup NIL_TYPES - * @{ - */ - -#ifndef _NILTYPES_H_ -#define _NILTYPES_H_ - -#include -#include -#include - -/** - * @name Common constants - */ -/** - * @brief Generic 'false' boolean constant. - */ -#if !defined(FALSE) || defined(__DOXYGEN__) -#define FALSE 0 -#endif - -/** - * @brief Generic 'true' boolean constant. - */ -#if !defined(TRUE) || defined(__DOXYGEN__) -#define TRUE 1 -#endif -/** @} */ - -typedef uint32_t syssts_t; /**< System status word. */ -typedef uint32_t rtcnt_t; /**< Realtime counter. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef int32_t msg_t; /**< Inter-thread message. */ -typedef uint32_t eventmask_t; /**< Mask of event identifiers. */ -typedef int32_t cnt_t; /**< Generic signed counter. */ -typedef uint32_t ucnt_t; /**< Generic unsigned counter. */ - -/** - * @brief Type of system time. - */ -#if (NIL_CFG_ST_RESOLUTION == 32) || defined(__DOXYGEN__) -typedef uint32_t systime_t; -#else -typedef uint16_t systime_t; -#endif - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Makes functions not inlineable. - * @note If the compiler does not support such attribute then the - * realtime counter precision could be degraded. - */ -#define NOINLINE __attribute__((noinline)) - -/** - * @brief Optimized thread function declaration macro. - */ -#define PORT_THD_FUNCTION(tname, arg) \ - __attribute__((noreturn)) void tname(void *arg) - -/** - * @brief Packed variable specifier. - */ -#define PACKED_VAR __attribute__((packed)) - -#endif /* _NILTYPES_H_ */ - -/** @} */ diff --git a/test/nil/test.mk b/test/nil/test.mk deleted file mode 100644 index b0da9731a..000000000 --- a/test/nil/test.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the ChibiOS/RT test files. -TESTSRC = ${CHIBIOS}/test/lib/ch_test.c \ - ${CHIBIOS}/test/nil/test_root.c \ - ${CHIBIOS}/test/nil/test_sequence_001.c \ - ${CHIBIOS}/test/nil/test_sequence_002.c - -# Required include directories -TESTINC = ${CHIBIOS}/test/lib \ - ${CHIBIOS}/test/nil diff --git a/test/nil/test_root.c b/test/nil/test_root.c deleted file mode 100644 index 12ae7ef52..000000000 --- a/test/nil/test_root.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file test_root.c - * @brief Test Suite root structures code. - * - * @addtogroup CH_TEST_ROOT - * @{ - */ - -#include "hal.h" -#include "ch_test.h" -#include "test_root.h" - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/** - * @brief Array of all the test sequences. - */ -const testcase_t * const *test_suite[] = { - test_sequence_001, - test_sequence_002, - NULL -}; - -/*===========================================================================*/ -/* Shared code. */ -/*===========================================================================*/ - -semaphore_t gsem1, gsem2; -thread_reference_t gtr1; - -/* - * Support thread. - */ -THD_WORKING_AREA(wa_test_support, 128); -THD_FUNCTION(test_support, arg) { -#if NIL_CFG_USE_EVENTS == TRUE - thread_t *tp = (thread_t *)arg; -#else - (void)arg; -#endif - - /* Initializing global resources.*/ - chSemObjectInit(&gsem1, 0); - chSemObjectInit(&gsem2, 0); - - /* Waiting for button push and activation of the test suite.*/ - while (true) { - chSysLock(); - if (chSemGetCounterI(&gsem1) < 0) - chSemSignalI(&gsem1); - chSemResetI(&gsem2, 0); - chThdResumeI(>r1, MSG_OK); -#if NIL_CFG_USE_EVENTS == TRUE - chEvtSignalI(tp, 0x55); -#endif - chSchRescheduleS(); - chSysUnlock(); - - chThdSleepMilliseconds(250); - } -} - -/** @} */ diff --git a/test/nil/test_root.h b/test/nil/test_root.h deleted file mode 100644 index 34f776494..000000000 --- a/test/nil/test_root.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file test_root.h - * @brief Test Suite root structures header. - * - * @addtogroup CH_TEST_ROOT - * @{ - */ - -#ifndef _TEST_ROOT_H_ -#define _TEST_ROOT_H_ - -#include "nil.h" - -#include "test_sequence_001.h" -#include "test_sequence_002.h" - -/*===========================================================================*/ -/* Default definitions. */ -/*===========================================================================*/ - -/* Global test suite name, it is printed on top of the test - report header.*/ -#define TEST_SUITE_NAME "ChibiOS/NIL Test Suite" - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -extern const testcase_t * const *test_suite[]; - -#ifdef __cplusplus -extern "C" { -#endif - extern semaphore_t gsem1, gsem2; - extern thread_reference_t gtr1; - extern THD_WORKING_AREA(wa_test_support, 128); - THD_FUNCTION(test_support, arg); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Shared definitions. */ -/*===========================================================================*/ - -#endif /* _TEST_ROOT_H_ */ - -/** @} */ diff --git a/test/nil/test_sequence_001.c b/test/nil/test_sequence_001.c deleted file mode 100644 index 134d7b96e..000000000 --- a/test/nil/test_sequence_001.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "hal.h" -#include "ch_test.h" -#include "test_root.h" - -/** - * @page test_sequence_001 Threads Functionality - * - * File: @ref test_sequence_001.c - * - *

Description

- * This sequence tests the ChibiOS/NIL functionalities related to threading. - * - *

Test Cases

- * - @subpage test_001_001 - * - @subpage test_001_002 - * . - */ - -/**************************************************************************** - * Shared code. - ****************************************************************************/ - - -/**************************************************************************** - * Test cases. - ****************************************************************************/ - -#if TRUE || defined(__DOXYGEN__) -/** - * @page test_001_001 System Tick Counter functionality - * - *

Description

- * The functionality of the API @p chVTGetSystemTimeX() is tested. - * - *

Conditions

- * None. - * - *

Test Steps

- * - A System Tick Counter increment is expected, the test simply hangs if - * it does not happen. - * . - */ - -static void test_001_001_execute(void) { - systime_t time; - - /* A System Tick Counter increment is expected, the test simply hangs if - it does not happen.*/ - test_set_step(1); - { - time = chVTGetSystemTimeX(); - while (time == chVTGetSystemTimeX()) { - } - } -} - -static const testcase_t test_001_001 = { - "System Tick Counter functionality", - NULL, - NULL, - test_001_001_execute -}; -#endif /* TRUE */ - -#if TRUE || defined(__DOXYGEN__) -/** - * @page test_001_002 Thread Sleep functionality - * - *

Description

- * The functionality of the API @p chThdSleep() and derivatives is tested. - * - *

Conditions

- * None. - * - *

Test Steps

- * - The current system time is read then a sleep is performed for 100 system - * ticks and on exit the system time is verified again. - * - The current system time is read then a sleep is performed for 100000 - * microseconds and on exit the system time is verified again. - * - The current system time is read then a sleep is performed for 100 - * milliseconds and on exit the system time is verified again. - * - The current system time is read then a sleep is performed for 1 - * second and on exit the system time is verified again. - * . - */ - -static void test_001_002_execute(void) { - systime_t time; - - /* The current system time is read then a sleep is performed for 100 system - ticks and on exit the system time is verified again.*/ - test_set_step(1); - { - time = chVTGetSystemTimeX(); - chThdSleep(100); - test_assert_time_window(time + 100, - time + 100 + 1, - "out of time window"); - } - - /* The current system time is read then a sleep is performed for 100000 - microseconds and on exit the system time is verified again.*/ - test_set_step(2); - { - time = chVTGetSystemTimeX(); - chThdSleepMicroseconds(100); - test_assert_time_window(time + US2ST(100), - time + US2ST(100) + 1, - "out of time window"); - } - - /* The current system time is read then a sleep is performed for 100 - milliseconds and on exit the system time is verified again.*/ - test_set_step(3); - { - time = chVTGetSystemTimeX(); - chThdSleepMilliseconds(100); - test_assert_time_window(time + MS2ST(100), - time + MS2ST(100) + 1, - "out of time window"); - } - - /* The current system time is read then a sleep is performed for 1 - second and on exit the system time is verified again.*/ - test_set_step(4); - { - time = chVTGetSystemTimeX(); - chThdSleepSeconds(1); - test_assert_time_window(time + S2ST(1), - time + S2ST(1) + 1, - "out of time window"); - } - - test_set_step(5); - { - time = chVTGetSystemTimeX(); - chThdSleepUntil(time + 100); - test_assert_time_window(time + 100, - time + 100 + 1, - "out of time window"); - } -} - -static const testcase_t test_001_002 = { - "Thread Sleep functionality", - NULL, - NULL, - test_001_002_execute -}; -#endif /* TRUE */ - - /**************************************************************************** - * Exported data. - ****************************************************************************/ - -/** - * @brief Sequence brief description. - */ -const testcase_t * const test_sequence_001[] = { -#if TRUE || defined(__DOXYGEN__) - &test_001_001, -#endif -#if TRUE || defined(__DOXYGEN__) - &test_001_002, -#endif - NULL -}; diff --git a/test/nil/test_sequence_001.h b/test/nil/test_sequence_001.h deleted file mode 100644 index 91c2181d0..000000000 --- a/test/nil/test_sequence_001.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _TEST_SEQUENCE_001_H_ -#define _TEST_SEQUENCE_001_H_ - -extern const testcase_t * const test_sequence_001[]; - -#endif /* _TEST_SEQUENCE_001_H_ */ diff --git a/test/nil/test_sequence_002.c b/test/nil/test_sequence_002.c deleted file mode 100644 index 7b1d41d64..000000000 --- a/test/nil/test_sequence_002.c +++ /dev/null @@ -1,437 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "hal.h" -#include "ch_test.h" -#include "test_root.h" - -/** - * @page test_sequence_002 Synchronization primitives - * - * File: @ref test_sequence_002.c - * - *

Description

- * This sequence tests the ChibiOS/NIL functionalities related to - * threads synchronization. - * - *

Test Cases

- * - @subpage test_002_001 - * - @subpage test_002_002 - * . - */ - -/**************************************************************************** - * Shared code. - ****************************************************************************/ - -static semaphore_t sem1; -static thread_reference_t tr1; - -/**************************************************************************** - * Test cases. - ****************************************************************************/ - -#if TRUE || defined(__DOXYGEN__) -/** - * @page test_002_001 Semaphore primitives, no state change - * - *

Description

- * Wait, Signal and Reset primitives are tested. The testing thread does not - * trigger a state change. - * - *

Conditions

- * None. - * - *

Test Steps

- * - The function chSemWait() is invoked, after return the counter and - * the returned message are tested. - * - The function chSemSignal() is invoked, after return the counter - * is tested. - * - The function chSemReset() is invoked, after return the counter - * is tested. - * . - */ - -static void test_002_001_setup(void) { - - chSemObjectInit(&sem1, 1); -} - -static void test_002_001_teardown(void) { - - chSemReset(&sem1, 0); -} - -static void test_002_001_execute(void) { - - /* The function chSemWait() is invoked, after return the counter and - the returned message are tested.*/ - test_set_step(1); - { - msg_t msg; - - msg = chSemWait(&sem1); - test_assert_lock(chSemGetCounterI(&sem1) == 0, - "wrong counter value"); - test_assert(MSG_OK == msg, - "wrong returned message"); - } - - /* The function chSemSignal() is invoked, after return the counter - is tested.*/ - test_set_step(2); - { - chSemSignal(&sem1); - test_assert_lock(chSemGetCounterI(&sem1) == 1, - "wrong counter value"); - } - - /* The function chSemReset() is invoked, after return the counter - is tested.*/ - test_set_step(3); - { - chSemReset(&sem1, 2); - test_assert_lock(chSemGetCounterI(&sem1) == 2, - "wrong counter value"); - } -} - -static const testcase_t test_002_001 = { - "semaphore primitives, no state change", - test_002_001_setup, - test_002_001_teardown, - test_002_001_execute -}; -#endif /* TRUE */ - -#if TRUE || defined(__DOXYGEN__) -/** - * @page test_002_002 Semaphore primitives, with state change - * - *

Description

- * Wait, Signal and Reset primitives are tested. The testing thread - * triggers a state change. - * - *

Conditions

- * None. - * - *

Test Steps

- * - The function chSemWait() is invoked, after return the counter and - * the returned message are tested. The semaphore is signaled by another - * thread. - * - The function chSemWait() is invoked, after return the counter and - * the returned message are tested. The semaphore is reset by another - * thread. - * . - */ - -static void test_002_002_setup(void) { - - chSemObjectInit(&sem1, 0); -} - -static void test_002_002_teardown(void) { - - chSemReset(&sem1, 0); -} - -static void test_002_002_execute(void) { - - /* The function chSemWait() is invoked, after return the counter and - the returned message are tested. The semaphore is signaled by another - thread.*/ - test_set_step(1); - { - msg_t msg; - - msg = chSemWait(&gsem1); - test_assert_lock(chSemGetCounterI(&gsem1) == 0, - "wrong counter value"); - test_assert(MSG_OK == msg, - "wrong returned message"); - } - - /* The function chSemWait() is invoked, after return the counter and - the returned message are tested. The semaphore is reset by another - thread.*/ - test_set_step(2); - { - msg_t msg; - - msg = chSemWait(&gsem2); - test_assert_lock(chSemGetCounterI(&gsem2) == 0, - "wrong counter value"); - test_assert(MSG_RESET == msg, - "wrong returned message"); - } -} - -static const testcase_t test_002_002 = { - "semaphore primitives, with state change", - test_002_002_setup, - test_002_002_teardown, - test_002_002_execute -}; -#endif /* TRUE */ - -#if TRUE || defined(__DOXYGEN__) -/** - * @page test_002_003 Semaphores timeout - * - *

Description

- * Timeout on semaphores is tested. - * - *

Conditions

- * None. - * - *

Test Steps

- * - The function chSemWaitTimeout() is invoked, after return the system - * time, the counter and the returned message are tested. - * . - */ - -static void test_002_003_setup(void) { - - chSemObjectInit(&sem1, 0); -} - -static void test_002_003_teardown(void) { - - chSemReset(&sem1, 0); -} - -static void test_002_003_execute(void) { - systime_t time; - msg_t msg; - - /* The function chSemWaitTimeout() is invoked, after return the system - time, the counter and the returned message are tested.*/ - test_set_step(1); - { - time = chVTGetSystemTimeX(); - msg = chSemWaitTimeout(&sem1, MS2ST(1000)); - test_assert_time_window(time + MS2ST(1000), - time + MS2ST(1000) + 1, - "out of time window"); - test_assert_lock(chSemGetCounterI(&sem1) == 0, - "wrong counter value"); - test_assert(MSG_TIMEOUT == msg, - "wrong timeout message"); - } - - /* The function chSemWaitTimeout() is invoked, after return the system - time, the counter and the returned message are tested.*/ - test_set_step(2); - { - time = chVTGetSystemTimeX(); - msg = chSemWaitTimeout(&sem1, MS2ST(1000)); - test_assert_time_window(time + MS2ST(1000), - time + MS2ST(1000) + 1, - "out of time window"); - test_assert_lock(chSemGetCounterI(&sem1) == 0, - "wrong counter value"); - test_assert(MSG_TIMEOUT == msg, - "wrong timeout message"); - } -} - -static const testcase_t test_002_003 = { - "semaphores timeout", - test_002_003_setup, - test_002_003_teardown, - test_002_003_execute -}; -#endif /* TRUE */ - -#if TRUE || defined(__DOXYGEN__) -/** - * @page test_002_004 Suspend and Resume functionality - * - *

Description

- * The functionality of chThdSuspendTimeoutS() and chThdResumeI() is - * tested. - * - *

Conditions

- * None. - * - *

Test Steps

- * - The function chThdSuspendTimeoutS() is invoked, the thread is - * remotely resumed with message @p MSG_OK. On return the message - * and the state of the reference are tested. - * - The function chThdSuspendTimeoutS() is invoked, the thread is - * not resumed so a timeout must occur. On return the message - * and the state of the reference are tested. - * . - */ - -static void test_002_004_setup(void) { - - tr1 = NULL; -} - -static void test_002_004_execute(void) { - systime_t time; - msg_t msg; - - /* The function chThdSuspendTimeoutS() is invoked, the thread is - remotely resumed with message @p MSG_OK. On return the message - and the state of the reference are tested.*/ - test_set_step(1); - { - chSysLock(); - msg = chThdSuspendTimeoutS(>r1, TIME_INFINITE); - chSysUnlock(); - test_assert(NULL == gtr1, - "not NULL"); - test_assert(MSG_OK == msg, - "wrong returned message"); - } - - /* The function chThdSuspendTimeoutS() is invoked, the thread is - not resumed so a timeout must occur. On return the message - and the state of the reference are tested.*/ - test_set_step(2); - { - chSysLock(); - time = chVTGetSystemTimeX(); - msg = chThdSuspendTimeoutS(&tr1, MS2ST(1000)); - chSysUnlock(); - test_assert_time_window(time + MS2ST(1000), - time + MS2ST(1000) + 1, - "out of time window"); - test_assert(NULL == tr1, - "not NULL"); - test_assert(MSG_TIMEOUT == msg, - "wrong returned message"); - } -} - -static const testcase_t test_002_004 = { - "suspend and resume functionality", - test_002_004_setup, - NULL, - test_002_004_execute -}; -#endif /* TRUE */ - -#if (NIL_CFG_USE_EVENTS == TRUE) || defined(__DOXYGEN__) -/** - * @page test_002_005 Events functionality - * - *

Description

- * Event flags functionality is tested. - * - *

Conditions

- * None. - * - *

Test Steps

- * - A set of event flags are set on the current thread then the - * function chVTGetSystemTimeX() is invoked, the function is supposed to - * return immediately because the event flags are already pending, - * after return the events mask is tested. - * - The pending event flags mask is cleared then the function - * chVTGetSystemTimeX() is invoked, after return the events - * mask is tested. The thread is signaled by another thread. - * - - * . The function chVTGetSystemTimeX() is invoked, no event can - * wakeup the thread, the function must return because timeout. - */ - -static void test_002_005_setup(void) { - - chSemObjectInit(&sem1, 0); -} - -static void test_002_005_execute(void) { - systime_t time; - eventmask_t events; - - /* A set of event flags are set on the current thread then the - function chVTGetSystemTimeX() is invoked, the function is supposed to - return immediately because the event flags are already pending, - after return the events mask is tested.*/ - test_set_step(1); - { - time = chVTGetSystemTimeX(); - chEvtSignal(chThdGetSelfX(), 0x55); - events = chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(1000)); - test_assert((eventmask_t)0 != events, - "timed out"); - test_assert((eventmask_t)0x55 == events, - "wrong events mask"); - } - - /* The pending event flags mask is cleared then the function - chVTGetSystemTimeX() is invoked, after return the events - mask is tested. The thread is signaled by another thread.*/ - test_set_step(2); - { - time = chVTGetSystemTimeX(); - chThdGetSelfX()->epmask = 0; - events = chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(1000)); - test_assert((eventmask_t)0 != events, - "timed out"); - test_assert((eventmask_t)0x55 == events, - "wrong events mask"); - } - - /* The function chVTGetSystemTimeX() is invoked, no event can - wakeup the thread, the function must return because timeout.*/ - test_set_step(3); - { - time = chVTGetSystemTimeX(); - events = chEvtWaitAnyTimeout(0, MS2ST(1000)); - test_assert_time_window(time + MS2ST(1000), - time + MS2ST(1000) + 1, - "out of time window"); - test_assert((eventmask_t)0 == events, - "wrong events mask"); - } -} - -static const testcase_t test_002_005 = { - "events functionality", - test_002_005_setup, - NULL, - test_002_005_execute -}; -#endif /* NIL_CFG_USE_EVENTS == TRUE */ - - /**************************************************************************** - * Exported data. - ****************************************************************************/ - -/** - * @brief Sequence brief description. - */ -const testcase_t * const test_sequence_002[] = { -#if TRUE || defined(__DOXYGEN__) - &test_002_001, -#endif -#if TRUE || defined(__DOXYGEN__) - &test_002_002, -#endif -#if TRUE || defined(__DOXYGEN__) - &test_002_003, -#endif -#if TRUE || defined(__DOXYGEN__) - &test_002_004, -#endif -#if (NIL_CFG_USE_EVENTS == TRUE) || defined(__DOXYGEN__) - &test_002_005, -#endif - NULL -}; diff --git a/test/nil/test_sequence_002.h b/test/nil/test_sequence_002.h deleted file mode 100644 index dc81a573a..000000000 --- a/test/nil/test_sequence_002.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _TEST_SEQUENCE_002_H_ -#define _TEST_SEQUENCE_002_H_ - -extern const testcase_t * const test_sequence_002[]; - -#endif /* _TEST_SEQUENCE_002_H_ */ diff --git a/test/nil/testbuild/.cproject b/test/nil/testbuild/.cproject deleted file mode 100644 index e303e64dc..000000000 --- a/test/nil/testbuild/.cproject +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/nil/testbuild/.project b/test/nil/testbuild/.project deleted file mode 100644 index f48da3108..000000000 --- a/test/nil/testbuild/.project +++ /dev/null @@ -1,95 +0,0 @@ - - - NIL-BUILD_TEST - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - mingw32-make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - false - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/os/hal/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/test/nil/testbuild/Makefile b/test/nil/testbuild/Makefile deleted file mode 100644 index 58f7ae591..000000000 --- a/test/nil/testbuild/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x100 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU on Cortex-M4 (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -# Startup files. -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_stm32f3xx.mk -# HAL-OSAL files (optional). -#include $(CHIBIOS)/os/hal/hal.mk -#include $(CHIBIOS)/os/hal/ports/STM32/STM32F3xx/platform.mk -#include $(CHIBIOS)/os/hal/boards/ST_STM32F3_DISCOVERY/board.mk -#include $(CHIBIOS)/os/hal/osal/nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/nil/nil.mk -include $(CHIBIOS)/os/nil/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Other files (optional). -#include $(CHIBIOS)/test/nil/test.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(STARTUPSRC) \ - $(KERNSRC) \ - $(PORTSRC) \ - $(OSALSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(TESTSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(STARTUPASM) $(PORTASM) $(OSALASM) - -INCDIR = $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -AR = $(TRGT)ar -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra -Wundef - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -DSTM32F303xC - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC -include $(RULESPATH)/rules.mk - -############################################################################## -# MISRA check rule, requires PCLint and the setup files, not provided. -# -misra: - @lint-nt -w3 $(DEFS) pclint/co-gcc.lnt pclint/au-misra3.lnt pclint/waivers.lnt $(IINCDIR) $(CSRC) > misra.txt diff --git a/test/nil/testbuild/main.c b/test/nil/testbuild/main.c deleted file mode 100644 index 20af5d493..000000000 --- a/test/nil/testbuild/main.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "nil.h" - -/* - * Blinker thread #1. - */ -static THD_WORKING_AREA(waThread1, 128); -static THD_FUNCTION(Thread1, arg) { - - (void)arg; - - while (true) { - chThdSleepMilliseconds(1000); - } -} - -/* - * Threads static table, one entry per thread. The number of entries must - * match NIL_CFG_NUM_THREADS. - */ -THD_TABLE_BEGIN - THD_TABLE_ENTRY(waThread1, "sleeper", Thread1, NULL) -THD_TABLE_END - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - chSysInit(); - - /* This is now the idle thread loop, you may perform here a low priority - task but you must never try to sleep or wait in this loop. Note that - this tasks runs at the lowest priority level so any instruction added - here will be executed after all other tasks have been started.*/ - while (true) { - } -} diff --git a/test/nil/testbuild/nilconf.h b/test/nil/testbuild/nilconf.h deleted file mode 100644 index 6718e19ff..000000000 --- a/test/nil/testbuild/nilconf.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file nilconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _NILCONF_H_ -#define _NILCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of user threads in the application. - * @note This number is not inclusive of the idle thread which is - * Implicitly handled. - */ -#define NIL_CFG_NUM_THREADS 1 - -/** @} */ - -/*===========================================================================*/ -/** - * @name System timer settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16 or 32 bits. - */ -#define NIL_CFG_ST_RESOLUTION 32 - -/** - * @brief System tick frequency. - * @note This value together with the @p NIL_CFG_ST_RESOLUTION - * option defines the maximum amount of time allowed for - * timeouts. - */ -#define NIL_CFG_ST_FREQUENCY 1000 - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#define NIL_CFG_ST_TIMEDELTA 0 - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#define NIL_CFG_USE_EVENTS TRUE - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System assertions. - */ -#define NIL_CFG_ENABLE_ASSERTS FALSE - -/** - * @brief Stack check. - */ -#define NIL_CFG_ENABLE_STACK_CHECK FALSE - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System initialization hook. - */ -#if !defined(NIL_CFG_SYSTEM_INIT_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_SYSTEM_INIT_HOOK() { \ -} -#endif - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define NIL_CFG_THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - */ -#define NIL_CFG_THREAD_EXT_INIT_HOOK(tr) { \ - /* Add custom threads initialization code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define NIL_CFG_IDLE_ENTER_HOOK() { \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define NIL_CFG_IDLE_LEAVE_HOOK() { \ -} - -/** - * @brief System halt hook. - */ -#if !defined(NIL_CFG_SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define NIL_CFG_SYSTEM_HALT_HOOK(reason) { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in nilcore.h). */ -/*===========================================================================*/ - -#endif /* _NILCONF_H_ */ - -/** @} */ diff --git a/test/nil/testbuild/pclint/au-misra3.lnt b/test/nil/testbuild/pclint/au-misra3.lnt deleted file mode 100644 index c20ded95e..000000000 --- a/test/nil/testbuild/pclint/au-misra3.lnt +++ /dev/null @@ -1,2173 +0,0 @@ -/* Date Stamp */ -d"_lint_au_misra3_lnt=au-misra3.lnt modified 12-Jun-2014" -/* To document usage use: -message( "Using " _lint_au_misra3_lnt ) */ - -// --------------------------------------------------------------------- -// This file is provided by Gimpel Software (www.gimpel.com) for use with -// its products PC-lint and FlexeLint. -// -// Redistribution and use of this file, with or without modification, is -// permitted provided that any such redistribution retains this notice. -// --------------------------------------------------------------------- - -// au-misra3.lnt -- Author options - MISRA C 2012 - -/* - This options file can be used to explicitly activate those - checks advocated by the Motor Industry Software Reliability - Association. - - You can use this file directly when linting your programs as in: - - lin au-misra3 files - - Gimpel Software relies on the document, "MISRA-C:2012 - Guidelines for the use of the C language in critical systems", - copyright 2012 by MIRA Limited, as the primary source for this - file. Gimpel Software makes no warranty as to the completeness - or applicability of this options file and reserves the right to - amend or alter the official contents of such at any time. - - "MISRA" is a registered trademark of MIRA Limited, held on - behalf of the MISRA Consortium. - - */ - -misra(3) // Activate MISRA Essential Type model - -/**** Dir 1.1 (Req) ************/ - - /* not statically checkable */ - -/**** Dir 2.1 (Req) ************/ - - -A(C99) /* strict ISO C99 */ - /* Note: if you code to the C90 standard instead, you may - want to comment out the above option and uncomment the - following option. You will also want to do likewise for - other uses of the '-A(C99)' option throughout this file. */ - // -A(C90) /* strict ANSI */ - +e950 /* flag non-standard word or construct */ - +elib(950) - -append(950,[MISRA 2012 Directive 2.1, required]) - -/**** Dir 3.1 (Req) ************/ - - /* not statically checkable */ - -/**** Dir 4.1 (Req) ************/ - - /* not statically checkable */ - -/**** Dir 4.2 (Adv) ************/ - - /* not statically checkable */ - -/**** Dir 4.3 (Req) ************/ - - +e586 /* to activate the deprecation message */ - +elib(586) - -deprecate(keyword,asm,[MISRA 2012 4.3, required]) - -/**** Dir 4.4 (Adv) ************/ - - /* This requirement (that there be no commented-out code) is, in - principle, not statically checkable. The reason given for the - requirement is that comments do not nest. Thus a commented - out section of code that happens to use slash-star commenting - could inadvertently introduce unwanted code. Rule 3.1, however, - addresses the nested comment issue and hence the major concern - that this requirement seeks to address is indeed checkable. - */ - -fnc /* flag nested comments */ - +e602 /* comment within comment */ - +elib(602) - -append(602,[MISRA 2012 Directive 4.4, advisory]) - -/**** Dir 4.5 (Adv) ************/ - - // While Lint can enforce this directive with the following four - // options, doing so can increase the run time of Lint depending - // upon the number of identifiers in your program. If you want - // this checking, uncomment each of the following four options. - // - // +fta - // +e9046 /* typographical ambiguity */ - // +elib(9046) - // -append(9046,[MISRA 2012 Directive 4.5, advisory]) - -/**** Dir 4.6 (Adv) ************/ - - +e970 /* flag modifiers used outside of typedefs */ - +elib(970) - -append(970,[MISRA 2012 Directive 4.6, advisory]) - // For the duration, we are presuming MISRA does not want - // diagnostics for the bool type. - -esym(970,bool) - -esym(970,char) - -/**** Dir 4.7 (Req) ************/ - - +e534 /* ignoring return value of function */ - +elib(534) - -append(534,[MISRA 2012 Directive 4.7, required]) - -/**** Dir 4.8 (Adv) ************/ - - +e9045 /* non-hidden definition of type */ - +elib(9045) - -append(9045,[MISRA 2012 Directive 4.8, advisory]) - -/**** Dir 4.9 (Adv) ************/ - - +e9026 /* function-like macro defined */ - +elib(9026) - -append(9026,[MISRA 2012 Directive 4.9, advisory]) - -/**** Dir 4.10 (Req) ************/ - - +e451 /* Header repeatedly included without guard */ - +elib(451) - -append(451,[MISRA 2012 Directive 4.10, required]) - -/**** Dir 4.11 (Req) ************/ - - /* The arguments to over 100 calls to standard library functions - are monitored; users can specify additional constraints for - other functions. - */ - -/**** Dir 4.12 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,calloc,[MISRA 2012 Directive 4.12, required]) - -deprecate(function,malloc,[MISRA 2012 Directive 4.12, required]) - -deprecate(function,realloc,[MISRA 2012 Directive 4.12, required]) - -deprecate(function,free,[MISRA 2012 Directive 4.12, required]) - -/**** Dir 4.13 (Adv) ************/ - - /* supported by uncommenting the next six options and use of the - -function_pair() option */ - // +e480 - // +elib(480) - // -append(480,[MISRA 2012 Directive 4.13, advisory]) - // +e481 - // +elib(481) - // -append(481,[MISRA 2012 Directive 4.13, advisory]) - -/**** Rule 1.1 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - -A(C99) /* strict ISO C99 */ - /* Note: if you code to the C90 standard instead, you may - want to comment out the above option and uncomment the - following option. You will also want to do likewise for - other uses of the '-A(C99)' option throughout this file. */ - // -A(C90) /* strict ANSI */ - +e950 /* flag non-standard word or construct */ - +elib(950) - -append(950,[MISRA 2012 Rule 1.1, required]) - -/**** Rule 1.2 (Adv) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - -A(C99) /* strict ISO C99 */ - /* Note: if you code to the C90 standard instead, you may - want to comment out the above option and uncomment the - following option. You will also want to do likewise for - other uses of the '-A(C99)' option throughout this file. */ - // -A(C90) /* strict ANSI */ - +e950 /* flag non-ANSI word or construct */ - +elib(950) - -append(950,[MISRA 2012 Rule 1.2, advisory]) - -/**** Rule 1.3 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - - /* Avoid the use of undefined or unspecified behavior as described - in ISO C, Appendix A.6.1 and Appendix A.6.2 */ - - /* Source file not ending in a new-line character, ending in - new-line character immediately preceded by a backslash - character, or ending in a partial preprocessing token or - comment (ISO C, Appendix A.6.2, point 1). - */ - +e406 /* unclosed comment */ - +elib(406) - -append(406,[MISRA 2012 Rule 1.3, required]) - - /* Non-standard character usage (ISO C, Appendix A.6.2, point 2). - */ - +e27 /* illegal character */ - +elib(27) - -append(27,[MISRA 2012 Rule 1.3, required]) - - /* Unclosed quotes (ISO C, Appendix A.6.2, point 4). - */ - +e2 /* unclosed quote */ - +elib(2) - -append(2,[MISRA 2012 Rule 1.3, required]) - - /* Repeated label within a function (ISO C, Appendix A.6.2, point - 5). - */ - +e31 /* symbol redefinition */ - +elib(31) - -append(31,[MISRA 2012 Rule 1.3, required]) - - /* Non-visible identifier used (ISO C, Appendix A.6.2, point 6). - */ - +e40 /* undeclared identifier */ - +elib(40) - -append(40,[MISRA 2012 Rule 1.3, required]) - - /* Identifiers for the same entity differ beyond the minimal - significant characters (ISO C, Appendix A.6.2, point 7). - See Rules 5.1, 5.2, 5.4, and 5.5. - */ - - /* The same identifier has both internal and external linkage in - the same translation unit (ISO C, Appendix A.6.2, point 8). - */ - +e401 /* symbol not previously declared static */ - +elib(401) - -append(401,[MISRA 2012 Rule 1.3, required]) - - /* Multiple definitions for the same externally linked identifier - (ISO C, Appendix A.6.2, point 9). - */ - +e31 /* symbol redefinition */ - +elib(31) - - /* Using automatic storage data via a pointer after the data's - lifetime (ISO C, Appendix A.6.2, point 10). - */ - +e604 /* returning address of auto variable */ - +elib(604) - -append(604,[MISRA 2012 Rule 1.3, required]) - +e934 /* taking address of near auto variable */ - +elib(934) - -append(934,[MISRA 2012 Rule 1.3, required]) - - /* Incompatible redeclarations (ISO C, Appendix A.6.2, point 11). - See Rule 8.3 - */ - - /* Non-standard escape sequence (ISO C, Appendix A.6.2, point 12). - */ - +e606 /* non-ANSI escape sequence */ - +elib(606) - -append(606,[MISRA 2012 Rule 1.3, required]) - - /* Non-standard character in header name (ISO C, Appendix A.6.2, - point 15). - See Rule 20.2 - */ - +e9020 /* header name with non-standard character */ - +elib(9020) - -append(9020,[MISRA 2012 Rule 1.3, required]) - - /* No complete type available (ISO C, Appendix A.6.2, point 16). - */ - +e86 /* structure has no data elements */ - +elib(86) - -append(86,[MISRA 2012 Rule 1.3, required]) - - /* Using or converting a void expression (ISO C, Appendix A.6.2, - point 17). - */ - +e64 /* type mismatch */ - +elib(64) - -append(64,[MISRA 2012 Rule 1.3, required]) - +e67 /* cannot cast between types */ - +elib(67) - -append(67,[MISRA 2012 Rule 1.3, required]) - +e144 /* non-existent return value */ - +elib(144) - -append(144,[MISRA 2012 Rule 1.3, required]) - - /* Modifying an object more than once or modifying and accessing - between two sequence points (ISO C, Appendix A.6.2, point 18). - See Rule 13.2 - */ - +e564 /* variable depends on order of evaluation */ - +elib(564) - -append(564,[MISRA 2012 Rule 1.3, required]) - - /* Invalid arithmetic operations or unrepresentable results - (ISO C, Appendix A.6.2, point 19). - */ - +e54 /* division by 0 */ - +elib(54) - -append(54,[MISRA 2012 Rule 1.3, required]) - +e414 /* possible division by 0 */ - +elib(414) - -append(414,[MISRA 2012 Rule 1.3, required]) - +e795 /* conceivable division by 0 */ - +elib(795) - -append(795,[MISRA 2012 Rule 1.3, required]) - /* Also, see Rule 12.4 */ - - /* Passing a void argument to a function (ISO C, Appendix A.6.2, - point 20). - */ - +e64 /* type mismatch */ - +elib(64) - - /* Incompatible function redeclaration (ISO C, Appendix A.6.2, - point 22). - See Rule 8.3 - */ - - /* An invalid array reference, null pointer reference, or - reference to an object declared with automatic storage duration in - a terminated block occurs (ISO C, Appendix A.6.2, point 24). - */ - +e64 /* type mismatch */ - +elib(64) - +e413 /* likely use of null pointer */ - +elib(413) - -append(413,[MISRA 2012 Rule 1.3, required]) - +e415 /* out-of-bounds pointer */ - +elib(415) - -append(415,[MISRA 2012 Rule 1.3, required]) - +e416 /* out-of-bounds pointer */ - +elib(416) - -append(416,[MISRA 2012 Rule 1.3, required]) - +e428 /* negative subscript */ - +elib(428) - -append(428,[MISRA 2012 Rule 1.3, required]) - /* Also, see Rule 17.6 */ - - /* A pointer to a function is converted to a pointer to an object - or a pointer to an object is converted to a pointer to a function - (ISO C, Appendix A.6.2, point 26). - */ - +e64 /* type mismatch */ - +elib(64) - +e740 /* unusual pointer cast */ - +elib(740) - -append(740,[MISRA 2012 Rule 1.3, required]) - /* Also, see Rule 11.1 and 11.2 */ - - /* A pointer is converted to other than an integral or pointer - type (ISO C, Appendix A.6.2, point 27). - */ - +e64 /* type mismatch */ - +elib(64) - +e71 /* cannot cast */ - +elib(71) - - /* An expression is shifted by a negative number or by an amount - greater than or equal to the width in bits of the expression being - shifted (ISO C, Appendix A.6.2, point 30). - */ - +e504 /* unusual shift */ - +elib(504) - -append(504,[MISRA 2012 Rule 1.3, required]) - - /* An identifier for an object is declared with no linkage and the - type of the object is incomplete after its declarator, or after its - init-declarator if it has an initializer (ISO C, Appendix - A.6.2, point 33). - */ - +e86 /* structure has no data elements */ - +elib(86) - - /* Declaring a function at block scope with a storage-class - specifier other than extern (ISO C, Appendix A.6.2, point 34). - */ - +e629 /* static class for function */ - +elib(629) - -append(629,[MISRA 2012 Rule 1.3, required]) - - /* A bit-field is declared with a type other than int, signed int, - or unsigned int (ISO C, Appendix A.6.2, point 35). - See Rule 6.1. - */ - - /* Attempting to modify an object with const-qualified type by - means of an lvalue with non-const-qualified type (ISO C, - Appendix A.6.2, point 36). - */ - +e158 /* assignment increases capability */ - +elib(158) - -append(158,[MISRA 2012 Rule 1.3, required]) - - /* Attempting to refer to an object with volatile-qualified type - by means of an lvalue with non-volatile-qualified type (ISO C, - Appendix A.6.2, point 37). - */ - +e158 /* assignment increases capability */ - +elib(158) - - /* Using the value of uninitialized automatic object (ISO C, - Appendix A.6.2, point 38). - See Rule 9.1 - */ - - /* An object with aggregate or union type with static storage - duration has a non-brace-enclosed initializer, or an object - with aggregate or union type with automatic storage duration - has either a single expression initializer with a type other - than that of the object or a non-brace-enclosed initializer - (ISO C, Appendix A.6.2, point 39). - Also, see Rule 9.2 - */ - +e64 /* type mismatch */ - +elib(64) - - /* The value of a function is used, but no value was returned - (ISO C, Appendix A.6.2, point 40). - See Rule 17.4. - */ - - /* A function that accepts a variable number of arguments is - defined without a parameter type list that ends with the - ellipsis notation (ISO C, Appendix A.6.2, point 41). - */ - - /* An identifier for an object with internal linkage and an - incomplete type is declared with a tentative definition (ISO C, - Appendix A.6.2, point 42). - */ - +e86 /* structure has no data elements */ - +elib(86) - - /* Non-standard #include preprocessing directive (ISO C, Appendix - A.6.2, point 44). - See Rule 20.3. - */ - - /* Non-standard #line directive (ISO C, Appendix A.6.2, point 49). - */ - +"estring(10,a numeric constant)" /* expecting a numeric constant */ - - /* #defining or #undefing any of: defined, __LINE__, __FILE__, - __DATE__, __TIME__, or __STDC__ (ISO C, Appendix A.6.2, point 50). - */ - +e136 /* illegal macro name */ - +elib(136) - -append(136,[MISRA 2012 Rule 1.3, required]) - - /* Format-argument mismatch in an fprintf or fscanf type of - function (ISO C, Appendix A.6.2, point 75). - */ - +e558 /* too few arguments */ - +elib(558) - -append(558,[MISRA 2012 Rule 1.3, required]) - +e719 /* too many arguments */ - +elib(719) - -append(719,[MISRA 2012 Rule 1.3, required]) - - /* A %% conversion specification for the fprintf or fscanf - function contains characters between the pair of % characters - (ISO C, Appendix A.6.2, point 77). - */ - +e557 /* unrecognized format */ - +elib(557) - -append(557,[MISRA 2012 Rule 1.3, required]) - - /* An aggregate or union, or a pointer to an aggregate or union is - an argument to the fprintf function, except for the conversion - specifiers %s (for an array of character type) or %p (for a pointer - to void) (ISO C, Appendix A.6.2, point 81). - */ - +e437 /* passing struct to ellipsis */ - +elib(437) - -append(437,[MISRA 2012 Rule 1.3, required]) - - /* Referring to deallocated space (ISO C, Appendix A.6.2, point - 87). - */ - +e449 /* previously deallocated pointer */ - +elib(449) - -append(449,[MISRA 2012 Rule 1.3, required]) - - /* Misuse of free or realloc (ISO C, Appendix A.6.2, point 88). - */ - +esym(424,free) /* inappropriate deallocation */ - -append(424,[MISRA 2012 Rule 1.3, required]) - - /* An array written to by a copying or concatenation function is - too small (ISO C, Appendix A.6.2, point 91). - */ - +e419 /* data overrun */ - +elib(419) - -append(419,[MISRA 2012 Rule 1.3, required]) - - /* Order of evaluation (ISO C, Appendix A.6.1, point 7). - */ - +e564 /* variable depends on order of evaluation */ - +elib(564) - -append(564,[MISRA 2012 Rule 1.3, required]) - - /* Side effects order (ISO C, Appendix A.6.1, point 8). - */ - +e931 /* both sides of an expression have side-effects */ - +elib(931) - -append(931,[MISRA 2012 Rule 1.3, required]) - - /* Function argument evaluation (ISO C, Appendix A.6.1, point 9). - */ - +e564 /* variable depends on order of evaluation */ - +elib(564) - - /* The order in which # and ## operations are evaluated during - macro substitution (ISO C, Appendix A.6.1, point 12). - */ - +e9023 /* multiple '#/##' operators in macro definition */ - +elib(9023) - -append(9023,[MISRA 2012 Rule 1.3, required]) - - /* Whether setjmp is a macro or an external identifier (ISO C, - Appendix A.6.1, point 14). - See Rule 21.2. - */ - -/**** Rule 2.1 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e506 /* constant value boolean */ - +elib(506) - -append(506,[MISRA 2012 Rule 2.1, required]) - +e527 /* unreachable */ - +elib(527) - -append(527,[MISRA 2012 Rule 2.1, required]) - +e681 /* loop not entered */ - +elib(681) - -append(681,[MISRA 2012 Rule 2.1, required]) - +e827 /* loop not reachable */ - +elib(827) - -append(827,[MISRA 2012 Rule 2.1, required]) - -/**** Rule 2.2 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e438 /* value not used */ - +elib(438) - -append(438,[MISRA 2012 Rule 2.2, required]) - +e505 /* redundant argument to comma */ - +elib(505) - -append(505,[MISRA 2012 Rule 2.2, required]) - +e520 /* highest operator has no side effects */ - +elib(520) - -append(520,[MISRA 2012 Rule 2.2, required]) - +e521 /* highest operator has no side effects */ - +elib(521) - -append(521,[MISRA 2012 Rule 2.2, required]) - +e522 /* highest operator has no side effects */ - +elib(522) - -append(522,[MISRA 2012 Rule 2.2, required]) - -/**** Rule 2.3 (Adv) ************/ - - +e751 /* local typedef not referenced */ - +elib(751) - -append(751,[MISRA 2012 Rule 2.3, advisory]) - +e756 /* global not referenced */ - +elib(756) - -append(756,[MISRA 2012 Rule 2.3, advisory]) - -/**** Rule 2.4 (Adv) ************/ - - +e753 /* local tag not referenced */ - +elib(753) - -append(753,[MISRA 2012 Rule 2.4, advisory]) - +e9058 - +elibsym(9058) - -append(9058,[MISRA 2012 Rule 2.4, advisory]) - -/**** Rule 2.5 (Adv) ************/ - - +e750 /* local macro not referenced */ - +elib(750) - -append(750,[MISRA 2012 Rule 2.5, advisory]) - +e755 /* global macro not referenced */ - +elib(755) - -append(755,[MISRA 2012 Rule 2.5, advisory]) - -/**** Rule 2.6 (Adv) ************/ - - +e563 /* label not referenced */ - +elib(563) - -append(563,[MISRA 2012 Rule 2.6, advisory]) - -/**** Rule 2.7 (Adv) ************/ - - +e715 /* not referenced */ - +elib(715) - -append(715,[MISRA 2012 Rule 2.7, advisory]) - -/**** Rule 3.1 (Req) ************/ - - -fnc /* flag nested comments */ - +e602 /* comment within comment */ - +elib(602) - -append(602,[MISRA 2012 Rule 3.1, required]) - +e9059 - +elib(9059) - -append(9059,[MISRA 2012 Rule 3.1, required]) - +e9066 - +elib(9066) - -append(9066,[MISRA 2012 Rule 3.1, required]) - -/**** Rule 3.2 (Req) ************/ - - +e427 /* C++ comment ends in \\ */ - +elib(427) - -append(427,[MISRA 2012 Rule 3.2, required]) - -/**** Rule 4.1 (Req) ************/ - - +e9039 /* prohibited escape sequence */ - +elib(9039) - -append(9039,[MISRA 2012 Rule 4.1, required]) - -/**** Rule 4.2 (Adv) ************/ - - -ftg /* inhibit use of trigraphs */ - +e584 /* activate trigraph detected message */ - +elib(584) - -append(584,[MISRA 2012 Rule 4.2, advisory]) - +e739 /* activate trigraph in string message */ - +elib(739) - -append(739,[MISRA 2012 Rule 4.2, advisory]) - +e9060 /* trigraph in comment */ - +elib(9060) - -append(9060,[MISRA 2012 Rule 4.2, advisory]) - -/**** Rule 5.1 (Req) ************/ - - -idlen(31) /* flag names identical in the first 31 characters */ - +e621 /* Identifier clash - length set by -idlen */ - +elib(621) - -append(621,[MISRA 2012 Rule 5.1, required]) - -/**** Rule 5.2 (Req) ************/ - - -idlen(31) /* flag names identical in the first 31 characters */ - +e621 /* Identifier clash - length set by -idlen */ - +elib(621) - -append(621,[MISRA 2012 Rule 5.2, required]) - -/**** Rule 5.3 (Req) ************/ - - +e578 /* enable reports of name hiding */ - +elib(578) - -append(578,[MISRA 2012 Rule 5.3, required]) - -/**** Rule 5.4 (Req) ************/ - - -idlen(31) /* flag names identical in the first 31 characters */ - +e621 /* Identifier clash - length set by -idlen */ - +elib(621) - -append(621,[MISRA 2012 Rule 5.4, required]) - -/**** Rule 5.5 (Req) ************/ - - +e123 /* macro defined with arguments */ - +elib(123) - -append(123,[MISRA 2012 Rule 5.5, required]) - -idlen(31) /* flag names identical in the first 31 characters */ - +e621 /* Identifier clash - length set by -idlen */ - +elib(621) - -append(621,[MISRA 2012 Rule 5.5, required]) - +e9061 /* non-distinct identifier */ - +elib(9061) - -append(9061,[MISRA 2012 Rule 5.5, required]) - -/**** Rule 5.6 (Req) ************/ - - +e578 /* enable reports of name hiding */ - +elib(578) - -append(578,[MISRA 2012 Rule 5.6, required]) - +e623 /* redefining the storage class of symbol */ - +elib(623) - -append(623,[MISRA 2012 Rule 5.6, required]) - +estring(9062,typedef) /* non-unique typedef */ - +elib(9062) - -append(9062(typedef),[MISRA 2012 Rule 5.6, required]) - -/**** Rule 5.7 (Req) ************/ - - +e407 /* Inconsistent use of tag */ - +elib(407) - -append(407,[MISRA 2012 Rule 5.7, required]) - +e578 /* Declaration of Symbol hides Symbol */ - +elib(578) - -append(578,[MISRA 2012 Rule 5.7, required]) - +e14 /* Symbol previously defined */ - +elib(14) - -append(14,[MISRA 2012 Rule 5.7, required]) - +e15 /* Symbol redeclared */ - +elib(15) - -append(15,[MISRA 2012 Rule 5.7, required]) - +e631 /* Tag defined differently */ - +elib(631) - -append(631,[MISRA 2012 Rule 5.7, required]) - +e9062 /* non-unique tag */ - +elib(9062) - -append(9062(tag),[MISRA 2012 Rule 5.7, required]) - -/**** Rule 5.8 (Req) ************/ - - +e401 /* Symbol not previously declared static */ - +elib(401) - -append(401,[MISRA 2012 Rule 5.8, required]) - +e578 /* Declaration of Symbol hides Symbol */ - +elib(578) - -append(578,[MISRA 2012 Rule 5.8, required]) - +e580 /* enable reports of name hiding */ - +elib(580) - -append(580,[MISRA 2012 Rule 5.8, required]) - -/**** Rule 5.9 (Adv) ************/ - - +e578 /* enable reports of name hiding */ - +elib(578) - -append(578,[MISRA 2012 Rule 5.9, advisory]) - +e580 /* enable reports of name hiding */ - +elib(580) - -append(580,[MISRA 2012 Rule 5.9, advisory]) - -/**** Rule 6.1 (Req) ************/ - - +e46 /* field type should be int */ - +elib(46) - -append(46,[MISRA 2012 Rule 6.1, required]) - +e806 /* small bit field is signed rather than unsigned */ - +elib(806) - -append(806,[MISRA 2012 Rule 6.1, required]) - -/**** Rule 6.2 (Req) ************/ - - +e9088 /* named signed single-bit bit-field */ - +elib(9088) - -append(9088,[MISRA 2012 Rule 6.2, required]) - -/**** Rule 7.1 (Req) ************/ - - +e9001 /* Octal constant used */ - +elib(9001) - -append(9001,[MISRA 2012 Rule 7.1, required]) - -/**** Rule 7.2 (Req) ************/ - - +e9048 /* unsigned literal without 'U' suffix */ - +elib(9048) - -append(9048,[MISRA 2012 Rule 7.2, required]) - -/**** Rule 7.3 (Req) ************/ - - +e620 /* suspicious constant */ - +elib(620) - -append(620,[MISRA 2012 Rule 7.3, required]) - +e9057 /* "l" after "u" in literal suffix */ - +elib(9057) - -append(9057,[MISRA 2012 Rule 7.3, required]) - -/**** Rule 7.4 (Req) ************/ - - +fsc - +e489 /* attempting to modify a string literal */ - +elib(489) - -append(489,[MISRA 2012 Rule 7.4, required]) - +e1776 /* string literal not const safe */ - +elib(1776) - -append(1776,[MISRA 2012 Rule 7.4, required]) - +e1778 /* assignment of string literal not const safe */ - +elib(1778) - -append(1778,[MISRA 2012 Rule 7.4, required]) - -/**** Rule 8.1 (Req) ************/ - - +e601 /* no explicit type */ - +elib(601) - -append(601,[MISRA 2012 Rule 8.1, required]) - +e745 /* function has no explicit type */ - +elib(745) - -append(745,[MISRA 2012 Rule 8.1, required]) - +e808 /* no explicit type */ - +elib(808) - -append(808,[MISRA 2012 Rule 8.1, required]) - +e832 /* parameter has no explicit type */ - +elib(832) - -append(832,[MISRA 2012 Rule 8.1, required]) - +e939 /* return type defaults to int */ - +elib(939) - -append(939,[MISRA 2012 Rule 8.1, required]) - -/**** Rule 8.2 (Req) ************/ - - +e937 /* old-style function declaration */ - +elib(937) - -append(937,[MISRA 2012 Rule 8.2, required]) - +e745 /* function has no explicit type */ - +elib(745) - -append(745,[MISRA 2012 Rule 8.2, required]) - +e939 /* return type defaults to int */ - +elib(939) - -append(939,[MISRA 2012 Rule 8.2, required]) - -fvr /* varying return mode not allowed */ - -strong() /* enable strong typing for - declarations */ - +e18 /* symbol redeclared */ - +elib(18) - -append(18,[MISRA 2012 Rule 8.2, required]) - - +e936 /* old-style function definition */ - +elib(936) - -append(936,[MISRA 2012 Rule 8.2, required]) - - +e955 /* param name missing from prototype */ - +elib(955) - -append(955,[MISRA 2012 Rule 8.2, required]) - -/**** Rule 8.3 (Req) ************/ - - -fvr /* varying return mode not allowed */ - -strong() /* enable strong typing for declarations */ - +e18 /* symbol redeclared */ - +elib(18) - -append(18,[MISRA 2012 Rule 8.3, required]) - +e516 /* argument type conflict */ - +elib(516) - -append(516,[MISRA 2012 Rule 8.3, required]) - +e532 /* return mode of symbol inconsistent */ - +elib(532) - -append(532,[MISRA 2012 Rule 8.3, required]) - +e9072 /* parameter list differs */ - +elib(9072) - -append(9072,[MISRA 2012 Rule 8.3, required]) - -/**** Rule 8.4 (Req) ************/ - - +e15 /* symbol redeclared */ - +elib(15) - -append(15,[MISRA 2012 Rule 8.4, required]) - +e64 /* flag type mismatch */ - +elib(64) - -append(64,[MISRA 2012 Rule 8.4, required]) - +e516 /* argument type mismatch */ - +elib(516) - -append(516,[MISRA 2012 Rule 8.4, required]) - +e9075 /* extern defined without prior declaration */ - +elib(9075) - -append(9075,[MISRA 2012 Rule 8.4, required]) - -/**** Rule 8.5 (Req) ************/ - - +e9004 /* object/function previously declared */ - +elib(9004) - -append(9004,[MISRA 2012 Rule 8.5, required]) - -/**** Rule 8.6 (Req) ************/ - - --fmd /* diallow multiple definitions */ - +e14 /* Symbol previously defined */ - +elib(14) - -append(14,[MISRA 2012 Rule 8.6, required]) - -/**** Rule 8.7 (Adv) ************/ - - +e765 /* could be made static */ - +elib(765) - -append(765,[MISRA 2012 Rule 8.7, advisory]) - -/**** Rule 8.8 (Req) ************/ - - +e839 /* storage class assumed static */ - +elib(839) - -append(839,[MISRA 2012 Rule 8.8, required]) - -/**** Rule 8.9 (Adv) ************/ - - +e9003 /* could define variable at block scope */ - +elib(9003) - -append(9003,[MISRA 2012 Rule 8.9, advisory]) - -/**** Rule 8.10 (Req) ************/ - - +e695 /* inline function without storage-class specifier */ - +elib(695) - -append(695,[MISRA 2012 Rule 8.10, required]) - +estring(9056,extern) /* inline function defined with extern */ - -append(9056,[MISRA 2012 Rule 8.10, required]) - -/**** Rule 8.11 (Adv) ************/ - - +e9067 /* array has no dimension or initializer */ - +elib(9067) - -append(9067,[MISRA 2012 Rule 8.11, advisory]) - -/**** Rule 8.12 (Req) ************/ - - +e488 /* duplicate enumerator values */ - +elib(488) - -append(488,[MISRA 2012 Rule 8.12, required]) - -/**** Rule 8.13 (Adv) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e818 /* pointer could be declared pointing to const */ - +elib(818) - -append(818,[MISRA 2012 Rule 8.13, advisory]) - +e844 /* pointer could be declared pointing to const */ - +elib(844) - -append(844,[MISRA 2012 Rule 8.13, advisory]) - +e954 /* pointer could be declared pointing to const */ - +elib(954) - -append(954,[MISRA 2012 Rule 8.13, advisory]) - -/**** Rule 8.14 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(keyword,restrict,[MISRA 2012 Rule 8.14, required]) - -/**** Rule 9.1 (Mand) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e644 /* Symbol may not have been initialized */ - +elib(644) - -append(644,[MISRA 2012 Rule 9.1, mandatory]) - +e771 /* Symbol conceivably not initialized */ - +elib(771) - -append(771,[MISRA 2012 Rule 9.1, mandatory]) - +e530 /* Symbol not initialized */ - +elib(530) - -append(530,[MISRA 2012 Rule 9.1, mandatory]) - -specific(+e644 +e771 +e530,) - -/**** Rule 9.2 (Req) ************/ - - +e9069 /* omitted braces within an initializer */ - +elib(9069) - -append(9069,[MISRA 2012 Rule 9.2, required]) - -/**** Rule 9.3 (Req) ************/ - - +e9068 /* too few initializers */ - +elib(9068) - -append(9068,[MISRA 2012 Rule 9.3, required]) - -/**** Rule 9.4 (Req) ************/ - - +e485 /* duplicate initialization */ - +elib(485) - -append(485,[MISRA 2012 Rule 9.4, required]) - -/**** Rule 9.5 (Req) ************/ - - +e9054 /* designated initializer and dimensionless array */ - +elib(9054) - -append(9054,[MISRA 2012 Rule 9.5, required]) - -/**** Rule 10.1 (Req) ************/ - - +e48 /* bad type */ - +elib(48) - -append(48,[MISRA 2012 Rule 10.1, required]) - +e9027 /* unpermitted operand */ - +elib(9027) - -append(9027,[MISRA 2012 Rule 10.1, required]) - -/**** Rule 10.2 (Req) ************/ - - +e9028 /* unpermitted arithmetic */ - +elib(9028) - -append(9028,[MISRA 2012 Rule 10.2, required]) - -/**** Rule 10.3 (Req) ************/ - - +e9034 /* expression assigned to narrower or different essential type */ - +elib(9034) - // Note: the following -d options for true and false don't apply - // to C90 and should be commented out if not using C99 - +"dtrue=/*lint -save -e921 */(_Bool) 1/*lint -restore */" // exception - +"dfalse=/*lint -save -e921 */(_Bool) 0/*lint -restore */" // exception - -append(9034,[MISRA 2012 Rule 10.3, required]) - -/**** Rule 10.4 (Req) ************/ - - +e9029 /* mismatched essential type */ - +elib(9029) - -append(9029,[MISRA 2012 Rule 10.4, required]) - -/**** Rule 10.5 (Adv) ************/ - - +e9030 /* impermissible cast */ - +elib(9030) - -append(9030,[MISRA 2012 Rule 10.5, advisory]) - -/**** Rule 10.6 (Req) ************/ - - +e9031 /* composite expression assigned to wider essential type */ - +elib(9031) - -append(9031,[MISRA 2012 Rule 10.6, required]) - -/**** Rule 10.7 (Req) ************/ - - +e9032 /* composite expression with smaller essential type than other operand*/ - +elib(9032) - -append(9032,[MISRA 2012 Rule 10.7, required]) - -/**** Rule 10.8 (Req) ************/ - - +e9033 /* impermissible cast of composite expression */ - +elib(9033) - -append(9033,[MISRA 2012 Rule 10.8, required]) - -/**** Rule 11.1 (Req) ************/ - - +e9074 /* conversion between a pointer to function and another type */ - +elib(9074) - --emacro((9074),NULL) /* explicit exception */ - -append(9074,[MISRA 2012 Rule 11.1, required]) - -/**** Rule 11.2 (Req) ************/ - - +e9076 /* conversion between a pointer to incomplete type and another type */ - +elib(9076) - --emacro((9076),NULL) /* explicit exception */ - -append(9076,[MISRA 2012 Rule 11.2, required]) - -/**** Rule 11.3 (Req) ************/ - - +e9087 /* cast from pointer to pointer */ - +elib(9087) - -append(9087,[MISRA 2012 Rule 11.3, required]) - -/**** Rule 11.4 (Adv) ************/ - - +e9078 /* cast pointer/integer */ - +elib(9078) - -append(9078,[MISRA 2012 Rule 11.4, advisory]) - -/**** Rule 11.5 (Adv) ************/ - - +e9079 /* cast from pointer to pointer */ - +elib(9079) - -append(9079,[MISRA 2012 Rule 11.5, advisory]) - -/**** Rule 11.6 (Req) ************/ - - +e923 /* cast pointer/non-pointer */ - +elib(923) - -append(923,[MISRA 2012 Rule 11.6, required]) - -/**** Rule 11.7 (Req) ************/ - - +e68 /* cast pointer/float */ - +elib(68) - -append(68,[MISRA 2012 Rule 11.7, required]) - +e70 /* cast pointer/float */ - +elib(70) - -append(70,[MISRA 2012 Rule 11.7, required]) - -/**** Rule 11.8 (Req) ************/ - - +e9005 /* attempt to cast away const/volatile from pointer or reference */ - +elib(9005) - -append(9005,[MISRA 2012 Rule 11.8, required]) - -/**** Rule 11.9 (Req) ************/ - - +e910 /* conversion from 0 to pointer */ - +elib(910) - --emacro((910),NULL) /* explicit exception */ - -append(910,[MISRA 2012 Rule 11.9, required]) - +e9080 /* integer null pointer constant */ - +elib(9080) - -append(9080,[MISRA 2012 Rule 11.9, required]) - -/**** Rule 12.1 (Adv) ************/ - - +e9050 /* dependence placed on precedence */ - +elib(9050) - -append(9050,[MISRA 2012 Rule 12.1, advisory]) - -/**** Rule 12.2 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e598 /* excessive left shift */ - +elib(598) - -append(598,[MISRA 2012 Rule 12.2, required]) - +e9053 /* shift value exceeds size of LHS */ - +elib(9053) - -append(9053,[MISRA 2012 Rule 12.2, required]) - -/**** Rule 12.3 (Adv) ************/ - - +e9008 /* comma operator used */ - +elib(9008) - -append(9008,[MISRA 2012 Rule 12.3, advisory]) - -/**** Rule 12.4 (Adv) ************/ - - +elib(648) /* Overflow in computing constant */ - +estring(648,unsigned addition) - +estring(648,unsigned multiplication) - +estring(648,unsigned sub.) - +estring(648,unsigned shift left) - +estring(648,unsigned shift right) - -append(648,[MISRA 2012 Rule 12.4, advisory]) - -/**** Rule 13.1 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e446 /* side effect in initializer */ - +elib(446) - -append(446,[MISRA 2012 Rule 13.1, required]) - -/**** Rule 13.2 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e564 /* variable depends on order of evaluation */ - +elib(564) - -append(564,[MISRA 2012 Rule 13.2, required]) - +e864 /* variable possibly depends on order of evaluation */ - +elib(864) - -append(864,[MISRA 2012 Rule 13.2, required]) - +e931 /* both sides have side effects */ - +elib(931) - -append(931,[MISRA 2012 Rule 13.2, required]) - -/**** Rule 13.3 (Adv) ************/ - - +e9049 /* increment/decrement combined with other operations */ - +elib(9049) - -append(9049,[MISRA 2012 Rule 13.3, advisory]) - -/**** Rule 13.4 (Adv) ************/ - - +e720 /* Boolean test of assignment */ - +elib(720) - -append(720,[MISRA 2012 Rule 13.4, advisory]) - +e820 /* Boolean test of parenthesized assignment */ - +elib(820) - -append(820,[MISRA 2012 Rule 13.4, advisory]) - +e9084 /* assignment used inside larger - expression */ - +elib(9084) - -append(9084,[MISRA 2012 Rule 13.4, advisory]) - -/**** Rule 13.5 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e9007 /* side effects on right hand side of logical operator */ - +elib(9007) - -append(9007,[MISRA 2012 Rule 13.5, required]) - -/**** Rule 13.6 (Mand) ************/ - - +e9006 /* sizeof used with expression with side effect */ - +elib(9006) - -append(9006,[MISRA 2012 Rule 13.6, mandatory]) - +e9089 /* potential side-effect in argument to sizeof */ - +elib(9089) - -append(9089,[MISRA 2012 Rule 13.6, mandatory]) - -/**** Rule 14.1 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e9009 /* floating point variable used as loop counter */ - +elib(9009) - -append(9009,[MISRA 2012 Rule 14.1, required]) - -/**** Rule 14.2 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e850 /* index variable modified in body of for loop */ - +elib(850) - -append(850,[MISRA 2012 Rule 14.2, required]) - -/**** Rule 14.3 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e685 /* relational always evaluates to true/false */ - +elib(685) - -append(685,[MISRA 2012 Rule 14.3, required]) - +e774 /* boolean always evaluates to true/false */ - +elib(774) - -append(774,[MISRA 2012 Rule 14.3, required]) - +e650 /* constant out of range for operator */ - +elib(650) - -append(650,[MISRA 2012 Rule 14.3, required]) - -/**** Rule 14.4 (Req) ************/ - - +e9036 /* condition should have essentially Boolean type */ - +elib(9036) - -append(9036,[MISRA 2012 Rule 14.4, required]) - -/**** Rule 15.1 (Adv) ************/ - - +e801 /* use of 'goto' is deprecated */ - +elib(801) - -append(801,[MISRA 2012 Rule 15.1, advisory]) - -/**** Rule 15.2 (Req) ************/ - - +e9064 /* goto references earlier label */ - +elib(9064) - -append(9064,[MISRA 2012 Rule 15.2, required]) - -/**** Rule 15.3 (Req) ************/ - - +e9041 /* goto not nested in the same block as label */ - +elib(9041) - -append(9041,[MISRA 2012 Rule 15.3, required]) - -/**** Rule 15.4 (Adv) ************/ - - +e9011 /* more than one 'break' terminates loop */ - +elib(9011) - -append(9011,[MISRA 2012 Rule 15.4, advisory]) - -/**** Rule 15.5 (Adv) ************/ - - +e904 /* return before function end */ - +elib(904) - -append(904,[MISRA 2012 Rule 15.5, advisory]) - -/**** Rule 15.6 (Req) ************/ - - +e9012 /* sub-statement should be a compound statement */ - +elib(9012) - -append(9012,[MISRA 2012 Rule 15.6, required]) - -/**** Rule 15.7 (Req) ************/ - - +e9013 /* no 'else' at end of 'if ... else if' chain */ - +elib(9013) - -append(9013,[MISRA 2012 Rule 15.7, required]) - +e9063 /* no comment or action in else-branch */ - +elib(9063) - -append(9063,[MISRA 2012 Rule 15.7, required]) - -/**** Rule 16.1 (Req) ************/ - - +e616 /* control flows into case/default */ - +elib(616) - -append(616,[MISRA 2012 Rule 16.1, required]) - +e744 /* switch statement has no default */ - +elib(744) - -append(744,[MISRA 2012 Rule 16.1, required]) - +e764 /* switch does not have a case */ - +elib(764) - -append(764,[MISRA 2012 Rule 16.1, required]) - +e825 /* control flows into case/default without -fallthrough comment */ - +elib(825) - -append(825,[MISRA 2012 Rule 16.1, required]) - +e9014 /* default missing from switch */ - +elib(9014) - -append(9014,[MISRA 2012 Rule 16.1, required]) - +e9042 /* departure from MISRA switch syntax */ - +elib(9042) - -append(9042,[MISRA 2012 Rule 16.1, required]) - +e9077 /* missing unconditional break */ - +elib(9077) - -append(9077,[MISRA 2012 Rule 16.1, required]) - +e9081 /* too few independent cases for switch */ - +elib(9081) - -append(9081,[MISRA 2012 Rule 16.1, required]) - +e9082 /* switch statement should either begin or end with default label */ - +elib(9082) - -append(9082,[MISRA 2012 Rule 16.1, required]) - +e9085 /* statement or comment should appear in default case */ - +elib(9085) - -append(9085,[MISRA 2012 Rule 16.1, required]) - -/**** Rule 16.2 (Req) ************/ - - +e44 /* Need a switch */ - +elib(44) - -append(44,[MISRA 2012 Rule 16.2, required]) - +e9055 /* enclosing statement is not a switch */ - +elib(9055) - -append(9055,[MISRA 2012 Rule 16.2, required]) - -/**** Rule 16.3 (Req) ************/ - - +e616 /* control flows into case/default */ - +elib(616) - -append(616,[MISRA 2012 Rule 16.3, required]) - +e825 /* control flows into case/default without -fallthrough comment */ - +elib(825) - -append(825,[MISRA 2012 Rule 16.3, required]) - +e9077 /* missing unconditional break */ - +elib(9077) - -append(9077,[MISRA 2012 Rule 16.3, required]) - +e9090 /* missing unconditional break */ - +elib(9090) - -append(9090,[MISRA 2012 Rule 16.3, required]) - -/**** Rule 16.4 (Req) ************/ - - +e744 /* switch statement has no default */ - +elib(744) - -append(744,[MISRA 2012 Rule 16.4, required]) - +e9014 /* switch statement has no default */ - +elib(9014) - -append(9014,[MISRA 2012 Rule 16.4, required]) - +e9085 /* default case has no statement nor comment */ - +elib(9085) - -append(9085,[MISRA 2012 Rule 16.4, required]) - -/**** Rule 16.5 (Req) ************/ - - +e9082 /* default should be first or last */ - +elib(9082) - -append(9082,[MISRA 2012 Rule 16.5, required]) - -/**** Rule 16.6 (Req) ************/ - - +e764 /* switch does not have a case */ - +elib(764) - -append(764,[MISRA 2012 Rule 16.6, required]) - +e9081 /* too few cases */ - +elib(9081) - -append(9081,[MISRA 2012 Rule 16.6, required]) - -/**** Rule 16.7 (Req) ************/ - - +e483 /* boolean value in switch expression */ - +elib(483) - -append(483,[MISRA 2012 Rule 16.7, required]) - -/**** Rule 17.1 (Req) ************/ - - +e829 /* warn on header usage */ - +elib(829) - +headerwarn(stdarg.h) - -append(829(stdarg.h),[MISRA 2012 Rule 17.1, required]) - -deprecate(macro,va_arg,[MISRA 2012 Rule 17.1, required]) - -deprecate(macro,va_start,[MISRA 2012 Rule 17.1, required]) - -deprecate(macro,va_end,[MISRA 2012 Rule 17.1, required]) - -deprecate(macro,va_copy,[MISRA 2012 Rule 17.1, required]) - -/**** Rule 17.2 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e9070 - -append(9070,[MISRA 2012 Rule 17.2, required]) - -/**** Rule 17.3 (Mand) ************/ - - +e718 /* symbol undeclared, assumed to return int */ - +elib(718) - -append(718,[MISRA 2012 Rule 17.3, mandatory]) - -/**** Rule 17.4 (Mand) ************/ - - +e533 /* function should return a value */ - +elib(533) - -append(533,[MISRA 2012 Rule 17.4, mandatory]) - -/**** Rule 17.5 (Adv) ************/ - - /* MISRA has declared this rule to be "undecidable". */ - -/**** Rule 17.6 (Mand) ************/ - - +e9043 /* static between brackets of array declaration */ - +elib(9043) - -append(9043,[MISRA 2012 Rule 17.6, mandatory]) - -/**** Rule 17.7 (Req) ************/ - - +e534 /* ignoring return value of function */ - +elib(534) - -append(534,[MISRA 2012 Rule 17.7, required]) - -/**** Rule 17.8 (Adv) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e9044 /* function parameter modified */ - +elib(9044) - -append(9044,[MISRA 2012 Rule 17.8, advisory]) - -/**** Rule 18.1 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e415 /* out-of-bounds pointer */ - +elib(415) - -append(415,[MISRA 2012 Rule 18.1, required]) - +e416 /* out-of-bounds pointer */ - +elib(416) - -append(416,[MISRA 2012 Rule 18.1, required]) - +e428 /* out-of-bounds pointer */ - +elib(428) - -append(428,[MISRA 2012 Rule 18.1, required]) - +e661 /* out-of-bounds pointer */ - +elib(661) - -append(661,[MISRA 2012 Rule 18.1, required]) - +e662 /* out-of-bounds pointer */ - +elib(662) - -append(662,[MISRA 2012 Rule 18.1, required]) - +e676 /* out-of-bounds pointer */ - +elib(676) - -append(676,[MISRA 2012 Rule 18.1, required]) - +e796 /* out-of-bounds pointer */ - +elib(796) - -append(796,[MISRA 2012 Rule 18.1, required]) - +e797 /* out-of-bounds pointer */ - +elib(797) - -append(797,[MISRA 2012 Rule 18.1, required]) - +e817 /* out-of-bounds pointer */ - +elib(817) - -append(817,[MISRA 2012 Rule 18.1, required]) - -/**** Rule 18.2 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e946 /* relational or subtract operator applied to pointers */ - +elib(946) - -append(946,[MISRA 2012 Rule 18.2, required]) - +e947 /* relational or subtract operator applied to pointers */ - +elib(947) - -append(947,[MISRA 2012 Rule 18.2, required]) - -/**** Rule 18.3 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e946 /* relational or subtract operator applied to pointers */ - +elib(946) - -append(946,[MISRA 2012 Rule 18.3, required]) - +e947 /* relational or subtract operator applied to pointers */ - +elib(947) - -append(947,[MISRA 2012 Rule 18.3, required]) - -/**** Rule 18.4 (Adv) ************/ - - +e9016 /* pointer arithmetic other than array indexing used */ - +elib(9016) - -append(9016,[MISRA 2012 Rule 18.4, advisory]) - -/**** Rule 18.5 (Adv) ************/ - - +e9025 /* more than two pointer indirection levels used */ - +elib(9025) - -append(9025,[MISRA 2012 Rule 18.5, advisory]) - -/**** Rule 18.6 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e733 /* assigning address of auto to outer scope symbol */ - +elib(733) - -append(733,[MISRA 2012 Rule 18.6, required]) - +e789 /* assigning address of auto to static */ - +elib(789) - -append(789,[MISRA 2012 Rule 18.6, required]) - +e604 /* returning address of auto variable */ - +elib(604) - -append(604,[MISRA 2012 Rule 18.6, required]) - -/**** Rule 18.7 (Req) ************/ - - +e9038 /* flexible array member declared */ - +elib(9038) - -append(9038,[MISRA 2012 Rule 18.7, required]) - -/**** Rule 18.8 (Req) ************/ - - +e9035 /* variable length array declared */ - +elib(9035) - -append(9035,[MISRA 2012 Rule 18.8, required]) - -/**** Rule 19.1 (Mand) ************/ - - /* MISRA has declared this rule to be "undecidable". */ - -/**** Rule 19.2 (Adv) ************/ - - +e9018 /* union type/object declared */ - +elib(9018) - -append(9018,[MISRA 2012 Rule 19.2, advisory]) - -/**** Rule 20.1 (Adv) ************/ - - +e9019 /* declaration before #include */ - +elib(9019) - -append(9019,[MISRA 2012 Rule 20.1, advisory]) - -/**** Rule 20.2 (Req) ************/ - - +e9020 /* header file name with non-standard character */ - +elib(9020) - -append(9020,[MISRA 2012 Rule 20.2, required]) - /* Note: If your system requires the '\' be used as a directory - separator, uncomment the following option. - */ - // -estring(9020,\) - -/**** Rule 20.3 (Req) ************/ - - +e12 /* Need < or " after #include */ - +elib(12) - -append(12,[MISRA 2012 Rule 20.3, required]) - +e9086 /* multiple arguments after #include */ - +elib(9086) - -append(9086,[MISRA 2012 Rule 20.3, required]) - -/**** Rule 20.4 (Req) ************/ - - +e9051 /* macro with same name as a keyword */ - +elib(9051) - -append(9051,[MISRA 2012 Rule 20.4, required]) - -/**** Rule 20.5 (Adv) ************/ - - +e9021 /* use of '#undef' is discouraged */ - +elib(9021) - -append(9021,[MISRA 2012 Rule 20.5, advisory]) - -/**** Rule 20.6 (Req) ************/ - - +e436 /* preprocessor directive in invocation of macro */ - +elib(436) - -append(436,[MISRA 2012 Rule 20.6, required]) - -/**** Rule 20.7 (Req) ************/ - - +e665 /* expression passed to unparenthesized macro */ - +elib(665) - -append(665,[MISRA 2012 Rule 20.7, required]) - -/**** Rule 20.8 (Req) ************/ - - +e9037 /* conditional of #if/#elif does not evaluate to 0 or 1 */ - +elib(9037) - -append(9037,[MISRA 2012 Rule 20.8, required]) - -/**** Rule 20.9 (Req) ************/ - - +e553 /* Undefined preprocessor variable, assumed 0 */ - +elib(553) - -append(553,[MISRA 2012 Rule 20.9, required]) - -/**** Rule 20.10 (Adv) ************/ - - +e9024 /* '#/##' operators used */ - +elib(9024) - -append(9024,[MISRA 2012 Rule 20.10, advisory]) - -/**** Rule 20.11 (Req) ************/ - - +e484 /* stringize operator followed by macro parameter followed by pasting operator */ - +elib(484) - -append(484,[MISRA 2012 Rule 20.11, required]) - -/**** Rule 20.12 (Req) ************/ - - +e9015 /* macro argument is used both with and without '#/##' and is subject to further replacement */ - +elib(9015) - -append(9015,[MISRA 2012 Rule 20.12, required]) - -/**** Rule 20.13 (Req) ************/ - - +e544 /* endif or else not followed by EOL */ - +elib(544) - -append(544,[MISRA 2012 Rule 20.13, required]) - +e16 /* # directive not followed by recognizable word */ - +elib(16) - -append(16,[MISRA 2012 Rule 20.13, required]) - /* other parts of this rule such as a syntax check of the disabled - portions of the code do not seem to be statically checkable - */ - -/**** Rule 20.14 (Req) ************/ - - +e405 /* #if/#ifdef/#ifndef not closed off */ - +elib(405) - -append(405,[MISRA 2012 Rule 20.14, required]) - -/**** Rule 21.1 (Req) ************/ - - +e136 /* Illegal macro name */ - +elib(136) - -append(136,[MISRA 2012 Rule 21.1, required]) - /* Undefining standard library macros is covered by rule 20.5. */ - /* Defining/redefining reserved/standard identifiers is covered - by rules 20.4 and 21.2. - */ - +e9071 /* defined macro reserved to the compiler */ - +elib(9071) - -append(9071,[MISRA 2012 Rule 21.1, required]) - // explicit exemptions - -estring(9071,* because *) - -estring(9071,cerf) - -estring(9071,cerfc) - -estring(9071,cexp2) - -estring(9071,cexpm1) - -estring(9071,clog10) - -estring(9071,clog1p) - -estring(9071,clog2) - -estring(9071,clgamma) - -estring(9071,ctgamma) - -estring(9071,cerff) - -estring(9071,cerfcf) - -estring(9071,cexp2f) - -estring(9071,cexpm1f) - -estring(9071,clog10f) - -estring(9071,clog1pf) - -estring(9071,clog2f) - -estring(9071,clgammaf) - -estring(9071,ctgammaf) - -estring(9071,cerfl) - -estring(9071,cerfcl) - -estring(9071,cexp2l) - -estring(9071,cexpm1l) - -estring(9071,clog10l) - -estring(9071,clog1pl) - -estring(9071,clog2l) - -estring(9071,clgammal) - -estring(9071,ctgammal) - -estring(9071,E0*) - -estring(9071,E1*) - -estring(9071,E2*) - -estring(9071,E3*) - -estring(9071,E4*) - -estring(9071,E5*) - -estring(9071,E6*) - -estring(9071,E7*) - -estring(9071,E8*) - -estring(9071,E9*) - -estring(9071,NDEBUG) - -estring(9071,PRIa*) - -estring(9071,PRIb*) - -estring(9071,PRIc*) - -estring(9071,PRId*) - -estring(9071,PRIe*) - -estring(9071,PRIf*) - -estring(9071,PRIg*) - -estring(9071,PRIh*) - -estring(9071,PRIi*) - -estring(9071,PRIj*) - -estring(9071,PRIk*) - -estring(9071,PRIl*) - -estring(9071,PRIm*) - -estring(9071,PRIn*) - -estring(9071,PRIo*) - -estring(9071,PRIp*) - -estring(9071,PRIq*) - -estring(9071,PRIr*) - -estring(9071,PRIs*) - -estring(9071,PRIt*) - -estring(9071,PRIu*) - -estring(9071,PRIv*) - -estring(9071,PRIw*) - -estring(9071,PRIx*) - -estring(9071,PRIy*) - -estring(9071,PRIz*) - -estring(9071,PRIX*) - -estring(9071,SCNa*) - -estring(9071,SCNb*) - -estring(9071,SCNc*) - -estring(9071,SCNd*) - -estring(9071,SCNe*) - -estring(9071,SCNf*) - -estring(9071,SCNg*) - -estring(9071,SCNh*) - -estring(9071,SCNi*) - -estring(9071,SCNj*) - -estring(9071,SCNk*) - -estring(9071,SCNl*) - -estring(9071,SCNm*) - -estring(9071,SCNn*) - -estring(9071,SCNo*) - -estring(9071,SCNp*) - -estring(9071,SCNq*) - -estring(9071,SCNr*) - -estring(9071,SCNs*) - -estring(9071,SCNt*) - -estring(9071,SCNu*) - -estring(9071,SCNv*) - -estring(9071,SCNw*) - -estring(9071,SCNx*) - -estring(9071,SCNy*) - -estring(9071,SCNz*) - -estring(9071,SCNX*) - +e9083 /* undefined macro reserved to the compiler */ - +elib(9083) - -append(9083,[MISRA 2012 Rule 21.1, required]) - // explicit exemptions - -estring(9083,* because *) - -estring(9083,cerf) - -estring(9083,cerfc) - -estring(9083,cexp2) - -estring(9083,cexpm1) - -estring(9083,clog10) - -estring(9083,clog1p) - -estring(9083,clog2) - -estring(9083,clgamma) - -estring(9083,ctgamma) - -estring(9083,cerff) - -estring(9083,cerfcf) - -estring(9083,cexp2f) - -estring(9083,cexpm1f) - -estring(9083,clog10f) - -estring(9083,clog1pf) - -estring(9083,clog2f) - -estring(9083,clgammaf) - -estring(9083,ctgammaf) - -estring(9083,cerfl) - -estring(9083,cerfcl) - -estring(9083,cexp2l) - -estring(9083,cexpm1l) - -estring(9083,clog10l) - -estring(9083,clog1pl) - -estring(9083,clog2l) - -estring(9083,clgammal) - -estring(9083,ctgammal) - -estring(9083,E0*) - -estring(9083,E1*) - -estring(9083,E2*) - -estring(9083,E3*) - -estring(9083,E4*) - -estring(9083,E5*) - -estring(9083,E6*) - -estring(9083,E7*) - -estring(9083,E8*) - -estring(9083,E9*) - -estring(9083,NDEBUG) - -estring(9083,PRIa*) - -estring(9083,PRIb*) - -estring(9083,PRIc*) - -estring(9083,PRId*) - -estring(9083,PRIe*) - -estring(9083,PRIf*) - -estring(9083,PRIg*) - -estring(9083,PRIh*) - -estring(9083,PRIi*) - -estring(9083,PRIj*) - -estring(9083,PRIk*) - -estring(9083,PRIl*) - -estring(9083,PRIm*) - -estring(9083,PRIn*) - -estring(9083,PRIo*) - -estring(9083,PRIp*) - -estring(9083,PRIq*) - -estring(9083,PRIr*) - -estring(9083,PRIs*) - -estring(9083,PRIt*) - -estring(9083,PRIu*) - -estring(9083,PRIv*) - -estring(9083,PRIw*) - -estring(9083,PRIx*) - -estring(9083,PRIy*) - -estring(9083,PRIz*) - -estring(9083,PRIX*) - -estring(9083,SCNa*) - -estring(9083,SCNb*) - -estring(9083,SCNc*) - -estring(9083,SCNd*) - -estring(9083,SCNe*) - -estring(9083,SCNf*) - -estring(9083,SCNg*) - -estring(9083,SCNh*) - -estring(9083,SCNi*) - -estring(9083,SCNj*) - -estring(9083,SCNk*) - -estring(9083,SCNl*) - -estring(9083,SCNm*) - -estring(9083,SCNn*) - -estring(9083,SCNo*) - -estring(9083,SCNp*) - -estring(9083,SCNq*) - -estring(9083,SCNr*) - -estring(9083,SCNs*) - -estring(9083,SCNt*) - -estring(9083,SCNu*) - -estring(9083,SCNv*) - -estring(9083,SCNw*) - -estring(9083,SCNx*) - -estring(9083,SCNy*) - -estring(9083,SCNz*) - -estring(9083,SCNX*) - -/**** Rule 21.2 (Req) ************/ - - +e683 /* complain about #define standard functions */ - +elib(683) - -append(683,[MISRA 2012 Rule 21.2, required]) - /* Undefining standard library macros is covered by rule 20.5. */ - /* Defining/redefining reserved/standard identifiers is covered - by rule 20.4 and 21.2. - */ - -/**** Rule 21.3 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,calloc,[MISRA 2012 Rule 21.3, required]) - -deprecate(macro,calloc,[MISRA 2012 Rule 21.3, required]) - -deprecate(function,malloc,[MISRA 2012 Rule 21.3, required]) - -deprecate(macro,malloc,[MISRA 2012 Rule 21.3, required]) - -deprecate(function,realloc,[MISRA 2012 Rule 21.3, required]) - -deprecate(macro,realloc,[MISRA 2012 Rule 21.3, required]) - -deprecate(function,free,[MISRA 2012 Rule 21.3, required]) - -deprecate(macro,free,[MISRA 2012 Rule 21.3, required]) - -/**** Rule 21.4 (Req) ************/ - - +e829 /* warn on header usage */ - +elib(829) - +headerwarn(setjmp.h) - -append(829(setjmp.h),[MISRA 2012 Rule 21.4, required]) - -deprecate(function,setjmp,[MISRA 2012 Rule 21.4, required]) - -deprecate(function,longjmp,[MISRA 2012 Rule 21.4, required]) - -deprecate(macro,setjmp,[MISRA 2012 Rule 21.4, required]) - -deprecate(macro,longjmp,[MISRA 2012 Rule 21.4, required]) - -/**** Rule 21.5 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,signal,[MISRA 2012 Rule 21.5, required]) - -deprecate(function,raise,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIGABRT,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIGFPE,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIGILL,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIGINT,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIGSEGV,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIGTERM,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIG_DFL,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIG_ERR,[MISRA 2012 Rule 21.5, required]) - -deprecate(macro,SIG_IGN,[MISRA 2012 Rule 21.5, required]) - +e829 /* warn on header usage */ - +elib(829) - +headerwarn(signal.h) - -append(829(signal.h),[MISRA 2012 Rule 21.5, required]) - -/**** Rule 21.6 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,clearerr,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fclose,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,feof,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,ferror,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fflush,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fgetc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fgetpos,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fgets,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fgetwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fgetws,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fopen,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fputc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fputs,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fputwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fputws,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fread,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fseek,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fsetpos,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,freopen,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,ftell,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fwide,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fwprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fwrite,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,fwscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,getc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,getchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,gets,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,getwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,getwchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,perror,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,printf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,putc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,putchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,puts,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,putwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,putwchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,remove,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,rename,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,rewind,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,scanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,setbuf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,setvbuf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,snprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,sprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,sscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,swprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,swscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,tmpfile,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,tmpnam,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,ungetc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,ungetwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vfprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vfscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vfwprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vfwscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vsnprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vsprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vsscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vswprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vswscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vwprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,vwscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,wprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(function,wscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,clearerr,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fclose,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,feof,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,ferror,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fflush,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fgetc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fgets,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fgetpos,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fgetwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fgetws,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fopen,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fputc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fputs,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fputwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fputws,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fread,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fseek,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fsetpos,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,freopen,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,ftell,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fwide,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fwprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fwrite,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,fwscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,getc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,getchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,gets,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,getwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,getwchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,perror,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,printf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,putc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,putchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,puts,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,putwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,putwchar,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,remove,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,rename,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,rewind,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,scanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,setbuf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,setvbuf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,snprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,sprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,sscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,swprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,swscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,tmpfile,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,tmpnam,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,ungetc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,ungetwc,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vfprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vfscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vfwprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vfwscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vsnprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vsprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vsscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vswprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vswscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vwprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,vwscanf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,wprintf,[MISRA 2012 Rule 21.6, required]) - -deprecate(macro,wscanf,[MISRA 2012 Rule 21.6, required]) - -/**** Rule 21.7 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,atof,[MISRA 2012 Rule 21.7, required]) - -deprecate(function,atoi,[MISRA 2012 Rule 21.7, required]) - -deprecate(function,atol,[MISRA 2012 Rule 21.7, required]) - -deprecate(function,atoll,[MISRA 2012 Rule 21.7, required]) - -deprecate(macro,atof,[MISRA 2012 Rule 21.7, required]) - -deprecate(macro,atoi,[MISRA 2012 Rule 21.7, required]) - -deprecate(macro,atol,[MISRA 2012 Rule 21.7, required]) - -deprecate(macro,atoll,[MISRA 2012 Rule 21.7, required]) - -/**** Rule 21.8 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,abort,[MISRA 2012 Rule 21.8, required]) - -deprecate(function,exit,[MISRA 2012 Rule 21.8, required]) - -deprecate(function,getenv,[MISRA 2012 Rule 21.8, required]) - -deprecate(function,system,[MISRA 2012 Rule 21.8, required]) - -deprecate(macro,abort,[MISRA 2012 Rule 21.8, required]) - -deprecate(macro,exit,[MISRA 2012 Rule 21.8, required]) - -deprecate(macro,getenv,[MISRA 2012 Rule 21.8, required]) - -deprecate(macro,system,[MISRA 2012 Rule 21.8, required]) - -/**** Rule 21.9 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,bsearch,[MISRA 2012 Rule 21.9, required]) - -deprecate(function,qsort,[MISRA 2012 Rule 21.9, required]) - -deprecate(macro,bsearch,[MISRA 2012 Rule 21.9, required]) - -deprecate(macro,qsort,[MISRA 2012 Rule 21.9, required]) - -/**** Rule 21.10 (Req) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(macro,wcsftime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,wcsftime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,clock,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,clock,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,difftime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,difftime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,mktime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,mktime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,time,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,time,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,asctime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,asctime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,ctime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,ctime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,gmtime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,gmtime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,localtime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,localtime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,strftime,[MISRA 2012 Rule 21.10, required]) - -deprecate(function,strftime,[MISRA 2012 Rule 21.10, required]) - -deprecate(macro,CLOCKS_PER_SEC,[MISRA 2012 Rule 21.10, required]) - +e829 /* warn on header usage */ - +elib(829) - +headerwarn(time.h) - -append(829(time.h),[MISRA 2012 Rule 21.10, required]) - -/**** Rule 21.11 (Req) ************/ - - +e829 /* warn on header usage */ - +elib(829) - +headerwarn(tgmath.h) - -append(829(tgmath.h),[MISRA 2012 Rule 21.11, required]) - -/**** Rule 21.12 (Adv) ************/ - - +e586 /* Symbol is deprecated */ - +elib(586) - -deprecate(function,feclearexcept,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,feclearexcept,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(function,fegetexceptflag,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,fegetexceptflag,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(function,feraiseexcept,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,feraiseexcept,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(function,fesetexceptflag,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,fesetexceptflag,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(function,fetestexcept,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,fetestexcept,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,FE_INEXACT,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,FE_DIVBYZERO,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,FE_UNDERFLOW,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,FE_OVERFLOW,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,FE_INVALID,[MISRA 2012 Rule 21.12, advisory]) - -deprecate(macro,FE_ALL_EXCEPT,[MISRA 2012 Rule 21.12, advisory]) - -/**** Rule 22.1 (Req) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e429 /* custodial pointer neither free'd nor returned */ - +elib(429) - -append(429,[MISRA 2012 Rule 22.1, required]) - -function_pair(fopen,fclose) - +e480 /* no balancing call */ - +elib(480) - -append(480,[MISRA 2012 Rule 22.1, required]) - +e481 /* different balance call states */ - +elib(481) - -append(481,[MISRA 2012 Rule 22.1, required]) - -/**** Rule 22.2 (Mand) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e424 /* inappropriate deallocation */ - +elib(424) - -append(424,[MISRA 2012 Rule 22.2, mandatory]) - +e449 /* pointer previously deallocated */ - +elib(449) - -append(449,[MISRA 2012 Rule 22.2, mandatory]) - -/**** Rule 22.3 (Req) ************/ - - /* MISRA has declared this rule to be "undecidable". */ - -/**** Rule 22.4 (Mand) ************/ - - /* MISRA has declared this rule to be "undecidable". */ - -/**** Rule 22.5 (Mand) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - Software provides the following message to assist: - */ - +e9047 /* FILE pointer dereferenced */ - +elib(9047) - -append(9047,[MISRA 2012 Rule 22.5, mandatory]) - - -/**** Rule 22.6 (Mand) ************/ - - /* While MISRA has declared this rule to be "undecidable", Gimpel - * Software provides the following options to assist: - */ - +e449 /* previously deallocated pointer */ - +elib(449) - -append(449,[MISRA 2012 Rule 22.6, mandatory]) diff --git a/test/nil/testbuild/pclint/co-gcc.h b/test/nil/testbuild/pclint/co-gcc.h deleted file mode 100644 index d18d71e57..000000000 --- a/test/nil/testbuild/pclint/co-gcc.h +++ /dev/null @@ -1,129 +0,0 @@ -// --------------------------------------------------------------------- -// This file is provided by Gimpel Software (www.gimpel.com) for use with -// its products PC-lint and FlexeLint. -// -// Redistribution and use of this file, with or without modification, is -// permitted provided that any such redistribution retains this notice. -// --------------------------------------------------------------------- - -#ifndef CO_GCC_H_ -#define CO_GCC_H_ -/*lint -save -w1 */ - -#ifdef _lint /* Make sure no compiler comes this way */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Standard library headers typically define the assert macro so that it - expands to a complicated conditional expression that uses special - funtions that Lint does not know about by default. For linting - purposes, we can simplify things a bit by forcing assert() to expand to - a call to a special function that has the appropriate 'assert' - semantics. - */ -//lint -function( __assert, __lint_assert ) -void __lint_assert( int ); -//lint ++d"assert(e)=__lint_assert(!!(e))" -//(++d makes this definition permanently immutable for the Lint run.) -//Now that we've made our own 'assert', we need to keep people from being -//punished when the marco in 'assert.h' appears not to be used: -//lint -efile(766,*assert.h) - -typedef char *__builtin_va_list; - -/*lint -e{171} */ -__builtin_va_list __lint_init_va(...); - -void __builtin_va_end( __builtin_va_list ); - /*lint -++d"__builtin_va_start(ap,parmN)=((ap)=__lint_init_va(parmN))" -++d"__builtin_va_arg(a,b)=(*( ((b) *) ( (((a) += sizeof(b)) - sizeof(b) )))" - */ - - -/* - The headers included below must be generated; For C++, generate - with: - - g++ [usual build options] -E -dM t.cpp >lint_cppmac.h - - For C, generate with: - - gcc [usual build options] -E -dM t.c >lint_cmac.h - - ...where "t.cpp" and "t.c" are empty source files. - - It's important to use the same compiler options used when compiling - project code because they can affect the existence and precise - definitions of certain predefined macros. See gcc-readme.txt for - details and a tutorial. - */ -#if defined(__cplusplus) -# include "lint_cppmac.h" // DO NOT COMMENT THIS OUT. DO NOT SUPPRESS ERROR 322. (If you see an error here, your Lint configuration is broken; check -i options and ensure that you have generated lint_cppmac.h as documented in gcc-readme.txt. Otherwise Gimpel Software cannot support your configuration.) -#else -# include "lint_cmac.h" // DO NOT COMMENT THIS OUT. DO NOT SUPPRESS ERROR 322. (If you see an error here, your Lint configuration is broken; check -i options and ensure that you have generated lint_cmac.h as documented in gcc-readme.txt. Otherwise Gimpel Software cannot support your configuration.) -#endif - -/* If the macro set given by the generated macro files must be adjusted in - order for Lint to cope, then you can make those adjustments here. - */ - -#define LINT_CO_GCC_H_GCC_VERSION ( __GNUC__ * 10000 + \ - __GNUC_MINOR__ * 100 + \ - __GNUC_PATCHLEVEL__ ) - -/* The following is a workaround for versions of GCC with bug 25717, in - which the preprocessor does not dump a #define directive for __STDC__ - when -dM is given: - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25717 - - We know the unconditional definition of __STDC__ was introduced no - later than version 3.0; the preprocessor bug was fixed no later than - version 4.1.0. - */ -#if ( LINT_CO_GCC_H_GCC_VERSION >= 30000 && \ - LINT_CO_GCC_H_GCC_VERSION < 40100 ) -# define __STDC__ 1 -#endif - -#if !__cplusplus && !__STRICT_ANSI__ && __STDC_VERSION__ < 199901L -/* apparently, the code is compiled with -std=gnu89 (as opposed to -std=c89), - so: */ -/*lint -rw_asgn(inline,__inline) */ -#endif - -#if LINT_CO_GCC_H_GCC_VERSION >= 40300 -# define __COUNTER__ __lint__COUNTER__ -//lint +rw( *type_traits ) // Enable type traits support -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#if _lint >= 909 // For 9.00i and later: - //// __attribute__ is GCC's __attribute__: - // - //lint -rw_asgn(__attribute__,__gcc_attribute__) - //lint -rw_asgn(__attribute, __gcc_attribute__) - // - //// Prevent "__attribute__" from being defined as a macro: - // - //lint --u"__attribute__" - //lint --u"__attribute" - // - //// Because an attribute-specifier is a form of - //// declaration-modifier, and because it can appear at the - //// beginning of a decl-specifier-seq, we must enable "Early - //// Modifiers": - // - //lint +fem -#else // for 9.00h and earlier: - //lint -d__attribute__()= - //lint -d__attribute()= -#endif - -#endif /* _lint */ -/*lint -restore */ -#endif /* CO_GCC_H_ */ diff --git a/test/nil/testbuild/pclint/co-gcc.lnt b/test/nil/testbuild/pclint/co-gcc.lnt deleted file mode 100644 index b7e1ed26b..000000000 --- a/test/nil/testbuild/pclint/co-gcc.lnt +++ /dev/null @@ -1,209 +0,0 @@ -/* Date Stamp */ -d"_lint_co_gcc_lnt=co-gcc.lnt modified 12-Jun-2014" -/* To document usage use: -message( "Using " _lint_co_gcc_lnt ) */ -// --------------------------------------------------------------------- -// This file is provided by Gimpel Software (www.gimpel.com) for use with -// its products PC-lint and FlexeLint. -// -// Redistribution and use of this file, with or without modification, is -// permitted provided that any such redistribution retains this notice. -// --------------------------------------------------------------------- -/* co-gcc.lnt: This is the seed file for configuring Lint for use with - GCC versions 2.95.3 and later. - - Like all compiler options files this file is intended to be used - as follows: - - lint co-gcc.lnt source-files-to-be-linted - - Some of the information that co-gcc.lnt requires needs to be furnished - with the help of the gcc system itself. The easiest way to generate - this information is to use the makefile co-gcc.mak (supplied with the - Lint distribution) in an invocation of GNU Make; for details, see the - commentary at the top of co-gcc.mak. -*/ - --cgnu // Notifies FlexeLint that gcc is being used. - -// =========================== -// Preprocessor Configuration: -+fdi // GCC starts its #include search in the directory of the including - // file. - -++fln // Allow: - // # digit-sequence " [s-char-sequence] " new-line - // as a synonym for: - // # line digit-sequence " [s-char-sequence] " new-line - // GCC additionally allows flag values to follow the - // s-char-sequence, but currently Lint ignores them. - --header(pclint/co-gcc.h) // Includes headers generated by GCC (bringing in - // predefined macros). -+libh(pclint/co-gcc.h) // Marks that header as library code. - -pclint/gcc-include-path.lnt // This .lnt file should contain --i options - // and should be generated by invoking gcc with its '-v' option. - // (GCC's implicit #include search path is presented in the output.) - // This happens automatically when 'make -f co-gcc.mak' is invoked. - -// Assertion directives (a feature of GCC's preprocessor) have been -// considered obsolete in GCC's documentation since version 3.0, so we do -// not use them here. If support for #assert is needed in the form of a -// lint option, one may use '-a#' like so: -// -a#machine(i386) // #assert's machine(i386) (SVR4 facility). - -// File extensions: -// From the GCC man page: -// -// file.cc -// file.cp -// file.cxx -// file.cpp -// file.CPP -// file.c++ -// file.C -// C++ source code that must be preprocessed. Note that in .cxx, the -// last two letters must both be literally x. Likewise, .C refers to -// a literal capital C. -// -// We emulate this with: - - +cpp(.cc) - +cpp(.cp) - +cpp(.cxx) - +cpp(.cpp) - +cpp(.c++) - // Note the exceptions: - // +cpp(.CPP) - // +cpp(.C) - // These are commented out for the default config because they seem to - // cause trouble more often than not. For starters, it is problematic - // with filesystems that are case-insensitive (which has become common - // even on some POSIX systems). - -// ============= -// Size Options: -// +fwc // wchar_t might be builtin; if so, uncomment this option. (NOTE: -// // this option needs to be set before a size option is given for -// // wchar_t; see the documentation for -sw# in the Lint manual.) - -pclint/size-options.lnt // This .lnt file should be generated (preferrably - // by a program created by invoking GCC with the compile options that - // are used in the compilation of the project to be linted). This - // happens automatically when 'make -f co-gcc.mak' is invoked. - - -// =========================================== -// +rw and -d options to cope with GNU syntax: -+ppw(ident) // Tolerate #ident -+ppw(warning) - -// GCC provides alternative spellings of certain keywords: -+rw(__inline) --rw_asgn(__inline__,__inline) --rw_asgn(__header_always_inline,__inline) --rw_asgn(__header_inline,__inline) - --rw_asgn(__signed__,signed) --rw_asgn(__signed,signed) --rw_asgn( __volatile__, volatile ) --rw_asgn( __volatile, volatile ) -+rw(restrict) --rw_asgn(__restrict,restrict) --rw_asgn(__restrict__,restrict) -++d"__const=const" // gconv.h uses __const rather than const -++d"const=const" // ensure const expands to const. - --rw_asgn( asm, _up_to_brackets ) --rw_asgn( __asm, _up_to_brackets ) --rw_asgn( __asm__, _up_to_brackets ) -// This re-definition of the various spellings of the asm keyword enables -// Lint to pass gracefully over expression-statements like: -// __asm __volatile ("fsqrt" : "=t" (__result) : "0" (__x)); -// But it may be necessary to suppress certain error messages that are -// triggered by tokens that are part of an assembly declaration or -// statement. For example: - -// -d"__asm__(p...)=/*lint -e{19}*/ __asm__(p)" - -// ...causes Lint to be quiet about the semicolon that follows an -// __asm__() declaration. Note, the -e{N} form of suppression takes -// effect only for the forward-declaration, definition or -// [possibly-compound] statement that immediately follows. Because a -// semicolon is seen as a declaration-terminator, Error 19 will be -// re-enabled immediately after the semicolon in '__asm__(...);'. -// (The elipsis after the macro parameter p allows zero or more commas to -// appear in the operand.) -// -// If you encounter other diagnostics that appear to need suppression in -// or near assembly regions, please let us know! -// --esym(123,__asm__) - --rw_asgn(__alignof__,__alignof) - -// "__extension__" is GCC's way of allowing the use of non-standard -// constructs in a strict Standard-conforming mode. We don't currently -// have explicit support for it, but we can use local suppressions. For -// example, we can use -e(160) so that we will not see any Errors about -// GNU statement-expressions wrapped in __extension__(). -++d"__extension__=/*lint -e(160) */" - -++d"__null=0" -+rw(_to_semi) // needed for the two macros above. -+rw(__typeof__) // activate __typeof__ keyword --d"__typeof=__typeof__" // an alternative to using __typeof__ - --rw(__except) // This MS reserved word is used as an identifier -+rw( __complex__, __real__, __imag__ ) // reserved words that can be ignored. -++d"__builtin_strchr=(char*)" // permits the inline definition ... -++d"__builtin_strpbrk=(char*)" // of these functions to be linted ... -++d"__builtin_strrchr=(char*)" // without drawing a complaint -++d"__builtin_strstr=(char*)" // about the use of a non-standard name -++d"__PRETTY_FUNCTION__=___function___" // lint defines ___function___ internally -++d"__FUNCTION__=___function___" // lint defines ___function___ internally -++d"__func__=___function___" // Some C++ modes suport the implicit __func__ - // identifier. --ident($) - -// ========================================================= -// Other options supporting GNU C/C++ syntax: -+fld // enables the processing of _L_abel _D_esignators E.g.: - // union { double d; int i; } u = { d: 3.141 }; - -// ========================================================= -// Generally useful suppressions: --wlib(1) // sets the warning level within library headers to 1 - // (no warnings, just syntax errors). Comment out if you - // are actually linting library headers. --elib(123) // 123 is really a warning, but it's in the "Error" range. --elib(93) // allow newlines within quoted string arguments to macros --elib(46) // allow bit fields to have integral types other than - // '_Bool' and 'int'. --elibsym(628) // Suppress 628 for __builtin symbols. - --esym(528,__huge_val,__nan,__qnan,__qnanf,__snan,__snanf) - // We don't care if we don't reference some GNU functions --esym(528,__gnu_malloc,__gnu_calloc) - -// The following functions exhibit variable return modes. -// That is, they may equally-usefully be called for a value -// as called just for their effects. Accordingly we inhibit -// Warning 534 for these functions. -// Feel free to add to or subtract from this list. - --esym(534,close,creat,fclose,fprintf,fputc) --esym(534,fputs,fscanf,fseek,fwrite,lseek,memcpy,memmove,memset) --esym(534,printf,puts,scanf,sprintf,sscanf,strcat,strcpy) --esym(534,strncat,strncpy,unlink,write) - -// For non-ANSI compilers we suppress messages 515 and 516 -// for functions known to have variable argument lists. -// For ANSI compilers, header files should take care of this. - --esym(515,fprintf,printf,sprintf,fscanf,scanf,sscanf) --esym(516,fprintf,printf,sprintf,fscanf,scanf,sscanf) --esym(1702,*operator<<,*operator>>) --esym(534,*operator<<,*operator>>) --esym(1055,*__builtin*) --esym(718,*__builtin*) // The compiler does not need these ... --esym(746,*__builtin*) // declared and it knows their prototypes. diff --git a/test/nil/testbuild/pclint/gcc-include-path.lnt b/test/nil/testbuild/pclint/gcc-include-path.lnt deleted file mode 100644 index 4d7cd42fd..000000000 --- a/test/nil/testbuild/pclint/gcc-include-path.lnt +++ /dev/null @@ -1,6 +0,0 @@ ---i"C:/ChibiStudio/tools/GNU Tools ARM Embedded/4.9 2015q1/arm-none-eabi/include" ---i"C:/ChibiStudio/tools/GNU Tools ARM Embedded/4.9 2015q1/arm-none-eabi/include/c++/4.9.3" ---i"C:/ChibiStudio/tools/GNU Tools ARM Embedded/4.9 2015q1/arm-none-eabi/include/c++/4.9.3/arm-none-eabi" ---i"C:/ChibiStudio/tools/GNU Tools ARM Embedded/4.9 2015q1/arm-none-eabi/include/c++/4.9.3/backward" ---i"C:/ChibiStudio/tools/GNU Tools ARM Embedded/4.9 2015q1/lib/gcc/arm-none-eabi/4.9.3/include" ---i"C:/ChibiStudio/tools/GNU Tools ARM Embedded/4.9 2015q1/lib/gcc/arm-none-eabi/4.9.3/include-fixed" diff --git a/test/nil/testbuild/pclint/lint_cmac.h b/test/nil/testbuild/pclint/lint_cmac.h deleted file mode 100644 index 3d0ae4bb7..000000000 --- a/test/nil/testbuild/pclint/lint_cmac.h +++ /dev/null @@ -1,330 +0,0 @@ -#define __DBL_MIN_EXP__ (-1021) -#define __HQ_FBIT__ 15 -#define __UINT_LEAST16_MAX__ 65535 -#define __ATOMIC_ACQUIRE 2 -#define __SFRACT_IBIT__ 0 -#define __FLT_MIN__ 1.1754943508222875e-38F -#define __UFRACT_MAX__ 0XFFFFP-16UR -#define __UINT_LEAST8_TYPE__ unsigned char -#define __DQ_FBIT__ 63 -#define __INTMAX_C(c) c ## LL -#define __ULFRACT_FBIT__ 32 -#define __SACCUM_EPSILON__ 0x1P-7HK -#define __CHAR_BIT__ 8 -#define __USQ_IBIT__ 0 -#define __UINT8_MAX__ 255 -#define __ACCUM_FBIT__ 15 -#define __WINT_MAX__ 4294967295U -#define __USFRACT_FBIT__ 8 -#define __ORDER_LITTLE_ENDIAN__ 1234 -#define __SIZE_MAX__ 4294967295U -#define __WCHAR_MAX__ 4294967295U -#define __LACCUM_IBIT__ 32 -#define __DBL_DENORM_MIN__ ((double)4.9406564584124654e-324L) -#define __GCC_ATOMIC_CHAR_LOCK_FREE 1 -#define __FLT_EVAL_METHOD__ 0 -#define __LLACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LLK -#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 1 -#define __FRACT_FBIT__ 15 -#define __UINT_FAST64_MAX__ 18446744073709551615ULL -#define __SIG_ATOMIC_TYPE__ int -#define __UACCUM_FBIT__ 16 -#define __DBL_MIN_10_EXP__ (-307) -#define __FINITE_MATH_ONLY__ 0 -#define __ARMEL__ 1 -#define __LFRACT_IBIT__ 0 -#define __GNUC_PATCHLEVEL__ 4 -#define __LFRACT_MAX__ 0X7FFFFFFFP-31LR -#define __UINT_FAST8_MAX__ 4294967295U -#define __DEC64_MAX_EXP__ 385 -#define __INT8_C(c) c -#define __UINT_LEAST64_MAX__ 18446744073709551615ULL -#define __SA_FBIT__ 15 -#define __SHRT_MAX__ 32767 -#define __LDBL_MAX__ 1.7976931348623157e+308L -#define __FRACT_MAX__ 0X7FFFP-15R -#define __UFRACT_FBIT__ 16 -#define __UFRACT_MIN__ 0.0UR -#define __UINT_LEAST8_MAX__ 255 -#define __GCC_ATOMIC_BOOL_LOCK_FREE 1 -#define __UINTMAX_TYPE__ long long unsigned int -#define __LLFRACT_EPSILON__ 0x1P-63LLR -#define __DEC32_EPSILON__ 1E-6DF -#define __CHAR_UNSIGNED__ 1 -#define __UINT32_MAX__ 4294967295UL -#define __ULFRACT_MAX__ 0XFFFFFFFFP-32ULR -#define __TA_IBIT__ 64 -#define __LDBL_MAX_EXP__ 1024 -#define __WINT_MIN__ 0U -#define __ULLFRACT_MIN__ 0.0ULLR -#define __SCHAR_MAX__ 127 -#define __WCHAR_MIN__ 0U -#define __INT64_C(c) c ## LL -#define __DBL_DIG__ 15 -#define __GCC_ATOMIC_POINTER_LOCK_FREE 1 -#define __LLACCUM_MIN__ (-0X1P31LLK-0X1P31LLK) -#define __SIZEOF_INT__ 4 -#define __SIZEOF_POINTER__ 4 -#define __USACCUM_IBIT__ 8 -#define __USER_LABEL_PREFIX__ -#define __STDC_HOSTED__ 1 -#define __LDBL_HAS_INFINITY__ 1 -#define __LFRACT_MIN__ (-0.5LR-0.5LR) -#define __HA_IBIT__ 8 -#define __TQ_IBIT__ 0 -#define __FLT_EPSILON__ 1.1920928955078125e-7F -#define __APCS_32__ 1 -#define __USFRACT_IBIT__ 0 -#define __LDBL_MIN__ 2.2250738585072014e-308L -#define __FRACT_MIN__ (-0.5R-0.5R) -#define __DEC32_MAX__ 9.999999E96DF -#define __DA_IBIT__ 32 -#define __INT32_MAX__ 2147483647L -#define __UQQ_FBIT__ 8 -#define __SIZEOF_LONG__ 4 -#define __UACCUM_MAX__ 0XFFFFFFFFP-16UK -#define __UINT16_C(c) c -#define __DECIMAL_DIG__ 17 -#define __LFRACT_EPSILON__ 0x1P-31LR -#define __ULFRACT_MIN__ 0.0ULR -#define __LDBL_HAS_QUIET_NAN__ 1 -#define __ULACCUM_IBIT__ 32 -#define __UACCUM_EPSILON__ 0x1P-16UK -#define __GNUC__ 4 -#define __ULLACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULLK -#define __HQ_IBIT__ 0 -#define __FLT_HAS_DENORM__ 1 -#define __SIZEOF_LONG_DOUBLE__ 8 -#define __BIGGEST_ALIGNMENT__ 8 -#define __DQ_IBIT__ 0 -#define __DBL_MAX__ ((double)1.7976931348623157e+308L) -#define __ULFRACT_IBIT__ 0 -#define __INT_FAST32_MAX__ 2147483647 -#define __DBL_HAS_INFINITY__ 1 -#define __ACCUM_IBIT__ 16 -#define __DEC32_MIN_EXP__ (-94) -#define __THUMB_INTERWORK__ 1 -#define __LACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LK -#define __INT_FAST16_TYPE__ int -#define __LDBL_HAS_DENORM__ 1 -#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL -#define __INT_LEAST32_MAX__ 2147483647L -#define __ARM_PCS 1 -#define __DEC32_MIN__ 1E-95DF -#define __ACCUM_MAX__ 0X7FFFFFFFP-15K -#define __DBL_MAX_EXP__ 1024 -#define __USACCUM_EPSILON__ 0x1P-8UHK -#define __DEC128_EPSILON__ 1E-33DL -#define __SFRACT_MAX__ 0X7FP-7HR -#define __FRACT_IBIT__ 0 -#define __PTRDIFF_MAX__ 2147483647 -#define __UACCUM_MIN__ 0.0UK -#define __UACCUM_IBIT__ 16 -#define __LONG_LONG_MAX__ 9223372036854775807LL -#define __SIZEOF_SIZE_T__ 4 -#define __ULACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULK -#define __SIZEOF_WINT_T__ 4 -#define __SA_IBIT__ 16 -#define __ULLACCUM_MIN__ 0.0ULLK -#define __GXX_ABI_VERSION 1002 -#define __UTA_FBIT__ 64 -#define __SOFTFP__ 1 -#define __FLT_MIN_EXP__ (-125) -#define __USFRACT_MAX__ 0XFFP-8UHR -#define __UFRACT_IBIT__ 0 -#define __INT_FAST64_TYPE__ long long int -#define __DBL_MIN__ ((double)2.2250738585072014e-308L) -#define __LACCUM_MIN__ (-0X1P31LK-0X1P31LK) -#define __ULLACCUM_FBIT__ 32 -#define __GXX_TYPEINFO_EQUALITY_INLINE 0 -#define __ULLFRACT_EPSILON__ 0x1P-64ULLR -#define __USES_INITFINI__ 1 -#define __DEC128_MIN__ 1E-6143DL -#define __REGISTER_PREFIX__ -#define __UINT16_MAX__ 65535 -#define __DBL_HAS_DENORM__ 1 -#define __ACCUM_MIN__ (-0X1P15K-0X1P15K) -#define __SQ_IBIT__ 0 -#define __UINT8_TYPE__ unsigned char -#define __UHA_FBIT__ 8 -#define __NO_INLINE__ 1 -#define __SFRACT_MIN__ (-0.5HR-0.5HR) -#define __UTQ_FBIT__ 128 -#define __FLT_MANT_DIG__ 24 -#define __VERSION__ "4.7.4 20130913 (release) [ARM/embedded-4_7-branch revision 202601]" -#define __UINT64_C(c) c ## ULL -#define __ULLFRACT_FBIT__ 64 -#define __FRACT_EPSILON__ 0x1P-15R -#define __ULACCUM_MIN__ 0.0ULK -#define __UDA_FBIT__ 32 -#define __LLACCUM_EPSILON__ 0x1P-31LLK -#define __GCC_ATOMIC_INT_LOCK_FREE 1 -#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __USFRACT_MIN__ 0.0UHR -#define __UQQ_IBIT__ 0 -#define __INT32_C(c) c ## L -#define __DEC64_EPSILON__ 1E-15DD -#define __ORDER_PDP_ENDIAN__ 3412 -#define __DEC128_MIN_EXP__ (-6142) -#define __UHQ_FBIT__ 16 -#define __LLACCUM_FBIT__ 31 -#define __INT_FAST32_TYPE__ int -#define __UINT_LEAST16_TYPE__ short unsigned int -#define __INT16_MAX__ 32767 -#define __SIZE_TYPE__ unsigned int -#define __UINT64_MAX__ 18446744073709551615ULL -#define __UDQ_FBIT__ 64 -#define __INT8_TYPE__ signed char -#define __ELF__ 1 -#define __ULFRACT_EPSILON__ 0x1P-32ULR -#define __LLFRACT_FBIT__ 63 -#define __FLT_RADIX__ 2 -#define __INT_LEAST16_TYPE__ short int -#define __LDBL_EPSILON__ 2.2204460492503131e-16L -#define __UINTMAX_C(c) c ## ULL -#define __SACCUM_MAX__ 0X7FFFP-7HK -#define __SIG_ATOMIC_MAX__ 2147483647 -#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 1 -#define __VFP_FP__ 1 -#define __SIZEOF_PTRDIFF_T__ 4 -#define __LACCUM_EPSILON__ 0x1P-31LK -#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF -#define __INT_FAST16_MAX__ 2147483647 -#define __UINT_FAST32_MAX__ 4294967295U -#define __UINT_LEAST64_TYPE__ long long unsigned int -#define __USACCUM_MAX__ 0XFFFFP-8UHK -#define __SFRACT_EPSILON__ 0x1P-7HR -#define __FLT_HAS_QUIET_NAN__ 1 -#define __FLT_MAX_10_EXP__ 38 -#define __LONG_MAX__ 2147483647L -#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL -#define __FLT_HAS_INFINITY__ 1 -#define __USA_FBIT__ 16 -#define __UINT_FAST16_TYPE__ unsigned int -#define __DEC64_MAX__ 9.999999999999999E384DD -#define __CHAR16_TYPE__ short unsigned int -#define __PRAGMA_REDEFINE_EXTNAME 1 -#define __INT_LEAST16_MAX__ 32767 -#define __DEC64_MANT_DIG__ 16 -#define __INT64_MAX__ 9223372036854775807LL -#define __UINT_LEAST32_MAX__ 4294967295UL -#define __SACCUM_FBIT__ 7 -#define __GCC_ATOMIC_LONG_LOCK_FREE 1 -#define __INT_LEAST64_TYPE__ long long int -#define __INT16_TYPE__ short int -#define __INT_LEAST8_TYPE__ signed char -#define __SQ_FBIT__ 31 -#define __DEC32_MAX_EXP__ 97 -#define __INT_FAST8_MAX__ 2147483647 -#define __INTPTR_MAX__ 2147483647 -#define __QQ_FBIT__ 7 -#define __UTA_IBIT__ 64 -#define __LDBL_MANT_DIG__ 53 -#define __SFRACT_FBIT__ 7 -#define __SACCUM_MIN__ (-0X1P7HK-0X1P7HK) -#define __DBL_HAS_QUIET_NAN__ 1 -#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) -#define __INTPTR_TYPE__ int -#define __UINT16_TYPE__ short unsigned int -#define __WCHAR_TYPE__ unsigned int -#define __SIZEOF_FLOAT__ 4 -#define __USQ_FBIT__ 32 -#define __UINTPTR_MAX__ 4294967295U -#define __DEC64_MIN_EXP__ (-382) -#define __ULLACCUM_IBIT__ 32 -#define __INT_FAST64_MAX__ 9223372036854775807LL -#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 -#define __FLT_DIG__ 6 -#define __UINT_FAST64_TYPE__ long long unsigned int -#define __INT_MAX__ 2147483647 -#define __LACCUM_FBIT__ 31 -#define __USACCUM_MIN__ 0.0UHK -#define __UHA_IBIT__ 8 -#define __INT64_TYPE__ long long int -#define __FLT_MAX_EXP__ 128 -#define __UTQ_IBIT__ 0 -#define __DBL_MANT_DIG__ 53 -#define __INT_LEAST64_MAX__ 9223372036854775807LL -#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 1 -#define __DEC64_MIN__ 1E-383DD -#define __WINT_TYPE__ unsigned int -#define __UINT_LEAST32_TYPE__ long unsigned int -#define __SIZEOF_SHORT__ 2 -#define __ULLFRACT_IBIT__ 0 -#define __LDBL_MIN_EXP__ (-1021) -#define __arm__ 1 -#define __UDA_IBIT__ 32 -#define __INT_LEAST8_MAX__ 127 -#define __LFRACT_FBIT__ 31 -#define __LDBL_MAX_10_EXP__ 308 -#define __ATOMIC_RELAXED 0 -#define __DBL_EPSILON__ ((double)2.2204460492503131e-16L) -#define __UINT8_C(c) c -#define __INT_LEAST32_TYPE__ long int -#define __SIZEOF_WCHAR_T__ 4 -#define __UINT64_TYPE__ long long unsigned int -#define __LLFRACT_MAX__ 0X7FFFFFFFFFFFFFFFP-63LLR -#define __TQ_FBIT__ 127 -#define __INT_FAST8_TYPE__ int -#define __ULLACCUM_EPSILON__ 0x1P-32ULLK -#define __UHQ_IBIT__ 0 -#define __LLACCUM_IBIT__ 32 -#define __DBL_DECIMAL_DIG__ 17 -#define __DEC_EVAL_METHOD__ 2 -#define __TA_FBIT__ 63 -#define __UDQ_IBIT__ 0 -#define __ORDER_BIG_ENDIAN__ 4321 -#define __ACCUM_EPSILON__ 0x1P-15K -#define __UINT32_C(c) c ## UL -#define __INTMAX_MAX__ 9223372036854775807LL -#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F -#define __LLFRACT_IBIT__ 0 -#define __INT8_MAX__ 127 -#define __UINT_FAST32_TYPE__ unsigned int -#define __CHAR32_TYPE__ long unsigned int -#define __FLT_MAX__ 3.4028234663852886e+38F -#define __USACCUM_FBIT__ 8 -#define __INT32_TYPE__ long int -#define __SIZEOF_DOUBLE__ 8 -#define __FLT_MIN_10_EXP__ (-37) -#define __UFRACT_EPSILON__ 0x1P-16UR -#define __INTMAX_TYPE__ long long int -#define __DEC128_MAX_EXP__ 6145 -#define __ATOMIC_CONSUME 1 -#define __GNUC_MINOR__ 7 -#define __UINTMAX_MAX__ 18446744073709551615ULL -#define __DEC32_MANT_DIG__ 7 -#define __HA_FBIT__ 7 -#define __DBL_MAX_10_EXP__ 308 -#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L -#define __INT16_C(c) c -#define __STDC__ 1 -#define __ARM_ARCH_4T__ 1 -#define __PTRDIFF_TYPE__ int -#define __LLFRACT_MIN__ (-0.5LLR-0.5LLR) -#define __ATOMIC_SEQ_CST 5 -#define __DA_FBIT__ 31 -#define __UINT32_TYPE__ long unsigned int -#define __UINTPTR_TYPE__ unsigned int -#define __USA_IBIT__ 16 -#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD -#define __ARM_EABI__ 1 -#define __DEC128_MANT_DIG__ 34 -#define __LDBL_MIN_10_EXP__ (-307) -#define __SIZEOF_LONG_LONG__ 8 -#define __ULACCUM_EPSILON__ 0x1P-32ULK -#define __SACCUM_IBIT__ 8 -#define __GCC_ATOMIC_LLONG_LOCK_FREE 1 -#define __LDBL_DIG__ 15 -#define __FLT_DECIMAL_DIG__ 9 -#define __UINT_FAST16_MAX__ 4294967295U -#define __GNUC_GNU_INLINE__ 1 -#define __GCC_ATOMIC_SHORT_LOCK_FREE 1 -#define __ULLFRACT_MAX__ 0XFFFFFFFFFFFFFFFFP-64ULLR -#define __UINT_FAST8_TYPE__ unsigned int -#define __USFRACT_EPSILON__ 0x1P-8UHR -#define __ULACCUM_FBIT__ 32 -#define __QQ_IBIT__ 0 -#define __ATOMIC_ACQ_REL 4 -#define __ATOMIC_RELEASE 3 diff --git a/test/nil/testbuild/pclint/lint_cppmac.h b/test/nil/testbuild/pclint/lint_cppmac.h deleted file mode 100644 index 5e63a1f3b..000000000 --- a/test/nil/testbuild/pclint/lint_cppmac.h +++ /dev/null @@ -1,336 +0,0 @@ -#define __DBL_MIN_EXP__ (-1021) -#define __HQ_FBIT__ 15 -#define __UINT_LEAST16_MAX__ 65535 -#define __ATOMIC_ACQUIRE 2 -#define __SFRACT_IBIT__ 0 -#define __FLT_MIN__ 1.1754943508222875e-38F -#define __UFRACT_MAX__ 0XFFFFP-16UR -#define __UINT_LEAST8_TYPE__ unsigned char -#define __DQ_FBIT__ 63 -#define __INTMAX_C(c) c ## LL -#define __ULFRACT_FBIT__ 32 -#define __SACCUM_EPSILON__ 0x1P-7HK -#define __CHAR_BIT__ 8 -#define __USQ_IBIT__ 0 -#define __UINT8_MAX__ 255 -#define __ACCUM_FBIT__ 15 -#define __WINT_MAX__ 4294967295U -#define __USFRACT_FBIT__ 8 -#define __ORDER_LITTLE_ENDIAN__ 1234 -#define __SIZE_MAX__ 4294967295U -#define __WCHAR_MAX__ 4294967295U -#define __LACCUM_IBIT__ 32 -#define __DBL_DENORM_MIN__ double(4.9406564584124654e-324L) -#define __GCC_ATOMIC_CHAR_LOCK_FREE 1 -#define __FLT_EVAL_METHOD__ 0 -#define __LLACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LLK -#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 1 -#define __FRACT_FBIT__ 15 -#define __UINT_FAST64_MAX__ 18446744073709551615ULL -#define __SIG_ATOMIC_TYPE__ int -#define __UACCUM_FBIT__ 16 -#define __DBL_MIN_10_EXP__ (-307) -#define __FINITE_MATH_ONLY__ 0 -#define __ARMEL__ 1 -#define __LFRACT_IBIT__ 0 -#define __GNUC_PATCHLEVEL__ 4 -#define __LFRACT_MAX__ 0X7FFFFFFFP-31LR -#define __UINT_FAST8_MAX__ 4294967295U -#define __DEC64_MAX_EXP__ 385 -#define __INT8_C(c) c -#define __UINT_LEAST64_MAX__ 18446744073709551615ULL -#define __SA_FBIT__ 15 -#define __SHRT_MAX__ 32767 -#define __LDBL_MAX__ 1.7976931348623157e+308L -#define __FRACT_MAX__ 0X7FFFP-15R -#define __UFRACT_FBIT__ 16 -#define __UFRACT_MIN__ 0.0UR -#define __UINT_LEAST8_MAX__ 255 -#define __GCC_ATOMIC_BOOL_LOCK_FREE 1 -#define __UINTMAX_TYPE__ long long unsigned int -#define __LLFRACT_EPSILON__ 0x1P-63LLR -#define __DEC32_EPSILON__ 1E-6DF -#define __CHAR_UNSIGNED__ 1 -#define __UINT32_MAX__ 4294967295UL -#define __ULFRACT_MAX__ 0XFFFFFFFFP-32ULR -#define __TA_IBIT__ 64 -#define __LDBL_MAX_EXP__ 1024 -#define __WINT_MIN__ 0U -#define __ULLFRACT_MIN__ 0.0ULLR -#define __SCHAR_MAX__ 127 -#define __WCHAR_MIN__ 0U -#define __INT64_C(c) c ## LL -#define __DBL_DIG__ 15 -#define __GCC_ATOMIC_POINTER_LOCK_FREE 1 -#define __LLACCUM_MIN__ (-0X1P31LLK-0X1P31LLK) -#define __SIZEOF_INT__ 4 -#define __SIZEOF_POINTER__ 4 -#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 1 -#define __USACCUM_IBIT__ 8 -#define __USER_LABEL_PREFIX__ -#define __STDC_HOSTED__ 1 -#define __LDBL_HAS_INFINITY__ 1 -#define __LFRACT_MIN__ (-0.5LR-0.5LR) -#define __HA_IBIT__ 8 -#define __TQ_IBIT__ 0 -#define __FLT_EPSILON__ 1.1920928955078125e-7F -#define __APCS_32__ 1 -#define __GXX_WEAK__ 1 -#define __USFRACT_IBIT__ 0 -#define __LDBL_MIN__ 2.2250738585072014e-308L -#define __FRACT_MIN__ (-0.5R-0.5R) -#define __DEC32_MAX__ 9.999999E96DF -#define __DA_IBIT__ 32 -#define __INT32_MAX__ 2147483647L -#define __UQQ_FBIT__ 8 -#define __SIZEOF_LONG__ 4 -#define __UACCUM_MAX__ 0XFFFFFFFFP-16UK -#define __UINT16_C(c) c -#define __DECIMAL_DIG__ 17 -#define __LFRACT_EPSILON__ 0x1P-31LR -#define __ULFRACT_MIN__ 0.0ULR -#define __LDBL_HAS_QUIET_NAN__ 1 -#define __ULACCUM_IBIT__ 32 -#define __UACCUM_EPSILON__ 0x1P-16UK -#define __GNUC__ 4 -#define __ULLACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULLK -#define __HQ_IBIT__ 0 -#define __FLT_HAS_DENORM__ 1 -#define __SIZEOF_LONG_DOUBLE__ 8 -#define __BIGGEST_ALIGNMENT__ 8 -#define __DQ_IBIT__ 0 -#define __DBL_MAX__ double(1.7976931348623157e+308L) -#define __ULFRACT_IBIT__ 0 -#define __INT_FAST32_MAX__ 2147483647 -#define __DBL_HAS_INFINITY__ 1 -#define __INT64_MAX__ 9223372036854775807LL -#define __ACCUM_IBIT__ 16 -#define __DEC32_MIN_EXP__ (-94) -#define __THUMB_INTERWORK__ 1 -#define __LACCUM_MAX__ 0X7FFFFFFFFFFFFFFFP-31LK -#define __INT_FAST16_TYPE__ int -#define __LDBL_HAS_DENORM__ 1 -#define __cplusplus 199711L -#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL -#define __INT_LEAST32_MAX__ 2147483647L -#define __ARM_PCS 1 -#define __DEC32_MIN__ 1E-95DF -#define __ACCUM_MAX__ 0X7FFFFFFFP-15K -#define __DEPRECATED 1 -#define __DBL_MAX_EXP__ 1024 -#define __USACCUM_EPSILON__ 0x1P-8UHK -#define __DEC128_EPSILON__ 1E-33DL -#define __SFRACT_MAX__ 0X7FP-7HR -#define __FRACT_IBIT__ 0 -#define __PTRDIFF_MAX__ 2147483647 -#define __UACCUM_MIN__ 0.0UK -#define __UACCUM_IBIT__ 16 -#define __GNUG__ 4 -#define __LONG_LONG_MAX__ 9223372036854775807LL -#define __SIZEOF_SIZE_T__ 4 -#define __ULACCUM_MAX__ 0XFFFFFFFFFFFFFFFFP-32ULK -#define __SIZEOF_WINT_T__ 4 -#define __SA_IBIT__ 16 -#define __ULLACCUM_MIN__ 0.0ULLK -#define __GXX_ABI_VERSION 1002 -#define __UTA_FBIT__ 64 -#define __SOFTFP__ 1 -#define __FLT_MIN_EXP__ (-125) -#define __USFRACT_MAX__ 0XFFP-8UHR -#define __UFRACT_IBIT__ 0 -#define __INT_FAST64_TYPE__ long long int -#define __DBL_MIN__ double(2.2250738585072014e-308L) -#define __FLT_MIN_10_EXP__ (-37) -#define __LACCUM_MIN__ (-0X1P31LK-0X1P31LK) -#define __ULLACCUM_FBIT__ 32 -#define __GXX_TYPEINFO_EQUALITY_INLINE 0 -#define __ULLFRACT_EPSILON__ 0x1P-64ULLR -#define __USES_INITFINI__ 1 -#define __DEC128_MIN__ 1E-6143DL -#define __REGISTER_PREFIX__ -#define __UINT16_MAX__ 65535 -#define __DBL_HAS_DENORM__ 1 -#define __ACCUM_MIN__ (-0X1P15K-0X1P15K) -#define __SQ_IBIT__ 0 -#define __UINT8_TYPE__ unsigned char -#define __UHA_FBIT__ 8 -#define __NO_INLINE__ 1 -#define __SFRACT_MIN__ (-0.5HR-0.5HR) -#define __UTQ_FBIT__ 128 -#define __FLT_MANT_DIG__ 24 -#define __VERSION__ "4.7.4 20130913 (release) [ARM/embedded-4_7-branch revision 202601]" -#define __UINT64_C(c) c ## ULL -#define __ULLFRACT_FBIT__ 64 -#define __FRACT_EPSILON__ 0x1P-15R -#define __ULACCUM_MIN__ 0.0ULK -#define __UDA_FBIT__ 32 -#define __LLACCUM_EPSILON__ 0x1P-31LLK -#define __GCC_ATOMIC_INT_LOCK_FREE 1 -#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __USFRACT_MIN__ 0.0UHR -#define __ULLACCUM_IBIT__ 32 -#define __UQQ_IBIT__ 0 -#define __INT32_C(c) c ## L -#define __DEC64_EPSILON__ 1E-15DD -#define __ORDER_PDP_ENDIAN__ 3412 -#define __DEC128_MIN_EXP__ (-6142) -#define __UHQ_FBIT__ 16 -#define __LLACCUM_FBIT__ 31 -#define __INT_FAST32_TYPE__ int -#define __UINT_LEAST16_TYPE__ short unsigned int -#define __INT16_MAX__ 32767 -#define __SIZE_TYPE__ unsigned int -#define __UINT64_MAX__ 18446744073709551615ULL -#define __UDQ_FBIT__ 64 -#define __INT8_TYPE__ signed char -#define __ELF__ 1 -#define __ULFRACT_EPSILON__ 0x1P-32ULR -#define __LLFRACT_FBIT__ 63 -#define __FLT_RADIX__ 2 -#define __INT_LEAST16_TYPE__ short int -#define __LDBL_EPSILON__ 2.2204460492503131e-16L -#define __UINTMAX_C(c) c ## ULL -#define __SACCUM_MAX__ 0X7FFFP-7HK -#define __SIG_ATOMIC_MAX__ 2147483647 -#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 1 -#define __VFP_FP__ 1 -#define __SIZEOF_PTRDIFF_T__ 4 -#define __LACCUM_EPSILON__ 0x1P-31LK -#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF -#define __INT_FAST16_MAX__ 2147483647 -#define __UINT_FAST32_MAX__ 4294967295U -#define __UINT_LEAST64_TYPE__ long long unsigned int -#define __USACCUM_MAX__ 0XFFFFP-8UHK -#define __SFRACT_EPSILON__ 0x1P-7HR -#define __FLT_HAS_QUIET_NAN__ 1 -#define __FLT_MAX_10_EXP__ 38 -#define __LONG_MAX__ 2147483647L -#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL -#define __FLT_HAS_INFINITY__ 1 -#define __USA_FBIT__ 16 -#define __UINT_FAST16_TYPE__ unsigned int -#define __DEC64_MAX__ 9.999999999999999E384DD -#define __CHAR16_TYPE__ short unsigned int -#define __PRAGMA_REDEFINE_EXTNAME 1 -#define __INT_LEAST16_MAX__ 32767 -#define __DEC64_MANT_DIG__ 16 -#define __UINT_LEAST32_MAX__ 4294967295UL -#define __SACCUM_FBIT__ 7 -#define __GCC_ATOMIC_LONG_LOCK_FREE 1 -#define __INT_LEAST64_TYPE__ long long int -#define __INT16_TYPE__ short int -#define __INT_LEAST8_TYPE__ signed char -#define __SQ_FBIT__ 31 -#define __DEC32_MAX_EXP__ 97 -#define __INT_FAST8_MAX__ 2147483647 -#define __INTPTR_MAX__ 2147483647 -#define __QQ_FBIT__ 7 -#define __UTA_IBIT__ 64 -#define __EXCEPTIONS 1 -#define __LDBL_MANT_DIG__ 53 -#define __SFRACT_FBIT__ 7 -#define __SACCUM_MIN__ (-0X1P7HK-0X1P7HK) -#define __DBL_HAS_QUIET_NAN__ 1 -#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) -#define __INTPTR_TYPE__ int -#define __UINT16_TYPE__ short unsigned int -#define __WCHAR_TYPE__ unsigned int -#define __SIZEOF_FLOAT__ 4 -#define __USQ_FBIT__ 32 -#define __UINTPTR_MAX__ 4294967295U -#define __DEC64_MIN_EXP__ (-382) -#define __INT_FAST64_MAX__ 9223372036854775807LL -#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 -#define __FLT_DIG__ 6 -#define __UINT_FAST64_TYPE__ long long unsigned int -#define __INT_MAX__ 2147483647 -#define __LACCUM_FBIT__ 31 -#define __USACCUM_MIN__ 0.0UHK -#define __UHA_IBIT__ 8 -#define __INT64_TYPE__ long long int -#define __FLT_MAX_EXP__ 128 -#define __UTQ_IBIT__ 0 -#define __DBL_MANT_DIG__ 53 -#define __INT_LEAST64_MAX__ 9223372036854775807LL -#define __DEC64_MIN__ 1E-383DD -#define __WINT_TYPE__ unsigned int -#define __UINT_LEAST32_TYPE__ long unsigned int -#define __SIZEOF_SHORT__ 2 -#define __ULLFRACT_IBIT__ 0 -#define __LDBL_MIN_EXP__ (-1021) -#define __arm__ 1 -#define __UDA_IBIT__ 32 -#define __INT_LEAST8_MAX__ 127 -#define __LFRACT_FBIT__ 31 -#define __WCHAR_UNSIGNED__ 1 -#define __LDBL_MAX_10_EXP__ 308 -#define __ATOMIC_RELAXED 0 -#define __DBL_EPSILON__ double(2.2204460492503131e-16L) -#define __UINT8_C(c) c -#define __INT_LEAST32_TYPE__ long int -#define __SIZEOF_WCHAR_T__ 4 -#define __UINT64_TYPE__ long long unsigned int -#define __LLFRACT_MAX__ 0X7FFFFFFFFFFFFFFFP-63LLR -#define __TQ_FBIT__ 127 -#define __INT_FAST8_TYPE__ int -#define __ULLACCUM_EPSILON__ 0x1P-32ULLK -#define __UHQ_IBIT__ 0 -#define __LLACCUM_IBIT__ 32 -#define __DBL_DECIMAL_DIG__ 17 -#define __DEC_EVAL_METHOD__ 2 -#define __TA_FBIT__ 63 -#define __UDQ_IBIT__ 0 -#define __ORDER_BIG_ENDIAN__ 4321 -#define __ACCUM_EPSILON__ 0x1P-15K -#define __UINT32_C(c) c ## UL -#define __INTMAX_MAX__ 9223372036854775807LL -#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F -#define __LLFRACT_IBIT__ 0 -#define __INT8_MAX__ 127 -#define __UINT_FAST32_TYPE__ unsigned int -#define __CHAR32_TYPE__ long unsigned int -#define __FLT_MAX__ 3.4028234663852886e+38F -#define __USACCUM_FBIT__ 8 -#define __INT32_TYPE__ long int -#define __SIZEOF_DOUBLE__ 8 -#define __UFRACT_EPSILON__ 0x1P-16UR -#define __INTMAX_TYPE__ long long int -#define __DEC128_MAX_EXP__ 6145 -#define __ATOMIC_CONSUME 1 -#define __GNUC_MINOR__ 7 -#define __UINTMAX_MAX__ 18446744073709551615ULL -#define __DEC32_MANT_DIG__ 7 -#define __HA_FBIT__ 7 -#define __DBL_MAX_10_EXP__ 308 -#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L -#define __INT16_C(c) c -#define __STDC__ 1 -#define __ARM_ARCH_4T__ 1 -#define __PTRDIFF_TYPE__ int -#define __LLFRACT_MIN__ (-0.5LLR-0.5LLR) -#define __ATOMIC_SEQ_CST 5 -#define __DA_FBIT__ 31 -#define __UINT32_TYPE__ long unsigned int -#define __UINTPTR_TYPE__ unsigned int -#define __USA_IBIT__ 16 -#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD -#define __ARM_EABI__ 1 -#define __DEC128_MANT_DIG__ 34 -#define __LDBL_MIN_10_EXP__ (-307) -#define __SIZEOF_LONG_LONG__ 8 -#define __ULACCUM_EPSILON__ 0x1P-32ULK -#define __SACCUM_IBIT__ 8 -#define __GCC_ATOMIC_LLONG_LOCK_FREE 1 -#define __LDBL_DIG__ 15 -#define __FLT_DECIMAL_DIG__ 9 -#define __UINT_FAST16_MAX__ 4294967295U -#define __GNUC_GNU_INLINE__ 1 -#define __GCC_ATOMIC_SHORT_LOCK_FREE 1 -#define __ULLFRACT_MAX__ 0XFFFFFFFFFFFFFFFFP-64ULLR -#define __UINT_FAST8_TYPE__ unsigned int -#define __USFRACT_EPSILON__ 0x1P-8UHR -#define __ULACCUM_FBIT__ 32 -#define __QQ_IBIT__ 0 -#define __ATOMIC_ACQ_REL 4 -#define __ATOMIC_RELEASE 3 diff --git a/test/nil/testbuild/pclint/size-options.lnt b/test/nil/testbuild/pclint/size-options.lnt deleted file mode 100644 index 8f632b6b8..000000000 --- a/test/nil/testbuild/pclint/size-options.lnt +++ /dev/null @@ -1 +0,0 @@ --ss2 -si4 -sl4 -sll8 -sf4 -sd8 -sld8 -sp4 -sw2 \ No newline at end of file diff --git a/test/nil/testbuild/pclint/waivers.lnt b/test/nil/testbuild/pclint/waivers.lnt deleted file mode 100644 index 632a01e0b..000000000 --- a/test/nil/testbuild/pclint/waivers.lnt +++ /dev/null @@ -1,116 +0,0 @@ -/* MISRA checks are not performed in header files marked as libraries or - vendor-provided files or belonging to other subsystems.*/ --e686 /* Silencing warning on -elib(*) */ --elib(*) /* No checks on library files. */ -+libclass(angle,ansi) -+libh(core_cm4.h) -+libh(stm32*.h) -+libh(*_lld.h) - -/* Reinforcing type checking for some critical types even if not required by - MISRA.*/ --strong(AJX, systime_t) --strong(AJX, rtcnt_t) --strong(AJX, rttime_t) --strong(AJX, syssts_t) --strong(AJX, msg_t) --strong(AJX, cnt_t) --strong(AJX, ucnt_t) --strong(AJX, tstate_t) --strong(AJX, eventmask_t) - -/* Permitting anonymous unions.*/ -+fan - -/* Silencing common non-MISRA info generated by PCLint in -w3 mode. All of - them have been controlled. Other infos have been fixed in the code. - Remove temporarily the following -e in order to perform extra code quality - checks.*/ --e526 -e537 -e552 --e611 -e613 --e714 -e716 -e717 -e749 -e750 -e754 -e757 -e758 -e759 -e766 -e768 -e769 -e773 -e778 -e793 --e826 -e830 -e835 -e845 - -/* Removing *advisory* directives and rules that would negatively impact - code readability or not avoidable.*/ --e970 /* Dir-4.6 */ --e9045 /* Dir-4.8 */ --e9026 /* Dir-4.9 */ --e756 /* Rule-2.3 */ --e9058 /* Rule-2.4 */ --e755 /* Rule-2.5 */ --e9003 /* Rule-8.9 */ --e9067 /* Rule-8.11 */ --e818 /* Rule 8.13 */ --e9078 /* Rule-11.4 */ --e9079 /* Rule-11.5 */ --e9049 /* Rule-13.3 */ --e9084 /* Rule-13.4 */ --e801 /* Rule-15.1 */ --e9011 /* Rule-15.4 */ --e904 /* Rule-15.5 */ --e9044 /* Rule-17.8 */ --e9016 /* Rule-18.4 */ --e844 -e954 /* Rule-18.13 */ --e9018 /* Rule-19.2 */ --e9024 /* Rule-20.10 */ - -/* Waiver Directive 2.1, Rule 1.1, Rule 1.2, assembler is allowed in some - modules.*/ --e950 - -/* Waiver Directive 4.10, PCLint is confused by the guard used in the CMSIS - header files, the guard is present, suppressing the noise.*/ --e451 - -/* Waiver Rule 2.2, PCLint marks as pure functions that contain just asm - code, this does not mean that those functions do nothing.*/ --e522 - -/* Waiver Rule 3.1, the sequence "//" is mandated by standard license - headers included on top of all source files. The sequence is part of the - license URL and cannot be removed.*/ --e9059 - -/* Waiver Rule 8.4, this rule is disabled for the main() function only because - it, of course, does not have nor requires a prior declaration.*/ --esym(9075, main) - -/* Waiver Rule 8.7, the static analyzer has no visibility of functions called - from asm modules.*/ --e765 - -/* Waiver Rule 11.1, casts of function pointers are required by system - design.*/ --e9074 - -/* Waiver Rule 11.3, casts among different types are required by system - design.*/ --e740 /* Wrongly marked as 1.3 in PCLint 9.00L.*/ --e9087 - -/* Waiver Rule 11.6, cast from integer to pointer is very commonly used - when accessing peripherals where the numeric address of the registers - block is cast to a structure pointer.*/ --e923 - -/* Waiver Rule 16.1, missing break into case. It is a common occurrence and - thoroughly checked.*/ -/* Waiver Rule 16.3, missing break into case. It is a common occurrence and - thoroughly checked.*/ --e9090 --e9077 --e9042 --e616 --e825 - -/* Waiver Rule 18.2, pointers arithmetic is required by system design and - deemed safe.*/ -/* Waiver Rule 18.3, comparisons among pointers is required by system design - and deemed safe.*/ --e946 --e947 - -/* Waiver Rule 21.1, this is an operating system, its identifiers are - equivalent in importance to compiler symbols.*/ --e9071