mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-12 09:07:46 -04:00
Merge remote-tracking branch 'upstream/master' into tickless-idle-improvements
This commit is contained in:
commit
d904c9aca2
500 changed files with 59009 additions and 49997 deletions
2
.github/ISSUE_TEMPLATE/bug-report.md
vendored
2
.github/ISSUE_TEMPLATE/bug-report.md
vendored
|
@ -34,3 +34,5 @@ If applicable, add screenshots to help explain your problem.
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
e.g. code snippet to reproduce the issue.
|
e.g. code snippet to reproduce the issue.
|
||||||
e.g. stack trace, memory dump, debugger log, and many etc.
|
e.g. stack trace, memory dump, debugger log, and many etc.
|
||||||
|
|
||||||
|
<!-- For general inquiries, please post in [FreeRTOS forum](https://forums.FreeRTOS.org) for community support. -->
|
||||||
|
|
|
@ -19,3 +19,5 @@ If applicable, please attach screenshot.
|
||||||
**Browser**
|
**Browser**
|
||||||
- Browser: [e.g. Chrome]
|
- Browser: [e.g. Chrome]
|
||||||
- Version: [e.g. 80.0.3987.132]
|
- Version: [e.g. 80.0.3987.132]
|
||||||
|
|
||||||
|
<!-- For general inquiries, please post in [FreeRTOS forum](https://forums.FreeRTOS.org) for community support. -->
|
||||||
|
|
12
.github/ISSUE_TEMPLATE/general-inquiry.md
vendored
12
.github/ISSUE_TEMPLATE/general-inquiry.md
vendored
|
@ -1,12 +0,0 @@
|
||||||
---
|
|
||||||
name: General inquiry
|
|
||||||
about: Free form communication.
|
|
||||||
title: "[Inquiry]"
|
|
||||||
labels: question
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
We do encourage you to take a look at [FreeRTOS official site](https://www.freertos.org) for general information and [FreeRTOS forum](https://forums.freertos.org) to access our community.
|
|
||||||
|
|
||||||
If still needed, could create a general inquiry report here.
|
|
|
@ -41,7 +41,7 @@ To send us a pull request, please:
|
||||||
|
|
||||||
1. Fork the repository.
|
1. Fork the repository.
|
||||||
2. Modify the source; focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change.
|
2. Modify the source; focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change.
|
||||||
3. Follow the [coding style guide](https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html).
|
3. Follow the [coding style guide](https://www.FreeRTOS.org/FreeRTOS-Coding-Standard-and-Style-Guide.html).
|
||||||
4. Commit to your fork using clear commit messages.
|
4. Commit to your fork using clear commit messages.
|
||||||
5. Send us a pull request, answering any default questions in the pull request interface.
|
5. Send us a pull request, answering any default questions in the pull request interface.
|
||||||
NOTE: Please make sure the default option (Allow edits from maintainers) is left checked.
|
NOTE: Please make sure the default option (Allow edits from maintainers) is left checked.
|
||||||
|
@ -51,7 +51,7 @@ GitHub provides additional document on [forking a repository](https://help.githu
|
||||||
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
|
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
|
||||||
|
|
||||||
## Coding style
|
## Coding style
|
||||||
* Please ensure that your code complies to the [FreeRTOS coding style guidelines](https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html).
|
* Please ensure that your code complies to the [FreeRTOS coding style guidelines](https://www.FreeRTOS.org/FreeRTOS-Coding-Standard-and-Style-Guide.html).
|
||||||
|
|
||||||
|
|
||||||
## Getting your pull request merged
|
## Getting your pull request merged
|
||||||
|
|
88
History.txt
88
History.txt
|
@ -1,15 +1,56 @@
|
||||||
Documentation and download available at http://www.FreeRTOS.org/
|
Documentation and download available at https://www.FreeRTOS.org/
|
||||||
|
|
||||||
|
Changes between FreeRTOS V10.3.1 and FreeRTOS V10.4.0 released September 10 2020
|
||||||
|
|
||||||
|
See https://www.FreeRTOS.org/FreeRTOS-V10.4.x.html
|
||||||
|
|
||||||
|
Major enhancements:
|
||||||
|
|
||||||
|
+ Task notifications: Prior to FreeRTOS V10.4.0 each created task had a
|
||||||
|
single direct to task notification. From FreeRTOS V10.4.0 each task has
|
||||||
|
an array of notifications. The direct to task notification API has been
|
||||||
|
extended with API functions postfixed with "Indexed" to enable the API to
|
||||||
|
operate on a task notification at any array index. See
|
||||||
|
https://www.freertos.org/RTOS-task-notifications.html for more information.
|
||||||
|
+ Kernel ports that support memory protection units (MPUs): The ARMv7-M and
|
||||||
|
ARMv8-M MPU ports now support a privilege access only heap. The ARMv7-M
|
||||||
|
MPU ports now support devices that have 16 MPU regions, have the ability
|
||||||
|
to override default memory attributes for privileged code and data
|
||||||
|
regions, and have the ability to place the FreeRTOS kernel code outside of
|
||||||
|
the Flash memory. The ARMv8-M MPU ports now support tickless idle mode.
|
||||||
|
See https://www.freertos.org/FreeRTOS-MPU-memory-protection-unit.html
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
Additional noteworthy updates:
|
||||||
|
|
||||||
|
+ Code formatting is now automated to facilitate the increase in
|
||||||
|
collaborative development in Git. The auto-formated code is not identical
|
||||||
|
to the original formatting conventions. Most notably spaces are now used
|
||||||
|
in place of tabs.
|
||||||
|
+ The prototypes for callback functions (those that start with "Application",
|
||||||
|
such as vApplicationStackOverflowHook()) are now in the FreeRTOS header
|
||||||
|
files, removing the need for application writers to add prototypes into
|
||||||
|
the C files in which they define the functions.
|
||||||
|
+ New Renesas RXv3 port layer.
|
||||||
|
+ Updates to the Synopsys ARC code, including support for EM and HS cores,
|
||||||
|
and updated BSP.
|
||||||
|
+ Added new POSIX port layer that allows FreeRTOS to run on Linux hosts in
|
||||||
|
the same way the Windows port layer enables FreeRTOS to run on Windows
|
||||||
|
hosts.
|
||||||
|
+ Many other minor optimisations and enhancements. For full details
|
||||||
|
see https://github.com/FreeRTOS/FreeRTOS-Kernel/commits/master
|
||||||
|
|
||||||
|
|
||||||
Changes between FreeRTOS V10.3.0 and FreeRTOS V10.3.1 released February 18 2020
|
Changes between FreeRTOS V10.3.0 and FreeRTOS V10.3.1 released February 18 2020
|
||||||
|
|
||||||
See http://www.FreeRTOS.org/FreeRTOS-V10.3.x.html
|
See https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html
|
||||||
|
|
||||||
./FreeRTOS-Labs directory was removed from this file. The libraries it
|
+ ./FreeRTOS-Labs directory was removed from this file. The libraries it
|
||||||
contained are now available as a separate download.
|
contained are now available as a separate download.
|
||||||
|
|
||||||
Changes between FreeRTOS V10.2.1 and FreeRTOS V10.3.0 released February 7 2020
|
Changes between FreeRTOS V10.2.1 and FreeRTOS V10.3.0 released February 7 2020
|
||||||
|
|
||||||
See http://www.FreeRTOS.org/FreeRTOS-V10.3.x.html
|
See https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html
|
||||||
|
|
||||||
New and updated kernel ports:
|
New and updated kernel ports:
|
||||||
|
|
||||||
|
@ -203,8 +244,8 @@ Changes between FreeRTOS V9.0.1 and FreeRTOS V10.0.0:
|
||||||
|
|
||||||
New Features and components:
|
New Features and components:
|
||||||
|
|
||||||
+ Stream Buffers - see http://www.FreeRTOS.org/RTOS-stream-buffer-example.html
|
+ Stream Buffers - see https://www.FreeRTOS.org/RTOS-stream-buffer-example.html
|
||||||
+ Message Buffers - see http://www.FreeRTOS.org//RTOS-message-buffer-example.html
|
+ Message Buffers - see https://www.FreeRTOS.org//RTOS-message-buffer-example.html
|
||||||
+ Move FreeRTOS+TCP into the main repository, along with the basic Win32
|
+ Move FreeRTOS+TCP into the main repository, along with the basic Win32
|
||||||
TCP demo FreeRTOS_Plus_TCP_Minimal_Windows_Simulator.
|
TCP demo FreeRTOS_Plus_TCP_Minimal_Windows_Simulator.
|
||||||
|
|
||||||
|
@ -306,7 +347,7 @@ Changes since FreeRTOS V9.0.0:
|
||||||
|
|
||||||
Changes between FreeRTOS V9.0.0 and FreeRTOS V9.0.0rc2 released May 25 2016:
|
Changes between FreeRTOS V9.0.0 and FreeRTOS V9.0.0rc2 released May 25 2016:
|
||||||
|
|
||||||
See http://www.FreeRTOS.org/FreeRTOS-V9.html
|
See https://www.FreeRTOS.org/FreeRTOS-V9.html
|
||||||
|
|
||||||
RTOS kernel updates:
|
RTOS kernel updates:
|
||||||
|
|
||||||
|
@ -315,7 +356,7 @@ Changes between FreeRTOS V9.0.0 and FreeRTOS V9.0.0rc2 released May 25 2016:
|
||||||
"CreateStatic()" API functions. The stack size parameter in
|
"CreateStatic()" API functions. The stack size parameter in
|
||||||
xTaskCreateStatic() is now uint32_t, which changes the prototype of the
|
xTaskCreateStatic() is now uint32_t, which changes the prototype of the
|
||||||
callback functions. See the following URL:
|
callback functions. See the following URL:
|
||||||
http://www.freertos.org/xTaskCreateStatic.html
|
https://www.FreeRTOS.org/xTaskCreateStatic.html
|
||||||
+ GCC ARM Cortex-A port: Introduced the configUSE_TASK_FPU_SUPPORT
|
+ GCC ARM Cortex-A port: Introduced the configUSE_TASK_FPU_SUPPORT
|
||||||
constant. When configUSE_TASK_FPU_SUPPORT is set to 2 every task is
|
constant. When configUSE_TASK_FPU_SUPPORT is set to 2 every task is
|
||||||
automatically given a floating point (FPU) context.
|
automatically given a floating point (FPU) context.
|
||||||
|
@ -364,7 +405,7 @@ Changes between FreeRTOS V9.0.0 and FreeRTOS V9.0.0rc2 released May 25 2016:
|
||||||
Changes between FreeRTOS V9.0.0rc1 and FreeRTOS V9.0.0rc2 (release candidate 2)
|
Changes between FreeRTOS V9.0.0rc1 and FreeRTOS V9.0.0rc2 (release candidate 2)
|
||||||
released March 30 2016:
|
released March 30 2016:
|
||||||
|
|
||||||
NOTE - See http://www.FreeRTOS.org/FreeRTOS-V9.html for details
|
NOTE - See https://www.FreeRTOS.org/FreeRTOS-V9.html for details
|
||||||
|
|
||||||
+ The functions that create RTOS objects using static memory allocation have
|
+ The functions that create RTOS objects using static memory allocation have
|
||||||
been simplified and will not revert to using dynamic allocation if a
|
been simplified and will not revert to using dynamic allocation if a
|
||||||
|
@ -577,7 +618,7 @@ Changes between V8.1.2 and V8.2.0 released 16th January 2015
|
||||||
Significant RTOS kernel updates:
|
Significant RTOS kernel updates:
|
||||||
|
|
||||||
+ MAJOR NEW FEATURE! Task notifications. Please see the following URL for
|
+ MAJOR NEW FEATURE! Task notifications. Please see the following URL for
|
||||||
details: http://www.FreeRTOS.org/RTOS-task-notifications.html
|
details: https://www.FreeRTOS.org/RTOS-task-notifications.html
|
||||||
+ NEW HEADER FILE REQUIRED! Obsolete definitions have been separated into
|
+ NEW HEADER FILE REQUIRED! Obsolete definitions have been separated into
|
||||||
a new header file called FreeRTOS/Source/include/deprecated_definitions.h.
|
a new header file called FreeRTOS/Source/include/deprecated_definitions.h.
|
||||||
This header file must be present to build. Note some of the obsolete
|
This header file must be present to build. Note some of the obsolete
|
||||||
|
@ -741,21 +782,21 @@ Changes between V8.0.0 and V8.0.1 released 2nd May 2014
|
||||||
|
|
||||||
Changes between V7.6.0 and V8.0.0 released 19th Feb 2014
|
Changes between V7.6.0 and V8.0.0 released 19th Feb 2014
|
||||||
|
|
||||||
http://www.freertos.org/upgrading-to-FreeRTOS-V8.html
|
https://www.FreeRTOS.org/upgrading-to-FreeRTOS-V8.html
|
||||||
|
|
||||||
FreeRTOS V8.x.x is a drop-in compatible replacement for FreeRTOS V7.x.x,
|
FreeRTOS V8.x.x is a drop-in compatible replacement for FreeRTOS V7.x.x,
|
||||||
although a change to the type used to reference character strings may result
|
although a change to the type used to reference character strings may result
|
||||||
in application code generating a few (easily clearable) compiler warnings
|
in application code generating a few (easily clearable) compiler warnings
|
||||||
after the upgrade, and an updated typedef naming convention means use of the
|
after the upgrade, and an updated typedef naming convention means use of the
|
||||||
old typedef names is now discouraged.
|
old typedef names is now discouraged.
|
||||||
See http://www.freertos.org/upgrading-to-FreeRTOS-V8.html for full
|
See https://www.FreeRTOS.org/upgrading-to-FreeRTOS-V8.html for full
|
||||||
information.
|
information.
|
||||||
|
|
||||||
New features and functionality:
|
New features and functionality:
|
||||||
|
|
||||||
+ Event groups - see http://www.freertos.org/FreeRTOS-Event-Groups.html
|
+ Event groups - see https://www.FreeRTOS.org/FreeRTOS-Event-Groups.html
|
||||||
+ Centralised deferred interrupt processing - see
|
+ Centralised deferred interrupt processing - see
|
||||||
http://www.freertos.org/xTimerPendFunctionCallFromISR.html
|
https://www.FreeRTOS.org/xTimerPendFunctionCallFromISR.html
|
||||||
|
|
||||||
Other updates:
|
Other updates:
|
||||||
|
|
||||||
|
@ -766,7 +807,7 @@ Changes between V7.6.0 and V8.0.0 released 19th Feb 2014
|
||||||
priority of the Running task.
|
priority of the Running task.
|
||||||
+ New low power tickless demonstration project that targets the ST STM32L
|
+ New low power tickless demonstration project that targets the ST STM32L
|
||||||
microcontroller - see
|
microcontroller - see
|
||||||
http://www.freertos.org/STM32L-discovery-low-power-tickless-RTOS-demo.html
|
https://www.FreeRTOS.org/STM32L-discovery-low-power-tickless-RTOS-demo.html
|
||||||
+ Add xPortGetMinimumEverFreeHeapSize() to heap_4.c.
|
+ Add xPortGetMinimumEverFreeHeapSize() to heap_4.c.
|
||||||
+ Small change to the tickless low power implementation on the SAM4L to
|
+ Small change to the tickless low power implementation on the SAM4L to
|
||||||
ensure the alarm value (compare match value) cannot be set to zero when a
|
ensure the alarm value (compare match value) cannot be set to zero when a
|
||||||
|
@ -916,8 +957,8 @@ Changes between V7.4.2 and V7.5.0 released July 19 2013
|
||||||
|
|
||||||
New API functions:
|
New API functions:
|
||||||
|
|
||||||
+ uxTaskGetSystemState() http://www.freertos.org/uxTaskGetSystemState.html
|
+ uxTaskGetSystemState() https://www.FreeRTOS.org/uxTaskGetSystemState.html
|
||||||
+ xQueueOverwrite() http://www.freertos.org/xQueueOverwrite.html
|
+ xQueueOverwrite() https://www.FreeRTOS.org/xQueueOverwrite.html
|
||||||
+ xQueueOverwriteFromISR()
|
+ xQueueOverwriteFromISR()
|
||||||
+ xQueuePeekFromISR()
|
+ xQueuePeekFromISR()
|
||||||
|
|
||||||
|
@ -967,7 +1008,7 @@ Changes between V7.4.1 and V7.4.2 released May 1 2013
|
||||||
|
|
||||||
+ Added FreeRTOS+FAT SL source code and demo project. The demo project
|
+ Added FreeRTOS+FAT SL source code and demo project. The demo project
|
||||||
runs in the FreeRTOS Windows simulator for easy and hardware independent
|
runs in the FreeRTOS Windows simulator for easy and hardware independent
|
||||||
experimentation and evaluation. See http://www.FreeRTOS.org/fat_sl
|
experimentation and evaluation. See https://www.FreeRTOS.org/fat_sl
|
||||||
|
|
||||||
Changes between V7.4.0 and V7.4.1 released April 18 2013
|
Changes between V7.4.0 and V7.4.1 released April 18 2013
|
||||||
|
|
||||||
|
@ -996,7 +1037,7 @@ Changes between V7.4.0 and V7.4.1 released April 18 2013
|
||||||
Changes between V7.3.0 and V7.4.0 released February 20 2013
|
Changes between V7.3.0 and V7.4.0 released February 20 2013
|
||||||
|
|
||||||
+ New feature: Queue sets. See:
|
+ New feature: Queue sets. See:
|
||||||
http://www.FreeRTOS.org/Pend-on-multiple-rtos-objects.html
|
https://www.FreeRTOS.org/Pend-on-multiple-rtos-objects.html
|
||||||
+ Overhauled the default tickless idle mode implementation provided with the
|
+ Overhauled the default tickless idle mode implementation provided with the
|
||||||
ARM Cortex-M3 port layers.
|
ARM Cortex-M3 port layers.
|
||||||
+ Enhanced tickless support in the core kernel code with the introduction of
|
+ Enhanced tickless support in the core kernel code with the introduction of
|
||||||
|
@ -1143,7 +1184,7 @@ Changes between V7.1.0 and V7.1.1 released May 1 2012
|
||||||
|
|
||||||
+ Introduced the portSETUP_TCB() macro to remove the requirement for the
|
+ Introduced the portSETUP_TCB() macro to remove the requirement for the
|
||||||
Windows simulator to use the traceTASK_CREATE() macro, leaving the trace
|
Windows simulator to use the traceTASK_CREATE() macro, leaving the trace
|
||||||
macro available for use by FreeRTOS+Trace (http://www.FreeRTOS.org/trace).
|
macro available for use by FreeRTOS+Trace (https://www.FreeRTOS.org/trace).
|
||||||
+ Added a new trace macro, traceMOVE_TASK_TO_READY_STATE(), to allow future
|
+ Added a new trace macro, traceMOVE_TASK_TO_READY_STATE(), to allow future
|
||||||
FreeRTOS+Trace versions to provide even more information to users.
|
FreeRTOS+Trace versions to provide even more information to users.
|
||||||
+ Updated the FreeRTOS MPU port to be correct for changes that were
|
+ Updated the FreeRTOS MPU port to be correct for changes that were
|
||||||
|
@ -1171,7 +1212,7 @@ Changes between V7.1.0 and V7.1.1 released May 1 2012
|
||||||
|
|
||||||
+ The command interpreter has now been formally released as FreeRTOS+CLI,
|
+ The command interpreter has now been formally released as FreeRTOS+CLI,
|
||||||
and been moved out of the main FreeRTOS download, to instead be available
|
and been moved out of the main FreeRTOS download, to instead be available
|
||||||
from the FreeRTOS+ Ecosystem site http://www.FreeRTOS.org/plus.
|
from the FreeRTOS+ Ecosystem site https://www.FreeRTOS.org/plus.
|
||||||
+ flash_timer.c/h has been added to the list of standard demo tasks. This
|
+ flash_timer.c/h has been added to the list of standard demo tasks. This
|
||||||
performs the same functionality as the flash.c tasks, but using software
|
performs the same functionality as the flash.c tasks, but using software
|
||||||
timers in place of tasks.
|
timers in place of tasks.
|
||||||
|
@ -1453,7 +1494,7 @@ Changes between V6.0.3 and V6.0.4 released March 14 2010
|
||||||
+ All the contributed files that were located in the Demo/Unsupported_Demos
|
+ All the contributed files that were located in the Demo/Unsupported_Demos
|
||||||
directory have been removed. These files are instead now available in the
|
directory have been removed. These files are instead now available in the
|
||||||
new Community Contributions section of the FreeRTOS website. See
|
new Community Contributions section of the FreeRTOS website. See
|
||||||
http://www.freertos.org/RTOS-contributed-ports.html
|
https://www.FreeRTOS.org/RTOS-contributed-ports.html
|
||||||
+ The project file located in the Demo/CORTEX_STM32F107_GCC_Rowley directory
|
+ The project file located in the Demo/CORTEX_STM32F107_GCC_Rowley directory
|
||||||
has been upgraded to use V2.x of the Rowley Crossworks STM32 support
|
has been upgraded to use V2.x of the Rowley Crossworks STM32 support
|
||||||
package.
|
package.
|
||||||
|
@ -1746,9 +1787,6 @@ Changes between V4.8.0 and V5.0.0 released April 15, 2008
|
||||||
compiler might not issue any type mismatch warnings!
|
compiler might not issue any type mismatch warnings!
|
||||||
|
|
||||||
|
|
||||||
See http://www.FreeRTOS.org/upgrading.html for full information.
|
|
||||||
|
|
||||||
|
|
||||||
Other changes:
|
Other changes:
|
||||||
|
|
||||||
+ Support added for the new Luminary Micro LM3S3768 and LM3S3748 Cortex-M3
|
+ Support added for the new Luminary Micro LM3S3768 and LM3S3748 Cortex-M3
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[InternetShortcut]
|
[InternetShortcut]
|
||||||
URL=http://www.freertos.org/FreeRTOS-quick-start-guide.html
|
URL=https://www.FreeRTOS.org/FreeRTOS-quick-start-guide.html
|
||||||
IDList=
|
IDList=
|
||||||
[{000214A0-0000-0000-C000-000000000046}]
|
[{000214A0-0000-0000-C000-000000000046}]
|
||||||
Prop3=19,2
|
Prop3=19,2
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
## Getting started
|
## Getting started
|
||||||
This repository contains FreeRTOS kernel source/header files and kernel ports only. This repository is referenced as a submodule in [FreeRTOS/FreeRTOS](https://github.com/FreeRTOS/FreeRTOS) repository, which contains pre-configured demo application projects under ```FreeRTOS/Demo``` directory.
|
This repository contains FreeRTOS kernel source/header files and kernel ports only. This repository is referenced as a submodule in [FreeRTOS/FreeRTOS](https://github.com/FreeRTOS/FreeRTOS) repository, which contains pre-configured demo application projects under ```FreeRTOS/Demo``` directory.
|
||||||
|
|
||||||
The easiest way to use FreeRTOS is to start with one of the pre-configured demo application projects. That way you will have the correct FreeRTOS source files included, and the correct include paths configured. Once a demo application is building and executing you can remove the demo application files, and start to add in your own application source files. See the [FreeRTOS Kernel Quick Start Guide](https://www.freertos.org/FreeRTOS-quick-start-guide.html) for detailed instructions and other useful links.
|
The easiest way to use FreeRTOS is to start with one of the pre-configured demo application projects. That way you will have the correct FreeRTOS source files included, and the correct include paths configured. Once a demo application is building and executing you can remove the demo application files, and start to add in your own application source files. See the [FreeRTOS Kernel Quick Start Guide](https://www.FreeRTOS.org/FreeRTOS-quick-start-guide.html) for detailed instructions and other useful links.
|
||||||
|
|
||||||
Additionally, for FreeRTOS kernel feature information refer to the [Developer Documentation](https://www.freertos.org/features.html), and [API Reference](https://www.freertos.org/a00106.html).
|
Additionally, for FreeRTOS kernel feature information refer to the [Developer Documentation](https://www.FreeRTOS.org/features.html), and [API Reference](https://www.FreeRTOS.org/a00106.html).
|
||||||
|
|
||||||
### Getting help
|
### Getting help
|
||||||
If you have any questions or need assistance troubleshooting your FreeRTOS project, we have an active community that can help on the [FreeRTOS Community Support Forum](https://forums.freertos.org).
|
If you have any questions or need assistance troubleshooting your FreeRTOS project, we have an active community that can help on the [FreeRTOS Community Support Forum](https://forums.freertos.org).
|
||||||
|
@ -29,3 +29,7 @@ is normally only used on very memory limited systems.
|
||||||
See the readme file in the ```./portable``` directory for more information.
|
See the readme file in the ```./portable``` directory for more information.
|
||||||
|
|
||||||
- The ```./include``` directory contains the real time kernel header files.
|
- The ```./include``` directory contains the real time kernel header files.
|
||||||
|
|
||||||
|
### Code Formatting
|
||||||
|
FreeRTOS files are formatted using the "uncrustify" tool. The configuration file used by uncrustify can be found in the [FreeRTOS/FreeRTOS repository](https://github.com/FreeRTOS/FreeRTOS/blob/master/tools/uncrustify.cfg).
|
||||||
|
|
||||||
|
|
64
croutine.c
64
croutine.c
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
|
@ -99,17 +98,20 @@ static void prvCheckDelayedList( void );
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex )
|
BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode,
|
||||||
|
UBaseType_t uxPriority,
|
||||||
|
UBaseType_t uxIndex )
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
CRCB_t * pxCoRoutine;
|
CRCB_t * pxCoRoutine;
|
||||||
|
|
||||||
/* Allocate the memory that will store the co-routine control block. */
|
/* Allocate the memory that will store the co-routine control block. */
|
||||||
pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) );
|
pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) );
|
||||||
|
|
||||||
if( pxCoRoutine )
|
if( pxCoRoutine )
|
||||||
{
|
{
|
||||||
/* If pxCurrentCoRoutine is NULL then this is the first co-routine to
|
/* If pxCurrentCoRoutine is NULL then this is the first co-routine to
|
||||||
be created and the co-routine data structures need initialising. */
|
* be created and the co-routine data structures need initialising. */
|
||||||
if( pxCurrentCoRoutine == NULL )
|
if( pxCurrentCoRoutine == NULL )
|
||||||
{
|
{
|
||||||
pxCurrentCoRoutine = pxCoRoutine;
|
pxCurrentCoRoutine = pxCoRoutine;
|
||||||
|
@ -133,8 +135,8 @@ CRCB_t *pxCoRoutine;
|
||||||
vListInitialiseItem( &( pxCoRoutine->xEventListItem ) );
|
vListInitialiseItem( &( pxCoRoutine->xEventListItem ) );
|
||||||
|
|
||||||
/* Set the co-routine control block as a link back from the ListItem_t.
|
/* Set the co-routine control block as a link back from the ListItem_t.
|
||||||
This is so we can get back to the containing CRCB from a generic item
|
* This is so we can get back to the containing CRCB from a generic item
|
||||||
in a list. */
|
* in a list. */
|
||||||
listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine );
|
listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine );
|
||||||
listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine );
|
listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine );
|
||||||
|
|
||||||
|
@ -142,7 +144,7 @@ CRCB_t *pxCoRoutine;
|
||||||
listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) );
|
listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) );
|
||||||
|
|
||||||
/* Now the co-routine has been initialised it can be added to the ready
|
/* Now the co-routine has been initialised it can be added to the ready
|
||||||
list at the correct priority. */
|
* list at the correct priority. */
|
||||||
prvAddCoRoutineToReadyQueue( pxCoRoutine );
|
prvAddCoRoutineToReadyQueue( pxCoRoutine );
|
||||||
|
|
||||||
xReturn = pdPASS;
|
xReturn = pdPASS;
|
||||||
|
@ -156,17 +158,18 @@ CRCB_t *pxCoRoutine;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList )
|
void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay,
|
||||||
|
List_t * pxEventList )
|
||||||
{
|
{
|
||||||
TickType_t xTimeToWake;
|
TickType_t xTimeToWake;
|
||||||
|
|
||||||
/* Calculate the time to wake - this may overflow but this is
|
/* Calculate the time to wake - this may overflow but this is
|
||||||
not a problem. */
|
* not a problem. */
|
||||||
xTimeToWake = xCoRoutineTickCount + xTicksToDelay;
|
xTimeToWake = xCoRoutineTickCount + xTicksToDelay;
|
||||||
|
|
||||||
/* We must remove ourselves from the ready list before adding
|
/* We must remove ourselves from the ready list before adding
|
||||||
ourselves to the blocked list as the same list item is used for
|
* ourselves to the blocked list as the same list item is used for
|
||||||
both lists. */
|
* both lists. */
|
||||||
( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
|
( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
|
||||||
|
|
||||||
/* The list item will be inserted in wake time order. */
|
/* The list item will be inserted in wake time order. */
|
||||||
|
@ -175,20 +178,20 @@ TickType_t xTimeToWake;
|
||||||
if( xTimeToWake < xCoRoutineTickCount )
|
if( xTimeToWake < xCoRoutineTickCount )
|
||||||
{
|
{
|
||||||
/* Wake time has overflowed. Place this item in the
|
/* Wake time has overflowed. Place this item in the
|
||||||
overflow list. */
|
* overflow list. */
|
||||||
vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
|
vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* The wake time has not overflowed, so we can use the
|
/* The wake time has not overflowed, so we can use the
|
||||||
current block list. */
|
* current block list. */
|
||||||
vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
|
vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pxEventList )
|
if( pxEventList )
|
||||||
{
|
{
|
||||||
/* Also add the co-routine to an event list. If this is done then the
|
/* Also add the co-routine to an event list. If this is done then the
|
||||||
function must be called with interrupts disabled. */
|
* function must be called with interrupts disabled. */
|
||||||
vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) );
|
vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,8 +200,8 @@ TickType_t xTimeToWake;
|
||||||
static void prvCheckPendingReadyList( void )
|
static void prvCheckPendingReadyList( void )
|
||||||
{
|
{
|
||||||
/* Are there any co-routines waiting to get moved to the ready list? These
|
/* Are there any co-routines waiting to get moved to the ready list? These
|
||||||
are co-routines that have been readied by an ISR. The ISR cannot access
|
* are co-routines that have been readied by an ISR. The ISR cannot access
|
||||||
the ready lists itself. */
|
* the ready lists itself. */
|
||||||
while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE )
|
while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE )
|
||||||
{
|
{
|
||||||
CRCB_t * pxUnblockedCRCB;
|
CRCB_t * pxUnblockedCRCB;
|
||||||
|
@ -222,6 +225,7 @@ static void prvCheckDelayedList( void )
|
||||||
CRCB_t * pxCRCB;
|
CRCB_t * pxCRCB;
|
||||||
|
|
||||||
xPassedTicks = xTaskGetTickCount() - xLastTickCount;
|
xPassedTicks = xTaskGetTickCount() - xLastTickCount;
|
||||||
|
|
||||||
while( xPassedTicks )
|
while( xPassedTicks )
|
||||||
{
|
{
|
||||||
xCoRoutineTickCount++;
|
xCoRoutineTickCount++;
|
||||||
|
@ -233,7 +237,7 @@ CRCB_t *pxCRCB;
|
||||||
List_t * pxTemp;
|
List_t * pxTemp;
|
||||||
|
|
||||||
/* Tick count has overflowed so we need to swap the delay lists. If there are
|
/* Tick count has overflowed so we need to swap the delay lists. If there are
|
||||||
any items in pxDelayedCoRoutineList here then there is an error! */
|
* any items in pxDelayedCoRoutineList here then there is an error! */
|
||||||
pxTemp = pxDelayedCoRoutineList;
|
pxTemp = pxDelayedCoRoutineList;
|
||||||
pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList;
|
pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList;
|
||||||
pxOverflowDelayedCoRoutineList = pxTemp;
|
pxOverflowDelayedCoRoutineList = pxTemp;
|
||||||
|
@ -253,10 +257,10 @@ CRCB_t *pxCRCB;
|
||||||
portDISABLE_INTERRUPTS();
|
portDISABLE_INTERRUPTS();
|
||||||
{
|
{
|
||||||
/* The event could have occurred just before this critical
|
/* The event could have occurred just before this critical
|
||||||
section. If this is the case then the generic list item will
|
* section. If this is the case then the generic list item will
|
||||||
have been moved to the pending ready list and the following
|
* have been moved to the pending ready list and the following
|
||||||
line is still valid. Also the pvContainer parameter will have
|
* line is still valid. Also the pvContainer parameter will have
|
||||||
been set to NULL so the following lines are also valid. */
|
* been set to NULL so the following lines are also valid. */
|
||||||
( void ) uxListRemove( &( pxCRCB->xGenericListItem ) );
|
( void ) uxListRemove( &( pxCRCB->xGenericListItem ) );
|
||||||
|
|
||||||
/* Is the co-routine waiting on an event also? */
|
/* Is the co-routine waiting on an event also? */
|
||||||
|
@ -278,8 +282,8 @@ CRCB_t *pxCRCB;
|
||||||
void vCoRoutineSchedule( void )
|
void vCoRoutineSchedule( void )
|
||||||
{
|
{
|
||||||
/* Only run a co-routine after prvInitialiseCoRoutineLists() has been
|
/* Only run a co-routine after prvInitialiseCoRoutineLists() has been
|
||||||
called. prvInitialiseCoRoutineLists() is called automatically when a
|
* called. prvInitialiseCoRoutineLists() is called automatically when a
|
||||||
co-routine is created. */
|
* co-routine is created. */
|
||||||
if( pxDelayedCoRoutineList != NULL )
|
if( pxDelayedCoRoutineList != NULL )
|
||||||
{
|
{
|
||||||
/* See if any co-routines readied by events need moving to the ready lists. */
|
/* See if any co-routines readied by events need moving to the ready lists. */
|
||||||
|
@ -296,18 +300,17 @@ void vCoRoutineSchedule( void )
|
||||||
/* No more co-routines to check. */
|
/* No more co-routines to check. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
--uxTopCoRoutineReadyPriority;
|
--uxTopCoRoutineReadyPriority;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines
|
/* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines
|
||||||
of the same priority get an equal share of the processor time. */
|
* of the same priority get an equal share of the processor time. */
|
||||||
listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) );
|
listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) );
|
||||||
|
|
||||||
/* Call the co-routine. */
|
/* Call the co-routine. */
|
||||||
( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex );
|
( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -325,7 +328,7 @@ UBaseType_t uxPriority;
|
||||||
vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList );
|
vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList );
|
||||||
|
|
||||||
/* Start with pxDelayedCoRoutineList using list1 and the
|
/* Start with pxDelayedCoRoutineList using list1 and the
|
||||||
pxOverflowDelayedCoRoutineList using list2. */
|
* pxOverflowDelayedCoRoutineList using list2. */
|
||||||
pxDelayedCoRoutineList = &xDelayedCoRoutineList1;
|
pxDelayedCoRoutineList = &xDelayedCoRoutineList1;
|
||||||
pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2;
|
pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2;
|
||||||
}
|
}
|
||||||
|
@ -337,8 +340,8 @@ CRCB_t *pxUnblockedCRCB;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
/* This function is called from within an interrupt. It can only access
|
/* This function is called from within an interrupt. It can only access
|
||||||
event lists and the pending ready list. This function assumes that a
|
* event lists and the pending ready list. This function assumes that a
|
||||||
check has already been made to ensure pxEventList is not empty. */
|
* check has already been made to ensure pxEventList is not empty. */
|
||||||
pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );
|
pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );
|
||||||
( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) );
|
( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) );
|
||||||
vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) );
|
vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) );
|
||||||
|
@ -356,4 +359,3 @@ BaseType_t xReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configUSE_CO_ROUTINES == 0 */
|
#endif /* configUSE_CO_ROUTINES == 0 */
|
||||||
|
|
||||||
|
|
198
event_groups.c
198
event_groups.c
|
@ -19,18 +19,17 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
||||||
all the API functions to use the MPU wrappers. That should only be done when
|
* all the API functions to use the MPU wrappers. That should only be done when
|
||||||
task.h is included from an application file. */
|
* task.h is included from an application file. */
|
||||||
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
|
@ -40,14 +39,14 @@ task.h is included from an application file. */
|
||||||
#include "event_groups.h"
|
#include "event_groups.h"
|
||||||
|
|
||||||
/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified
|
/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified
|
||||||
because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined
|
* because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined
|
||||||
for the header files above, but not in this file, in order to generate the
|
* for the header files above, but not in this file, in order to generate the
|
||||||
correct privileged Vs unprivileged linkage and placement. */
|
* correct privileged Vs unprivileged linkage and placement. */
|
||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */
|
||||||
|
|
||||||
/* The following bit fields convey control information in a task's event list
|
/* The following bit fields convey control information in a task's event list
|
||||||
item value. It is important they don't clash with the
|
* item value. It is important they don't clash with the
|
||||||
taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
|
* taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
|
||||||
#if configUSE_16_BIT_TICKS == 1
|
#if configUSE_16_BIT_TICKS == 1
|
||||||
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
|
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
|
||||||
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
|
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
|
||||||
|
@ -84,7 +83,9 @@ typedef struct EventGroupDef_t
|
||||||
* wait condition is met if any of the bits set in uxBitsToWait for are also set
|
* wait condition is met if any of the bits set in uxBitsToWait for are also set
|
||||||
* in uxCurrentEventBits.
|
* in uxCurrentEventBits.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION;
|
static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -100,8 +101,8 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
#if ( configASSERT_DEFINED == 1 )
|
#if ( configASSERT_DEFINED == 1 )
|
||||||
{
|
{
|
||||||
/* Sanity check that the size of the structure used to declare a
|
/* Sanity check that the size of the structure used to declare a
|
||||||
variable of type StaticEventGroup_t equals the size of the real
|
* variable of type StaticEventGroup_t equals the size of the real
|
||||||
event group structure. */
|
* event group structure. */
|
||||||
volatile size_t xSize = sizeof( StaticEventGroup_t );
|
volatile size_t xSize = sizeof( StaticEventGroup_t );
|
||||||
configASSERT( xSize == sizeof( EventGroup_t ) );
|
configASSERT( xSize == sizeof( EventGroup_t ) );
|
||||||
} /*lint !e529 xSize is referenced if configASSERT() is defined. */
|
} /*lint !e529 xSize is referenced if configASSERT() is defined. */
|
||||||
|
@ -118,8 +119,8 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
{
|
{
|
||||||
/* Both static and dynamic allocation can be used, so note that
|
/* Both static and dynamic allocation can be used, so note that
|
||||||
this event group was created statically in case the event group
|
* this event group was created statically in case the event group
|
||||||
is later deleted. */
|
* is later deleted. */
|
||||||
pxEventBits->ucStaticallyAllocated = pdTRUE;
|
pxEventBits->ucStaticallyAllocated = pdTRUE;
|
||||||
}
|
}
|
||||||
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
||||||
|
@ -129,8 +130,8 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* xEventGroupCreateStatic should only ever be called with
|
/* xEventGroupCreateStatic should only ever be called with
|
||||||
pxEventGroupBuffer pointing to a pre-allocated (compile time
|
* pxEventGroupBuffer pointing to a pre-allocated (compile time
|
||||||
allocated) StaticEventGroup_t variable. */
|
* allocated) StaticEventGroup_t variable. */
|
||||||
traceEVENT_GROUP_CREATE_FAILED();
|
traceEVENT_GROUP_CREATE_FAILED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,18 +148,18 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
EventGroup_t * pxEventBits;
|
EventGroup_t * pxEventBits;
|
||||||
|
|
||||||
/* Allocate the event group. Justification for MISRA deviation as
|
/* Allocate the event group. Justification for MISRA deviation as
|
||||||
follows: pvPortMalloc() always ensures returned memory blocks are
|
* follows: pvPortMalloc() always ensures returned memory blocks are
|
||||||
aligned per the requirements of the MCU stack. In this case
|
* aligned per the requirements of the MCU stack. In this case
|
||||||
pvPortMalloc() must return a pointer that is guaranteed to meet the
|
* pvPortMalloc() must return a pointer that is guaranteed to meet the
|
||||||
alignment requirements of the EventGroup_t structure - which (if you
|
* alignment requirements of the EventGroup_t structure - which (if you
|
||||||
follow it through) is the alignment requirements of the TickType_t type
|
* follow it through) is the alignment requirements of the TickType_t type
|
||||||
(EventBits_t being of TickType_t itself). Therefore, whenever the
|
* (EventBits_t being of TickType_t itself). Therefore, whenever the
|
||||||
stack alignment requirements are greater than or equal to the
|
* stack alignment requirements are greater than or equal to the
|
||||||
TickType_t alignment requirements the cast is safe. In other cases,
|
* TickType_t alignment requirements the cast is safe. In other cases,
|
||||||
where the natural word size of the architecture is less than
|
* where the natural word size of the architecture is less than
|
||||||
sizeof( TickType_t ), the TickType_t variables will be accessed in two
|
* sizeof( TickType_t ), the TickType_t variables will be accessed in two
|
||||||
or more reads operations, and the alignment requirements is only that
|
* or more reads operations, and the alignment requirements is only that
|
||||||
of each individual read. */
|
* of each individual read. */
|
||||||
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */
|
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */
|
||||||
|
|
||||||
if( pxEventBits != NULL )
|
if( pxEventBits != NULL )
|
||||||
|
@ -169,8 +170,8 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
{
|
{
|
||||||
/* Both static and dynamic allocation can be used, so note this
|
/* Both static and dynamic allocation can be used, so note this
|
||||||
event group was allocated statically in case the event group is
|
* event group was allocated statically in case the event group is
|
||||||
later deleted. */
|
* later deleted. */
|
||||||
pxEventBits->ucStaticallyAllocated = pdFALSE;
|
pxEventBits->ucStaticallyAllocated = pdFALSE;
|
||||||
}
|
}
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||||
|
@ -188,7 +189,10 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )
|
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
TickType_t xTicksToWait )
|
||||||
{
|
{
|
||||||
EventBits_t uxOriginalBitValue, uxReturn;
|
EventBits_t uxOriginalBitValue, uxReturn;
|
||||||
EventGroup_t * pxEventBits = xEventGroup;
|
EventGroup_t * pxEventBits = xEventGroup;
|
||||||
|
@ -215,7 +219,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
uxReturn = ( uxOriginalBitValue | uxBitsToSet );
|
uxReturn = ( uxOriginalBitValue | uxBitsToSet );
|
||||||
|
|
||||||
/* Rendezvous always clear the bits. They will have been cleared
|
/* Rendezvous always clear the bits. They will have been cleared
|
||||||
already unless this is the only task in the rendezvous. */
|
* already unless this is the only task in the rendezvous. */
|
||||||
pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
|
pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
|
||||||
|
|
||||||
xTicksToWait = 0;
|
xTicksToWait = 0;
|
||||||
|
@ -227,20 +231,20 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor );
|
traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor );
|
||||||
|
|
||||||
/* Store the bits that the calling task is waiting for in the
|
/* Store the bits that the calling task is waiting for in the
|
||||||
task's event list item so the kernel knows when a match is
|
* task's event list item so the kernel knows when a match is
|
||||||
found. Then enter the blocked state. */
|
* found. Then enter the blocked state. */
|
||||||
vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait );
|
vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait );
|
||||||
|
|
||||||
/* This assignment is obsolete as uxReturn will get set after
|
/* This assignment is obsolete as uxReturn will get set after
|
||||||
the task unblocks, but some compilers mistakenly generate a
|
* the task unblocks, but some compilers mistakenly generate a
|
||||||
warning about uxReturn being returned without being set if the
|
* warning about uxReturn being returned without being set if the
|
||||||
assignment is omitted. */
|
* assignment is omitted. */
|
||||||
uxReturn = 0;
|
uxReturn = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* The rendezvous bits were not set, but no block time was
|
/* The rendezvous bits were not set, but no block time was
|
||||||
specified - just return the current event bit value. */
|
* specified - just return the current event bit value. */
|
||||||
uxReturn = pxEventBits->uxEventBits;
|
uxReturn = pxEventBits->uxEventBits;
|
||||||
xTimeoutOccurred = pdTRUE;
|
xTimeoutOccurred = pdTRUE;
|
||||||
}
|
}
|
||||||
|
@ -260,9 +264,9 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The task blocked to wait for its required bits to be set - at this
|
/* The task blocked to wait for its required bits to be set - at this
|
||||||
point either the required bits were set or the block time expired. If
|
* point either the required bits were set or the block time expired. If
|
||||||
the required bits were set they will have been stored in the task's
|
* the required bits were set they will have been stored in the task's
|
||||||
event list item, and they should now be retrieved then cleared. */
|
* event list item, and they should now be retrieved then cleared. */
|
||||||
uxReturn = uxTaskResetEventItemValue();
|
uxReturn = uxTaskResetEventItemValue();
|
||||||
|
|
||||||
if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
|
if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
|
||||||
|
@ -273,9 +277,9 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
uxReturn = pxEventBits->uxEventBits;
|
uxReturn = pxEventBits->uxEventBits;
|
||||||
|
|
||||||
/* Although the task got here because it timed out before the
|
/* Although the task got here because it timed out before the
|
||||||
bits it was waiting for were set, it is possible that since it
|
* bits it was waiting for were set, it is possible that since it
|
||||||
unblocked another task has set the bits. If this is the case
|
* unblocked another task has set the bits. If this is the case
|
||||||
then it needs to clear the bits before exiting. */
|
* then it needs to clear the bits before exiting. */
|
||||||
if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor )
|
if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor )
|
||||||
{
|
{
|
||||||
pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
|
pxEventBits->uxEventBits &= ~uxBitsToWaitFor;
|
||||||
|
@ -295,7 +299,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Control bits might be set as the task had blocked should not be
|
/* Control bits might be set as the task had blocked should not be
|
||||||
returned. */
|
* returned. */
|
||||||
uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
|
uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,7 +312,11 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )
|
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
const BaseType_t xClearOnExit,
|
||||||
|
const BaseType_t xWaitForAllBits,
|
||||||
|
TickType_t xTicksToWait )
|
||||||
{
|
{
|
||||||
EventGroup_t * pxEventBits = xEventGroup;
|
EventGroup_t * pxEventBits = xEventGroup;
|
||||||
EventBits_t uxReturn, uxControlBits = 0;
|
EventBits_t uxReturn, uxControlBits = 0;
|
||||||
|
@ -316,7 +324,7 @@ BaseType_t xWaitConditionMet, xAlreadyYielded;
|
||||||
BaseType_t xTimeoutOccurred = pdFALSE;
|
BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
|
|
||||||
/* Check the user is not attempting to wait on the bits used by the kernel
|
/* Check the user is not attempting to wait on the bits used by the kernel
|
||||||
itself, and that at least one bit is being requested. */
|
* itself, and that at least one bit is being requested. */
|
||||||
configASSERT( xEventGroup );
|
configASSERT( xEventGroup );
|
||||||
configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
||||||
configASSERT( uxBitsToWaitFor != 0 );
|
configASSERT( uxBitsToWaitFor != 0 );
|
||||||
|
@ -336,7 +344,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
if( xWaitConditionMet != pdFALSE )
|
if( xWaitConditionMet != pdFALSE )
|
||||||
{
|
{
|
||||||
/* The wait condition has already been met so there is no need to
|
/* The wait condition has already been met so there is no need to
|
||||||
block. */
|
* block. */
|
||||||
uxReturn = uxCurrentEventBits;
|
uxReturn = uxCurrentEventBits;
|
||||||
xTicksToWait = ( TickType_t ) 0;
|
xTicksToWait = ( TickType_t ) 0;
|
||||||
|
|
||||||
|
@ -353,16 +361,16 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
else if( xTicksToWait == ( TickType_t ) 0 )
|
else if( xTicksToWait == ( TickType_t ) 0 )
|
||||||
{
|
{
|
||||||
/* The wait condition has not been met, but no block time was
|
/* The wait condition has not been met, but no block time was
|
||||||
specified, so just return the current value. */
|
* specified, so just return the current value. */
|
||||||
uxReturn = uxCurrentEventBits;
|
uxReturn = uxCurrentEventBits;
|
||||||
xTimeoutOccurred = pdTRUE;
|
xTimeoutOccurred = pdTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* The task is going to block to wait for its required bits to be
|
/* The task is going to block to wait for its required bits to be
|
||||||
set. uxControlBits are used to remember the specified behaviour of
|
* set. uxControlBits are used to remember the specified behaviour of
|
||||||
this call to xEventGroupWaitBits() - for use when the event bits
|
* this call to xEventGroupWaitBits() - for use when the event bits
|
||||||
unblock the task. */
|
* unblock the task. */
|
||||||
if( xClearOnExit != pdFALSE )
|
if( xClearOnExit != pdFALSE )
|
||||||
{
|
{
|
||||||
uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT;
|
uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT;
|
||||||
|
@ -382,13 +390,13 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store the bits that the calling task is waiting for in the
|
/* Store the bits that the calling task is waiting for in the
|
||||||
task's event list item so the kernel knows when a match is
|
* task's event list item so the kernel knows when a match is
|
||||||
found. Then enter the blocked state. */
|
* found. Then enter the blocked state. */
|
||||||
vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait );
|
vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait );
|
||||||
|
|
||||||
/* This is obsolete as it will get set after the task unblocks, but
|
/* This is obsolete as it will get set after the task unblocks, but
|
||||||
some compilers mistakenly generate a warning about the variable
|
* some compilers mistakenly generate a warning about the variable
|
||||||
being returned without being set if it is not done. */
|
* being returned without being set if it is not done. */
|
||||||
uxReturn = 0;
|
uxReturn = 0;
|
||||||
|
|
||||||
traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor );
|
traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor );
|
||||||
|
@ -408,9 +416,9 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The task blocked to wait for its required bits to be set - at this
|
/* The task blocked to wait for its required bits to be set - at this
|
||||||
point either the required bits were set or the block time expired. If
|
* point either the required bits were set or the block time expired. If
|
||||||
the required bits were set they will have been stored in the task's
|
* the required bits were set they will have been stored in the task's
|
||||||
event list item, and they should now be retrieved then cleared. */
|
* event list item, and they should now be retrieved then cleared. */
|
||||||
uxReturn = uxTaskResetEventItemValue();
|
uxReturn = uxTaskResetEventItemValue();
|
||||||
|
|
||||||
if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
|
if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
|
||||||
|
@ -421,7 +429,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
uxReturn = pxEventBits->uxEventBits;
|
uxReturn = pxEventBits->uxEventBits;
|
||||||
|
|
||||||
/* It is possible that the event bits were updated between this
|
/* It is possible that the event bits were updated between this
|
||||||
task leaving the Blocked state and running again. */
|
* task leaving the Blocked state and running again. */
|
||||||
if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE )
|
if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE )
|
||||||
{
|
{
|
||||||
if( xClearOnExit != pdFALSE )
|
if( xClearOnExit != pdFALSE )
|
||||||
|
@ -437,6 +445,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
{
|
{
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
|
|
||||||
xTimeoutOccurred = pdTRUE;
|
xTimeoutOccurred = pdTRUE;
|
||||||
}
|
}
|
||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
|
@ -449,6 +458,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
/* The task blocked so control bits may have been set. */
|
/* The task blocked so control bits may have been set. */
|
||||||
uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
|
uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
|
||||||
}
|
}
|
||||||
|
|
||||||
traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred );
|
traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred );
|
||||||
|
|
||||||
/* Prevent compiler warnings when trace macros are not used. */
|
/* Prevent compiler warnings when trace macros are not used. */
|
||||||
|
@ -458,13 +468,14 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
|
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToClear )
|
||||||
{
|
{
|
||||||
EventGroup_t * pxEventBits = xEventGroup;
|
EventGroup_t * pxEventBits = xEventGroup;
|
||||||
EventBits_t uxReturn;
|
EventBits_t uxReturn;
|
||||||
|
|
||||||
/* Check the user is not attempting to clear the bits used by the kernel
|
/* Check the user is not attempting to clear the bits used by the kernel
|
||||||
itself. */
|
* itself. */
|
||||||
configASSERT( xEventGroup );
|
configASSERT( xEventGroup );
|
||||||
configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
||||||
|
|
||||||
|
@ -473,7 +484,7 @@ EventBits_t uxReturn;
|
||||||
traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear );
|
traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear );
|
||||||
|
|
||||||
/* The value returned is the event group value prior to the bits being
|
/* The value returned is the event group value prior to the bits being
|
||||||
cleared. */
|
* cleared. */
|
||||||
uxReturn = pxEventBits->uxEventBits;
|
uxReturn = pxEventBits->uxEventBits;
|
||||||
|
|
||||||
/* Clear the bits. */
|
/* Clear the bits. */
|
||||||
|
@ -487,7 +498,8 @@ EventBits_t uxReturn;
|
||||||
|
|
||||||
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
|
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
|
||||||
|
|
||||||
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
|
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToClear )
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
|
@ -497,7 +509,7 @@ EventBits_t uxReturn;
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
|
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
|
||||||
|
@ -516,7 +528,8 @@ EventBits_t uxReturn;
|
||||||
} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */
|
} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
|
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet )
|
||||||
{
|
{
|
||||||
ListItem_t * pxListItem, * pxNext;
|
ListItem_t * pxListItem, * pxNext;
|
||||||
ListItem_t const * pxListEnd;
|
ListItem_t const * pxListEnd;
|
||||||
|
@ -526,7 +539,7 @@ EventGroup_t *pxEventBits = xEventGroup;
|
||||||
BaseType_t xMatchFound = pdFALSE;
|
BaseType_t xMatchFound = pdFALSE;
|
||||||
|
|
||||||
/* Check the user is not attempting to set the bits used by the kernel
|
/* Check the user is not attempting to set the bits used by the kernel
|
||||||
itself. */
|
* itself. */
|
||||||
configASSERT( xEventGroup );
|
configASSERT( xEventGroup );
|
||||||
configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
||||||
|
|
||||||
|
@ -587,21 +600,21 @@ BaseType_t xMatchFound = pdFALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store the actual event flag value in the task's event list
|
/* Store the actual event flag value in the task's event list
|
||||||
item before removing the task from the event list. The
|
* item before removing the task from the event list. The
|
||||||
eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows
|
* eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows
|
||||||
that is was unblocked due to its required bits matching, rather
|
* that is was unblocked due to its required bits matching, rather
|
||||||
than because it timed out. */
|
* than because it timed out. */
|
||||||
vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET );
|
vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move onto the next list item. Note pxListItem->pxNext is not
|
/* Move onto the next list item. Note pxListItem->pxNext is not
|
||||||
used here as the list item may have been removed from the event list
|
* used here as the list item may have been removed from the event list
|
||||||
and inserted into the ready/pending reading list. */
|
* and inserted into the ready/pending reading list. */
|
||||||
pxListItem = pxNext;
|
pxListItem = pxNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT
|
/* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT
|
||||||
bit was set in the control word. */
|
* bit was set in the control word. */
|
||||||
pxEventBits->uxEventBits &= ~uxBitsToClear;
|
pxEventBits->uxEventBits &= ~uxBitsToClear;
|
||||||
}
|
}
|
||||||
( void ) xTaskResumeAll();
|
( void ) xTaskResumeAll();
|
||||||
|
@ -622,7 +635,7 @@ const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
||||||
while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 )
|
while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 )
|
||||||
{
|
{
|
||||||
/* Unblock the task, returning 0 as the event list is being deleted
|
/* Unblock the task, returning 0 as the event list is being deleted
|
||||||
and cannot therefore have any bits set. */
|
* and cannot therefore have any bits set. */
|
||||||
configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) );
|
configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) );
|
||||||
vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET );
|
vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET );
|
||||||
}
|
}
|
||||||
|
@ -630,13 +643,13 @@ const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
||||||
#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) )
|
#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) )
|
||||||
{
|
{
|
||||||
/* The event group can only have been allocated dynamically - free
|
/* The event group can only have been allocated dynamically - free
|
||||||
it again. */
|
* it again. */
|
||||||
vPortFree( pxEventBits );
|
vPortFree( pxEventBits );
|
||||||
}
|
}
|
||||||
#elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
|
#elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
|
||||||
{
|
{
|
||||||
/* The event group could have been allocated statically or
|
/* The event group could have been allocated statically or
|
||||||
dynamically, so check before attempting to free the memory. */
|
* dynamically, so check before attempting to free the memory. */
|
||||||
if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE )
|
if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE )
|
||||||
{
|
{
|
||||||
vPortFree( pxEventBits );
|
vPortFree( pxEventBits );
|
||||||
|
@ -653,29 +666,33 @@ const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* For internal use only - execute a 'set bits' command that was pended from
|
/* For internal use only - execute a 'set bits' command that was pended from
|
||||||
an interrupt. */
|
* an interrupt. */
|
||||||
void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet )
|
void vEventGroupSetBitsCallback( void * pvEventGroup,
|
||||||
|
const uint32_t ulBitsToSet )
|
||||||
{
|
{
|
||||||
( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */
|
( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* For internal use only - execute a 'clear bits' command that was pended from
|
/* For internal use only - execute a 'clear bits' command that was pended from
|
||||||
an interrupt. */
|
* an interrupt. */
|
||||||
void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear )
|
void vEventGroupClearBitsCallback( void * pvEventGroup,
|
||||||
|
const uint32_t ulBitsToClear )
|
||||||
{
|
{
|
||||||
( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */
|
( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits )
|
static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
const BaseType_t xWaitForAllBits )
|
||||||
{
|
{
|
||||||
BaseType_t xWaitConditionMet = pdFALSE;
|
BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
|
|
||||||
if( xWaitForAllBits == pdFALSE )
|
if( xWaitForAllBits == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Task only has to wait for one bit within uxBitsToWaitFor to be
|
/* Task only has to wait for one bit within uxBitsToWaitFor to be
|
||||||
set. Is one already set? */
|
* set. Is one already set? */
|
||||||
if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 )
|
if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 )
|
||||||
{
|
{
|
||||||
xWaitConditionMet = pdTRUE;
|
xWaitConditionMet = pdTRUE;
|
||||||
|
@ -688,7 +705,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Task has to wait for all the bits in uxBitsToWaitFor to be set.
|
/* Task has to wait for all the bits in uxBitsToWaitFor to be set.
|
||||||
Are they set already? */
|
* Are they set already? */
|
||||||
if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor )
|
if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor )
|
||||||
{
|
{
|
||||||
xWaitConditionMet = pdTRUE;
|
xWaitConditionMet = pdTRUE;
|
||||||
|
@ -705,7 +722,9 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
|
|
||||||
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
|
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
|
||||||
|
|
||||||
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken )
|
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet,
|
||||||
|
BaseType_t * pxHigherPriorityTaskWoken )
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
|
@ -715,7 +734,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
|
@ -742,12 +761,11 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
|
|
||||||
void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber )
|
void vEventGroupSetNumber( void * xEventGroup,
|
||||||
|
UBaseType_t uxEventGroupNumber )
|
||||||
{
|
{
|
||||||
( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configUSE_TRACE_FACILITY */
|
#endif /* configUSE_TRACE_FACILITY */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef INC_FREERTOS_H
|
#ifndef INC_FREERTOS_H
|
||||||
|
@ -48,9 +47,11 @@
|
||||||
*/
|
*/
|
||||||
#include <stdint.h> /* READ COMMENT ABOVE. */
|
#include <stdint.h> /* READ COMMENT ABOVE. */
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/* Application specific configuration options. */
|
/* Application specific configuration options. */
|
||||||
#include "FreeRTOSConfig.h"
|
#include "FreeRTOSConfig.h"
|
||||||
|
@ -70,6 +71,7 @@ extern "C" {
|
||||||
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
||||||
#include <reent.h>
|
#include <reent.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check all the required application specific macros have been defined.
|
* Check all the required application specific macros have been defined.
|
||||||
* These macros are application specific and (as downloaded) are defined
|
* These macros are application specific and (as downloaded) are defined
|
||||||
|
@ -242,10 +244,10 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* configPRECONDITION should be defined as configASSERT.
|
/* configPRECONDITION should be defined as configASSERT.
|
||||||
The CBMC proofs need a way to track assumptions and assertions.
|
* The CBMC proofs need a way to track assumptions and assertions.
|
||||||
A configPRECONDITION statement should express an implicit invariant or
|
* A configPRECONDITION statement should express an implicit invariant or
|
||||||
assumption made. A configASSERT statement should express an invariant that must
|
* assumption made. A configASSERT statement should express an invariant that must
|
||||||
hold explicit before calling the code. */
|
* hold explicit before calling the code. */
|
||||||
#ifndef configPRECONDITION
|
#ifndef configPRECONDITION
|
||||||
#define configPRECONDITION( X ) configASSERT( X )
|
#define configPRECONDITION( X ) configASSERT( X )
|
||||||
#define configPRECONDITION_DEFINED 0
|
#define configPRECONDITION_DEFINED 0
|
||||||
|
@ -314,26 +316,30 @@ hold explicit before calling the code. */
|
||||||
|
|
||||||
/* Remove any unused trace macros. */
|
/* Remove any unused trace macros. */
|
||||||
#ifndef traceSTART
|
#ifndef traceSTART
|
||||||
|
|
||||||
/* Used to perform any necessary initialisation - for example, open a file
|
/* Used to perform any necessary initialisation - for example, open a file
|
||||||
into which trace is to be written. */
|
* into which trace is to be written. */
|
||||||
#define traceSTART()
|
#define traceSTART()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceEND
|
#ifndef traceEND
|
||||||
|
|
||||||
/* Use to close a trace, for example close a file into which trace has been
|
/* Use to close a trace, for example close a file into which trace has been
|
||||||
written. */
|
* written. */
|
||||||
#define traceEND()
|
#define traceEND()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_SWITCHED_IN
|
#ifndef traceTASK_SWITCHED_IN
|
||||||
|
|
||||||
/* Called after a task has been selected to run. pxCurrentTCB holds a pointer
|
/* Called after a task has been selected to run. pxCurrentTCB holds a pointer
|
||||||
to the task control block of the selected task. */
|
* to the task control block of the selected task. */
|
||||||
#define traceTASK_SWITCHED_IN()
|
#define traceTASK_SWITCHED_IN()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceINCREASE_TICK_COUNT
|
#ifndef traceINCREASE_TICK_COUNT
|
||||||
|
|
||||||
/* Called before stepping the tick count after waking from tickless idle
|
/* Called before stepping the tick count after waking from tickless idle
|
||||||
sleep. */
|
* sleep. */
|
||||||
#define traceINCREASE_TICK_COUNT( x )
|
#define traceINCREASE_TICK_COUNT( x )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -348,49 +354,55 @@ hold explicit before calling the code. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_SWITCHED_OUT
|
#ifndef traceTASK_SWITCHED_OUT
|
||||||
|
|
||||||
/* Called before a task has been selected to run. pxCurrentTCB holds a pointer
|
/* Called before a task has been selected to run. pxCurrentTCB holds a pointer
|
||||||
to the task control block of the task being switched out. */
|
* to the task control block of the task being switched out. */
|
||||||
#define traceTASK_SWITCHED_OUT()
|
#define traceTASK_SWITCHED_OUT()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_PRIORITY_INHERIT
|
#ifndef traceTASK_PRIORITY_INHERIT
|
||||||
|
|
||||||
/* Called when a task attempts to take a mutex that is already held by a
|
/* Called when a task attempts to take a mutex that is already held by a
|
||||||
lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task
|
* lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task
|
||||||
that holds the mutex. uxInheritedPriority is the priority the mutex holder
|
* that holds the mutex. uxInheritedPriority is the priority the mutex holder
|
||||||
will inherit (the priority of the task that is attempting to obtain the
|
* will inherit (the priority of the task that is attempting to obtain the
|
||||||
muted. */
|
* muted. */
|
||||||
#define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority )
|
#define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_PRIORITY_DISINHERIT
|
#ifndef traceTASK_PRIORITY_DISINHERIT
|
||||||
|
|
||||||
/* Called when a task releases a mutex, the holding of which had resulted in
|
/* Called when a task releases a mutex, the holding of which had resulted in
|
||||||
the task inheriting the priority of a higher priority task.
|
* the task inheriting the priority of a higher priority task.
|
||||||
pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the
|
* pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the
|
||||||
mutex. uxOriginalPriority is the task's configured (base) priority. */
|
* mutex. uxOriginalPriority is the task's configured (base) priority. */
|
||||||
#define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )
|
#define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceBLOCKING_ON_QUEUE_RECEIVE
|
#ifndef traceBLOCKING_ON_QUEUE_RECEIVE
|
||||||
|
|
||||||
/* Task is about to block because it cannot read from a
|
/* Task is about to block because it cannot read from a
|
||||||
queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
* queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
||||||
upon which the read was attempted. pxCurrentTCB points to the TCB of the
|
* upon which the read was attempted. pxCurrentTCB points to the TCB of the
|
||||||
task that attempted the read. */
|
* task that attempted the read. */
|
||||||
#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue )
|
#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceBLOCKING_ON_QUEUE_PEEK
|
#ifndef traceBLOCKING_ON_QUEUE_PEEK
|
||||||
|
|
||||||
/* Task is about to block because it cannot read from a
|
/* Task is about to block because it cannot read from a
|
||||||
queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
* queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
||||||
upon which the read was attempted. pxCurrentTCB points to the TCB of the
|
* upon which the read was attempted. pxCurrentTCB points to the TCB of the
|
||||||
task that attempted the read. */
|
* task that attempted the read. */
|
||||||
#define traceBLOCKING_ON_QUEUE_PEEK( pxQueue )
|
#define traceBLOCKING_ON_QUEUE_PEEK( pxQueue )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceBLOCKING_ON_QUEUE_SEND
|
#ifndef traceBLOCKING_ON_QUEUE_SEND
|
||||||
|
|
||||||
/* Task is about to block because it cannot write to a
|
/* Task is about to block because it cannot write to a
|
||||||
queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
* queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore
|
||||||
upon which the write was attempted. pxCurrentTCB points to the TCB of the
|
* upon which the write was attempted. pxCurrentTCB points to the TCB of the
|
||||||
task that attempted the write. */
|
* task that attempted the write. */
|
||||||
#define traceBLOCKING_ON_QUEUE_SEND( pxQueue )
|
#define traceBLOCKING_ON_QUEUE_SEND( pxQueue )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -456,6 +468,10 @@ hold explicit before calling the code. */
|
||||||
#define traceCREATE_COUNTING_SEMAPHORE_FAILED()
|
#define traceCREATE_COUNTING_SEMAPHORE_FAILED()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef traceQUEUE_SET_SEND
|
||||||
|
#define traceQUEUE_SET_SEND traceQUEUE_SEND
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef traceQUEUE_SEND
|
#ifndef traceQUEUE_SEND
|
||||||
#define traceQUEUE_SEND( pxQueue )
|
#define traceQUEUE_SEND( pxQueue )
|
||||||
#endif
|
#endif
|
||||||
|
@ -633,31 +649,31 @@ hold explicit before calling the code. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_NOTIFY_TAKE_BLOCK
|
#ifndef traceTASK_NOTIFY_TAKE_BLOCK
|
||||||
#define traceTASK_NOTIFY_TAKE_BLOCK()
|
#define traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_NOTIFY_TAKE
|
#ifndef traceTASK_NOTIFY_TAKE
|
||||||
#define traceTASK_NOTIFY_TAKE()
|
#define traceTASK_NOTIFY_TAKE( uxIndexToWait )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_NOTIFY_WAIT_BLOCK
|
#ifndef traceTASK_NOTIFY_WAIT_BLOCK
|
||||||
#define traceTASK_NOTIFY_WAIT_BLOCK()
|
#define traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_NOTIFY_WAIT
|
#ifndef traceTASK_NOTIFY_WAIT
|
||||||
#define traceTASK_NOTIFY_WAIT()
|
#define traceTASK_NOTIFY_WAIT( uxIndexToWait )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_NOTIFY
|
#ifndef traceTASK_NOTIFY
|
||||||
#define traceTASK_NOTIFY()
|
#define traceTASK_NOTIFY( uxIndexToNotify )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_NOTIFY_FROM_ISR
|
#ifndef traceTASK_NOTIFY_FROM_ISR
|
||||||
#define traceTASK_NOTIFY_FROM_ISR()
|
#define traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR
|
#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR
|
||||||
#define traceTASK_NOTIFY_GIVE_FROM_ISR()
|
#define traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef traceSTREAM_BUFFER_CREATE_FAILED
|
#ifndef traceSTREAM_BUFFER_CREATE_FAILED
|
||||||
|
@ -834,6 +850,14 @@ hold explicit before calling the code. */
|
||||||
#define configUSE_TASK_NOTIFICATIONS 1
|
#define configUSE_TASK_NOTIFICATIONS 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES
|
||||||
|
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1
|
||||||
|
#error configTASK_NOTIFICATION_ARRAY_ENTRIES must be at least 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef configUSE_POSIX_ERRNO
|
#ifndef configUSE_POSIX_ERRNO
|
||||||
#define configUSE_POSIX_ERRNO 0
|
#define configUSE_POSIX_ERRNO 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -853,15 +877,17 @@ hold explicit before calling the code. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configSTACK_DEPTH_TYPE
|
#ifndef configSTACK_DEPTH_TYPE
|
||||||
|
|
||||||
/* Defaults to uint16_t for backward compatibility, but can be overridden
|
/* Defaults to uint16_t for backward compatibility, but can be overridden
|
||||||
in FreeRTOSConfig.h if uint16_t is too restrictive. */
|
* in FreeRTOSConfig.h if uint16_t is too restrictive. */
|
||||||
#define configSTACK_DEPTH_TYPE uint16_t
|
#define configSTACK_DEPTH_TYPE uint16_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configMESSAGE_BUFFER_LENGTH_TYPE
|
#ifndef configMESSAGE_BUFFER_LENGTH_TYPE
|
||||||
|
|
||||||
/* Defaults to size_t for backward compatibility, but can be overridden
|
/* Defaults to size_t for backward compatibility, but can be overridden
|
||||||
in FreeRTOSConfig.h if lengths will always be less than the number of bytes
|
* in FreeRTOSConfig.h if lengths will always be less than the number of bytes
|
||||||
in a size_t. */
|
* in a size_t. */
|
||||||
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
|
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -885,51 +911,56 @@ hold explicit before calling the code. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ( portTICK_TYPE_IS_ATOMIC == 0 )
|
#if ( portTICK_TYPE_IS_ATOMIC == 0 )
|
||||||
|
|
||||||
/* Either variables of tick type cannot be read atomically, or
|
/* Either variables of tick type cannot be read atomically, or
|
||||||
portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when
|
* portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when
|
||||||
the tick count is returned to the standard critical section macros. */
|
* the tick count is returned to the standard critical section macros. */
|
||||||
#define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL()
|
#define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL()
|
||||||
#define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL()
|
#define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL()
|
||||||
#define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
|
#define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
|
||||||
#define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) )
|
#define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) )
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* The tick type can be read atomically, so critical sections used when the
|
/* The tick type can be read atomically, so critical sections used when the
|
||||||
tick count is returned can be defined away. */
|
* tick count is returned can be defined away. */
|
||||||
#define portTICK_TYPE_ENTER_CRITICAL()
|
#define portTICK_TYPE_ENTER_CRITICAL()
|
||||||
#define portTICK_TYPE_EXIT_CRITICAL()
|
#define portTICK_TYPE_EXIT_CRITICAL()
|
||||||
#define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0
|
#define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0
|
||||||
#define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x
|
#define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x
|
||||||
#endif
|
#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */
|
||||||
|
|
||||||
/* Definitions to allow backward compatibility with FreeRTOS versions prior to
|
/* Definitions to allow backward compatibility with FreeRTOS versions prior to
|
||||||
V8 if desired. */
|
* V8 if desired. */
|
||||||
#ifndef configENABLE_BACKWARD_COMPATIBILITY
|
#ifndef configENABLE_BACKWARD_COMPATIBILITY
|
||||||
#define configENABLE_BACKWARD_COMPATIBILITY 1
|
#define configENABLE_BACKWARD_COMPATIBILITY 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configPRINTF
|
#ifndef configPRINTF
|
||||||
|
|
||||||
/* configPRINTF() was not defined, so define it away to nothing. To use
|
/* configPRINTF() was not defined, so define it away to nothing. To use
|
||||||
configPRINTF() then define it as follows (where MyPrintFunction() is
|
* configPRINTF() then define it as follows (where MyPrintFunction() is
|
||||||
provided by the application writer):
|
* provided by the application writer):
|
||||||
|
*
|
||||||
void MyPrintFunction(const char *pcFormat, ... );
|
* void MyPrintFunction(const char *pcFormat, ... );
|
||||||
#define configPRINTF( X ) MyPrintFunction X
|
#define configPRINTF( X ) MyPrintFunction X
|
||||||
|
*
|
||||||
Then call like a standard printf() function, but placing brackets around
|
* Then call like a standard printf() function, but placing brackets around
|
||||||
all parameters so they are passed as a single parameter. For example:
|
* all parameters so they are passed as a single parameter. For example:
|
||||||
configPRINTF( ("Value = %d", MyVariable) ); */
|
* configPRINTF( ("Value = %d", MyVariable) ); */
|
||||||
#define configPRINTF( X )
|
#define configPRINTF( X )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configMAX
|
#ifndef configMAX
|
||||||
|
|
||||||
/* The application writer has not provided their own MAX macro, so define
|
/* The application writer has not provided their own MAX macro, so define
|
||||||
the following generic implementation. */
|
* the following generic implementation. */
|
||||||
#define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
|
#define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configMIN
|
#ifndef configMIN
|
||||||
|
|
||||||
/* The application writer has not provided their own MAX macro, so define
|
/* The application writer has not provided their own MAX macro, so define
|
||||||
the following generic implementation. */
|
* the following generic implementation. */
|
||||||
#define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
|
#define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -956,14 +987,14 @@ V8 if desired. */
|
||||||
#define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter
|
#define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter
|
||||||
|
|
||||||
/* Backward compatibility within the scheduler code only - these definitions
|
/* Backward compatibility within the scheduler code only - these definitions
|
||||||
are not really required but are included for completeness. */
|
* are not really required but are included for completeness. */
|
||||||
#define tmrTIMER_CALLBACK TimerCallbackFunction_t
|
#define tmrTIMER_CALLBACK TimerCallbackFunction_t
|
||||||
#define pdTASK_CODE TaskFunction_t
|
#define pdTASK_CODE TaskFunction_t
|
||||||
#define xListItem ListItem_t
|
#define xListItem ListItem_t
|
||||||
#define xList List_t
|
#define xList List_t
|
||||||
|
|
||||||
/* For libraries that break the list data hiding, and access list structure
|
/* For libraries that break the list data hiding, and access list structure
|
||||||
members directly (which is not supposed to be done). */
|
* members directly (which is not supposed to be done). */
|
||||||
#define pxContainer pvContainer
|
#define pxContainer pvContainer
|
||||||
#endif /* configENABLE_BACKWARD_COMPATIBILITY */
|
#endif /* configENABLE_BACKWARD_COMPATIBILITY */
|
||||||
|
|
||||||
|
@ -972,33 +1003,33 @@ V8 if desired. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even
|
/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even
|
||||||
if floating point hardware is otherwise supported by the FreeRTOS port in use.
|
* if floating point hardware is otherwise supported by the FreeRTOS port in use.
|
||||||
This constant is not supported by all FreeRTOS ports that include floating
|
* This constant is not supported by all FreeRTOS ports that include floating
|
||||||
point support. */
|
* point support. */
|
||||||
#ifndef configUSE_TASK_FPU_SUPPORT
|
#ifndef configUSE_TASK_FPU_SUPPORT
|
||||||
#define configUSE_TASK_FPU_SUPPORT 1
|
#define configUSE_TASK_FPU_SUPPORT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is
|
/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is
|
||||||
currently used in ARMv8M ports. */
|
* currently used in ARMv8M ports. */
|
||||||
#ifndef configENABLE_MPU
|
#ifndef configENABLE_MPU
|
||||||
#define configENABLE_MPU 0
|
#define configENABLE_MPU 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is
|
/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is
|
||||||
currently used in ARMv8M ports. */
|
* currently used in ARMv8M ports. */
|
||||||
#ifndef configENABLE_FPU
|
#ifndef configENABLE_FPU
|
||||||
#define configENABLE_FPU 1
|
#define configENABLE_FPU 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it.
|
/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it.
|
||||||
This is currently used in ARMv8M ports. */
|
* This is currently used in ARMv8M ports. */
|
||||||
#ifndef configENABLE_TRUSTZONE
|
#ifndef configENABLE_TRUSTZONE
|
||||||
#define configENABLE_TRUSTZONE 1
|
#define configENABLE_TRUSTZONE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on
|
/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on
|
||||||
the Secure Side only. */
|
* the Secure Side only. */
|
||||||
#ifndef configRUN_FREERTOS_SECURE_ONLY
|
#ifndef configRUN_FREERTOS_SECURE_ONLY
|
||||||
#define configRUN_FREERTOS_SECURE_ONLY 0
|
#define configRUN_FREERTOS_SECURE_ONLY 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -1045,7 +1076,8 @@ the Secure Side only. */
|
||||||
* | | | | xTaskCreateRestrictedStatic | | | |
|
* | | | | xTaskCreateRestrictedStatic | | | |
|
||||||
* +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
|
* +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
|
||||||
*/
|
*/
|
||||||
#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \
|
#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE \
|
||||||
|
( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \
|
||||||
( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) )
|
( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1144,8 +1176,8 @@ typedef struct xSTATIC_TCB
|
||||||
struct _reent xDummy17;
|
struct _reent xDummy17;
|
||||||
#endif
|
#endif
|
||||||
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
uint32_t ulDummy18;
|
uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
|
||||||
uint8_t ucDummy19;
|
uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
|
||||||
#endif
|
#endif
|
||||||
#if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
|
#if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
|
||||||
uint8_t uxDummy20;
|
uint8_t uxDummy20;
|
||||||
|
@ -1199,7 +1231,6 @@ typedef struct xSTATIC_QUEUE
|
||||||
UBaseType_t uxDummy8;
|
UBaseType_t uxDummy8;
|
||||||
uint8_t ucDummy9;
|
uint8_t ucDummy9;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} StaticQueue_t;
|
} StaticQueue_t;
|
||||||
typedef StaticQueue_t StaticSemaphore_t;
|
typedef StaticQueue_t StaticSemaphore_t;
|
||||||
|
|
||||||
|
@ -1229,7 +1260,6 @@ typedef struct xSTATIC_EVENT_GROUP
|
||||||
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
||||||
uint8_t ucDummy4;
|
uint8_t ucDummy4;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} StaticEventGroup_t;
|
} StaticEventGroup_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1257,7 +1287,6 @@ typedef struct xSTATIC_TIMER
|
||||||
UBaseType_t uxDummy7;
|
UBaseType_t uxDummy7;
|
||||||
#endif
|
#endif
|
||||||
uint8_t ucDummy8;
|
uint8_t ucDummy8;
|
||||||
|
|
||||||
} StaticTimer_t;
|
} StaticTimer_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1287,9 +1316,10 @@ typedef struct xSTATIC_STREAM_BUFFER
|
||||||
/* Message buffers are built on stream buffers. */
|
/* Message buffers are built on stream buffers. */
|
||||||
typedef StaticStreamBuffer_t StaticMessageBuffer_t;
|
typedef StaticStreamBuffer_t StaticMessageBuffer_t;
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif /* INC_FREERTOS_H */
|
#endif /* INC_FREERTOS_H */
|
||||||
|
|
||||||
|
|
|
@ -19,115 +19,14 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef STACK_MACROS_H
|
|
||||||
#define STACK_MACROS_H
|
|
||||||
|
|
||||||
#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */
|
#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */
|
||||||
#warning The name of this file has changed to stack_macros.h. Please update your code accordingly. This source file (which has the original name) will be removed in future released.
|
#warning The name of this file has changed to stack_macros.h. Please update your code accordingly. This source file (which has the original name) will be removed in future released.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#include "stack_macros.h"
|
||||||
* Call the stack overflow hook function if the stack of the task being swapped
|
|
||||||
* out is currently overflowed, or looks like it might have overflowed in the
|
|
||||||
* past.
|
|
||||||
*
|
|
||||||
* Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check
|
|
||||||
* the current stack state only - comparing the current top of stack value to
|
|
||||||
* the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1
|
|
||||||
* will also cause the last few stack bytes to be checked to ensure the value
|
|
||||||
* to which the bytes were set when the task was created have not been
|
|
||||||
* overwritten. Note this second test does not guarantee that an overflowed
|
|
||||||
* stack will always be recognised.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )
|
|
||||||
|
|
||||||
/* Only the current stack state is to be checked. */
|
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
/* Is the currently saved stack pointer within the stack limit? */ \
|
|
||||||
if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) )
|
|
||||||
|
|
||||||
/* Only the current stack state is to be checked. */
|
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
\
|
|
||||||
/* Is the currently saved stack pointer within the stack limit? */ \
|
|
||||||
if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )
|
|
||||||
|
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \
|
|
||||||
const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \
|
|
||||||
\
|
|
||||||
if( ( pulStack[ 0 ] != ulCheckValue ) || \
|
|
||||||
( pulStack[ 1 ] != ulCheckValue ) || \
|
|
||||||
( pulStack[ 2 ] != ulCheckValue ) || \
|
|
||||||
( pulStack[ 3 ] != ulCheckValue ) ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )
|
|
||||||
|
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW() \
|
|
||||||
{ \
|
|
||||||
int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \
|
|
||||||
static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
|
||||||
tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
pcEndOfStack -= sizeof( ucExpectedStackBytes ); \
|
|
||||||
\
|
|
||||||
/* Has the extremity of the task stack ever been written over? */ \
|
|
||||||
if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \
|
|
||||||
{ \
|
|
||||||
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Remove stack overflow macro if not being used. */
|
|
||||||
#ifndef taskCHECK_FOR_STACK_OVERFLOW
|
|
||||||
#define taskCHECK_FOR_STACK_OVERFLOW()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* STACK_MACROS_H */
|
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -44,9 +43,11 @@
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Port specific definitions -- entering/exiting critical section.
|
* Port specific definitions -- entering/exiting critical section.
|
||||||
|
@ -407,8 +408,10 @@ uint32_t ulCurrent;
|
||||||
return ulCurrent;
|
return ulCurrent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif /* ATOMIC_H */
|
#endif /* ATOMIC_H */
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CO_ROUTINE_H
|
#ifndef CO_ROUTINE_H
|
||||||
|
@ -34,17 +33,20 @@
|
||||||
|
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/* Used to hide the implementation of the co-routine control block. The
|
/* Used to hide the implementation of the co-routine control block. The
|
||||||
control block structure however has to be included in the header due to
|
* control block structure however has to be included in the header due to
|
||||||
the macro implementation of the co-routine functionality. */
|
* the macro implementation of the co-routine functionality. */
|
||||||
typedef void * CoRoutineHandle_t;
|
typedef void * CoRoutineHandle_t;
|
||||||
|
|
||||||
/* Defines the prototype to which co-routine functions must conform. */
|
/* Defines the prototype to which co-routine functions must conform. */
|
||||||
typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t );
|
typedef void (* crCOROUTINE_CODE)( CoRoutineHandle_t,
|
||||||
|
UBaseType_t );
|
||||||
|
|
||||||
typedef struct corCoRoutineControlBlock
|
typedef struct corCoRoutineControlBlock
|
||||||
{
|
{
|
||||||
|
@ -59,11 +61,12 @@ typedef struct corCoRoutineControlBlock
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
BaseType_t xCoRoutineCreate(
|
* BaseType_t xCoRoutineCreate(
|
||||||
crCOROUTINE_CODE pxCoRoutineCode,
|
* crCOROUTINE_CODE pxCoRoutineCode,
|
||||||
UBaseType_t uxPriority,
|
* UBaseType_t uxPriority,
|
||||||
UBaseType_t uxIndex
|
* UBaseType_t uxIndex
|
||||||
);</pre>
|
* );
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* Create a new co-routine and add it to the list of co-routines that are
|
* Create a new co-routine and add it to the list of co-routines that are
|
||||||
* ready to run.
|
* ready to run.
|
||||||
|
@ -83,58 +86,61 @@ typedef struct corCoRoutineControlBlock
|
||||||
* list, otherwise an error code defined with ProjDefs.h.
|
* list, otherwise an error code defined with ProjDefs.h.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// Co-routine to be created.
|
* // Co-routine to be created.
|
||||||
void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
* // Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
||||||
// This may not be necessary for const variables.
|
* // This may not be necessary for const variables.
|
||||||
static const char cLedToFlash[ 2 ] = { 5, 6 };
|
* static const char cLedToFlash[ 2 ] = { 5, 6 };
|
||||||
static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
|
* static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
|
||||||
|
*
|
||||||
// Must start every co-routine with a call to crSTART();
|
* // Must start every co-routine with a call to crSTART();
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// This co-routine just delays for a fixed period, then toggles
|
* // This co-routine just delays for a fixed period, then toggles
|
||||||
// an LED. Two co-routines are created using this function, so
|
* // an LED. Two co-routines are created using this function, so
|
||||||
// the uxIndex parameter is used to tell the co-routine which
|
* // the uxIndex parameter is used to tell the co-routine which
|
||||||
// LED to flash and how int32_t to delay. This assumes xQueue has
|
* // LED to flash and how int32_t to delay. This assumes xQueue has
|
||||||
// already been created.
|
* // already been created.
|
||||||
vParTestToggleLED( cLedToFlash[ uxIndex ] );
|
* vParTestToggleLED( cLedToFlash[ uxIndex ] );
|
||||||
crDELAY( xHandle, uxFlashRates[ uxIndex ] );
|
* crDELAY( xHandle, uxFlashRates[ uxIndex ] );
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Must end every co-routine with a call to crEND();
|
* // Must end every co-routine with a call to crEND();
|
||||||
crEND();
|
* crEND();
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Function that creates two co-routines.
|
* // Function that creates two co-routines.
|
||||||
void vOtherFunction( void )
|
* void vOtherFunction( void )
|
||||||
{
|
* {
|
||||||
uint8_t ucParameterToPass;
|
* uint8_t ucParameterToPass;
|
||||||
TaskHandle_t xHandle;
|
* TaskHandle_t xHandle;
|
||||||
|
*
|
||||||
// Create two co-routines at priority 0. The first is given index 0
|
* // Create two co-routines at priority 0. The first is given index 0
|
||||||
// so (from the code above) toggles LED 5 every 200 ticks. The second
|
* // so (from the code above) toggles LED 5 every 200 ticks. The second
|
||||||
// is given index 1 so toggles LED 6 every 400 ticks.
|
* // is given index 1 so toggles LED 6 every 400 ticks.
|
||||||
for( uxIndex = 0; uxIndex < 2; uxIndex++ )
|
* for( uxIndex = 0; uxIndex < 2; uxIndex++ )
|
||||||
{
|
* {
|
||||||
xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
|
* xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xCoRoutineCreate xCoRoutineCreate
|
* \defgroup xCoRoutineCreate xCoRoutineCreate
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex );
|
BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode,
|
||||||
|
UBaseType_t uxPriority,
|
||||||
|
UBaseType_t uxIndex );
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
void vCoRoutineSchedule( void );</pre>
|
* void vCoRoutineSchedule( void );
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* Run a co-routine.
|
* Run a co-routine.
|
||||||
*
|
*
|
||||||
|
@ -148,25 +154,25 @@ BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPri
|
||||||
* hook).
|
* hook).
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// This idle task hook will schedule a co-routine each time it is called.
|
* // This idle task hook will schedule a co-routine each time it is called.
|
||||||
// The rest of the idle task will execute between co-routine calls.
|
* // The rest of the idle task will execute between co-routine calls.
|
||||||
void vApplicationIdleHook( void )
|
* void vApplicationIdleHook( void )
|
||||||
{
|
* {
|
||||||
vCoRoutineSchedule();
|
* vCoRoutineSchedule();
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Alternatively, if you do not require any other part of the idle task to
|
* // Alternatively, if you do not require any other part of the idle task to
|
||||||
// execute, the idle task hook can call vCoRoutineSchedule() within an
|
* // execute, the idle task hook can call vCoRoutineSchedule() within an
|
||||||
// infinite loop.
|
* // infinite loop.
|
||||||
void vApplicationIdleHook( void )
|
* void vApplicationIdleHook( void )
|
||||||
{
|
* {
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
vCoRoutineSchedule();
|
* vCoRoutineSchedule();
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup vCoRoutineSchedule vCoRoutineSchedule
|
* \defgroup vCoRoutineSchedule vCoRoutineSchedule
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
|
@ -175,60 +181,66 @@ void vCoRoutineSchedule( void );
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
crSTART( CoRoutineHandle_t xHandle );</pre>
|
* crSTART( CoRoutineHandle_t xHandle );
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* This macro MUST always be called at the start of a co-routine function.
|
* This macro MUST always be called at the start of a co-routine function.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// Co-routine to be created.
|
* // Co-routine to be created.
|
||||||
void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
* // Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
||||||
static int32_t ulAVariable;
|
* static int32_t ulAVariable;
|
||||||
|
*
|
||||||
// Must start every co-routine with a call to crSTART();
|
* // Must start every co-routine with a call to crSTART();
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Co-routine functionality goes here.
|
* // Co-routine functionality goes here.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Must end every co-routine with a call to crEND();
|
* // Must end every co-routine with a call to crEND();
|
||||||
crEND();
|
* crEND();
|
||||||
}</pre>
|
* }
|
||||||
|
* </pre>
|
||||||
* \defgroup crSTART crSTART
|
* \defgroup crSTART crSTART
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0:
|
#define crSTART( pxCRCB ) \
|
||||||
|
switch( ( ( CRCB_t * ) ( pxCRCB ) )->uxState ) { \
|
||||||
|
case 0:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
crEND();</pre>
|
* crEND();
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* This macro MUST always be called at the end of a co-routine function.
|
* This macro MUST always be called at the end of a co-routine function.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// Co-routine to be created.
|
* // Co-routine to be created.
|
||||||
void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
* // Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
||||||
static int32_t ulAVariable;
|
* static int32_t ulAVariable;
|
||||||
|
*
|
||||||
// Must start every co-routine with a call to crSTART();
|
* // Must start every co-routine with a call to crSTART();
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Co-routine functionality goes here.
|
* // Co-routine functionality goes here.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Must end every co-routine with a call to crEND();
|
* // Must end every co-routine with a call to crEND();
|
||||||
crEND();
|
* crEND();
|
||||||
}</pre>
|
* }
|
||||||
|
* </pre>
|
||||||
* \defgroup crSTART crSTART
|
* \defgroup crSTART crSTART
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
|
@ -238,13 +250,18 @@ void vCoRoutineSchedule( void );
|
||||||
* These macros are intended for internal use by the co-routine implementation
|
* These macros are intended for internal use by the co-routine implementation
|
||||||
* only. The macros should not be used directly by application writers.
|
* only. The macros should not be used directly by application writers.
|
||||||
*/
|
*/
|
||||||
#define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2):
|
#define crSET_STATE0( xHandle ) \
|
||||||
#define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1):
|
( ( CRCB_t * ) ( xHandle ) )->uxState = ( __LINE__ * 2 ); return; \
|
||||||
|
case ( __LINE__ * 2 ):
|
||||||
|
#define crSET_STATE1( xHandle ) \
|
||||||
|
( ( CRCB_t * ) ( xHandle ) )->uxState = ( ( __LINE__ * 2 ) + 1 ); return; \
|
||||||
|
case ( ( __LINE__ * 2 ) + 1 ):
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );</pre>
|
* crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* Delay a co-routine for a fixed period of time.
|
* Delay a co-routine for a fixed period of time.
|
||||||
*
|
*
|
||||||
|
@ -261,29 +278,30 @@ void vCoRoutineSchedule( void );
|
||||||
* can be used to convert ticks to milliseconds.
|
* can be used to convert ticks to milliseconds.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// Co-routine to be created.
|
* // Co-routine to be created.
|
||||||
void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
* // Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
||||||
// This may not be necessary for const variables.
|
* // This may not be necessary for const variables.
|
||||||
// We are to delay for 200ms.
|
* // We are to delay for 200ms.
|
||||||
static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
|
* static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
|
||||||
|
*
|
||||||
// Must start every co-routine with a call to crSTART();
|
* // Must start every co-routine with a call to crSTART();
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Delay for 200ms.
|
* // Delay for 200ms.
|
||||||
crDELAY( xHandle, xDelayTime );
|
* crDELAY( xHandle, xDelayTime );
|
||||||
|
*
|
||||||
// Do something here.
|
* // Do something here.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Must end every co-routine with a call to crEND();
|
* // Must end every co-routine with a call to crEND();
|
||||||
crEND();
|
* crEND();
|
||||||
}</pre>
|
* }
|
||||||
|
* </pre>
|
||||||
* \defgroup crDELAY crDELAY
|
* \defgroup crDELAY crDELAY
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
|
@ -296,13 +314,14 @@ void vCoRoutineSchedule( void );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
crQUEUE_SEND(
|
* crQUEUE_SEND(
|
||||||
CoRoutineHandle_t xHandle,
|
* CoRoutineHandle_t xHandle,
|
||||||
QueueHandle_t pxQueue,
|
* QueueHandle_t pxQueue,
|
||||||
void *pvItemToQueue,
|
* void *pvItemToQueue,
|
||||||
TickType_t xTicksToWait,
|
* TickType_t xTicksToWait,
|
||||||
BaseType_t *pxResult
|
* BaseType_t *pxResult
|
||||||
)</pre>
|
* )
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine
|
* The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine
|
||||||
* equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.
|
* equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.
|
||||||
|
@ -342,38 +361,39 @@ void vCoRoutineSchedule( void );
|
||||||
* error defined within ProjDefs.h.
|
* error defined within ProjDefs.h.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// Co-routine function that blocks for a fixed period then posts a number onto
|
* // Co-routine function that blocks for a fixed period then posts a number onto
|
||||||
// a queue.
|
* // a queue.
|
||||||
static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
* // Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
||||||
static BaseType_t xNumberToPost = 0;
|
* static BaseType_t xNumberToPost = 0;
|
||||||
static BaseType_t xResult;
|
* static BaseType_t xResult;
|
||||||
|
*
|
||||||
// Co-routines must begin with a call to crSTART().
|
* // Co-routines must begin with a call to crSTART().
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// This assumes the queue has already been created.
|
* // This assumes the queue has already been created.
|
||||||
crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
|
* crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
|
||||||
|
*
|
||||||
if( xResult != pdPASS )
|
* if( xResult != pdPASS )
|
||||||
{
|
* {
|
||||||
// The message was not posted!
|
* // The message was not posted!
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Increment the number to be posted onto the queue.
|
* // Increment the number to be posted onto the queue.
|
||||||
xNumberToPost++;
|
* xNumberToPost++;
|
||||||
|
*
|
||||||
// Delay for 100 ticks.
|
* // Delay for 100 ticks.
|
||||||
crDELAY( xHandle, 100 );
|
* crDELAY( xHandle, 100 );
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Co-routines must end with a call to crEND().
|
* // Co-routines must end with a call to crEND().
|
||||||
crEND();
|
* crEND();
|
||||||
}</pre>
|
* }
|
||||||
|
* </pre>
|
||||||
* \defgroup crQUEUE_SEND crQUEUE_SEND
|
* \defgroup crQUEUE_SEND crQUEUE_SEND
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
|
@ -395,13 +415,14 @@ void vCoRoutineSchedule( void );
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
crQUEUE_RECEIVE(
|
* crQUEUE_RECEIVE(
|
||||||
CoRoutineHandle_t xHandle,
|
* CoRoutineHandle_t xHandle,
|
||||||
QueueHandle_t pxQueue,
|
* QueueHandle_t pxQueue,
|
||||||
void *pvBuffer,
|
* void *pvBuffer,
|
||||||
TickType_t xTicksToWait,
|
* TickType_t xTicksToWait,
|
||||||
BaseType_t *pxResult
|
* BaseType_t *pxResult
|
||||||
)</pre>
|
* )
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine
|
* The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine
|
||||||
* equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.
|
* equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.
|
||||||
|
@ -440,32 +461,33 @@ void vCoRoutineSchedule( void );
|
||||||
* an error code as defined within ProjDefs.h.
|
* an error code as defined within ProjDefs.h.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// A co-routine receives the number of an LED to flash from a queue. It
|
* // A co-routine receives the number of an LED to flash from a queue. It
|
||||||
// blocks on the queue until the number is received.
|
* // blocks on the queue until the number is received.
|
||||||
static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
// Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
* // Variables in co-routines must be declared static if they must maintain value across a blocking call.
|
||||||
static BaseType_t xResult;
|
* static BaseType_t xResult;
|
||||||
static UBaseType_t uxLEDToFlash;
|
* static UBaseType_t uxLEDToFlash;
|
||||||
|
*
|
||||||
// All co-routines must start with a call to crSTART().
|
* // All co-routines must start with a call to crSTART().
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Wait for data to become available on the queue.
|
* // Wait for data to become available on the queue.
|
||||||
crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
|
* crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
|
||||||
|
*
|
||||||
if( xResult == pdPASS )
|
* if( xResult == pdPASS )
|
||||||
{
|
* {
|
||||||
// We received the LED to flash - flash it!
|
* // We received the LED to flash - flash it!
|
||||||
vParTestToggleLED( uxLEDToFlash );
|
* vParTestToggleLED( uxLEDToFlash );
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
crEND();
|
* crEND();
|
||||||
}</pre>
|
* }
|
||||||
|
* </pre>
|
||||||
* \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE
|
* \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
|
@ -487,11 +509,12 @@ void vCoRoutineSchedule( void );
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
crQUEUE_SEND_FROM_ISR(
|
* crQUEUE_SEND_FROM_ISR(
|
||||||
QueueHandle_t pxQueue,
|
* QueueHandle_t pxQueue,
|
||||||
void *pvItemToQueue,
|
* void *pvItemToQueue,
|
||||||
BaseType_t xCoRoutinePreviouslyWoken
|
* BaseType_t xCoRoutinePreviouslyWoken
|
||||||
)</pre>
|
* )
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the
|
* The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the
|
||||||
* co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()
|
* co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()
|
||||||
|
@ -526,69 +549,72 @@ void vCoRoutineSchedule( void );
|
||||||
* the ISR.
|
* the ISR.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// A co-routine that blocks on a queue waiting for characters to be received.
|
* // A co-routine that blocks on a queue waiting for characters to be received.
|
||||||
static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
char cRxedChar;
|
* char cRxedChar;
|
||||||
BaseType_t xResult;
|
* BaseType_t xResult;
|
||||||
|
*
|
||||||
// All co-routines must start with a call to crSTART().
|
* // All co-routines must start with a call to crSTART().
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Wait for data to become available on the queue. This assumes the
|
* // Wait for data to become available on the queue. This assumes the
|
||||||
// queue xCommsRxQueue has already been created!
|
* // queue xCommsRxQueue has already been created!
|
||||||
crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
|
* crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
|
||||||
|
*
|
||||||
// Was a character received?
|
* // Was a character received?
|
||||||
if( xResult == pdPASS )
|
* if( xResult == pdPASS )
|
||||||
{
|
* {
|
||||||
// Process the character here.
|
* // Process the character here.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// All co-routines must end with a call to crEND().
|
* // All co-routines must end with a call to crEND().
|
||||||
crEND();
|
* crEND();
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// An ISR that uses a queue to send characters received on a serial port to
|
* // An ISR that uses a queue to send characters received on a serial port to
|
||||||
// a co-routine.
|
* // a co-routine.
|
||||||
void vUART_ISR( void )
|
* void vUART_ISR( void )
|
||||||
{
|
* {
|
||||||
char cRxedChar;
|
* char cRxedChar;
|
||||||
BaseType_t xCRWokenByPost = pdFALSE;
|
* BaseType_t xCRWokenByPost = pdFALSE;
|
||||||
|
*
|
||||||
// We loop around reading characters until there are none left in the UART.
|
* // We loop around reading characters until there are none left in the UART.
|
||||||
while( UART_RX_REG_NOT_EMPTY() )
|
* while( UART_RX_REG_NOT_EMPTY() )
|
||||||
{
|
* {
|
||||||
// Obtain the character from the UART.
|
* // Obtain the character from the UART.
|
||||||
cRxedChar = UART_RX_REG;
|
* cRxedChar = UART_RX_REG;
|
||||||
|
*
|
||||||
// Post the character onto a queue. xCRWokenByPost will be pdFALSE
|
* // Post the character onto a queue. xCRWokenByPost will be pdFALSE
|
||||||
// the first time around the loop. If the post causes a co-routine
|
* // the first time around the loop. If the post causes a co-routine
|
||||||
// to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
|
* // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
|
||||||
// In this manner we can ensure that if more than one co-routine is
|
* // In this manner we can ensure that if more than one co-routine is
|
||||||
// blocked on the queue only one is woken by this ISR no matter how
|
* // blocked on the queue only one is woken by this ISR no matter how
|
||||||
// many characters are posted to the queue.
|
* // many characters are posted to the queue.
|
||||||
xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
|
* xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
|
||||||
}
|
* }
|
||||||
}</pre>
|
* }
|
||||||
|
* </pre>
|
||||||
* \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR
|
* \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) )
|
#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) \
|
||||||
|
xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) )
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* croutine. h
|
* croutine. h
|
||||||
* <pre>
|
* <pre>
|
||||||
crQUEUE_SEND_FROM_ISR(
|
* crQUEUE_SEND_FROM_ISR(
|
||||||
QueueHandle_t pxQueue,
|
* QueueHandle_t pxQueue,
|
||||||
void *pvBuffer,
|
* void *pvBuffer,
|
||||||
BaseType_t * pxCoRoutineWoken
|
* BaseType_t * pxCoRoutineWoken
|
||||||
)</pre>
|
* )
|
||||||
|
* </pre>
|
||||||
*
|
*
|
||||||
* The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the
|
* The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the
|
||||||
* co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()
|
* co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()
|
||||||
|
@ -623,75 +649,77 @@ void vCoRoutineSchedule( void );
|
||||||
* pdFALSE.
|
* pdFALSE.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// A co-routine that posts a character to a queue then blocks for a fixed
|
* // A co-routine that posts a character to a queue then blocks for a fixed
|
||||||
// period. The character is incremented each time.
|
* // period. The character is incremented each time.
|
||||||
static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
* static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
|
||||||
{
|
* {
|
||||||
// cChar holds its value while this co-routine is blocked and must therefore
|
* // cChar holds its value while this co-routine is blocked and must therefore
|
||||||
// be declared static.
|
* // be declared static.
|
||||||
static char cCharToTx = 'a';
|
* static char cCharToTx = 'a';
|
||||||
BaseType_t xResult;
|
* BaseType_t xResult;
|
||||||
|
*
|
||||||
// All co-routines must start with a call to crSTART().
|
* // All co-routines must start with a call to crSTART().
|
||||||
crSTART( xHandle );
|
* crSTART( xHandle );
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Send the next character to the queue.
|
* // Send the next character to the queue.
|
||||||
crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
|
* crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
|
||||||
|
*
|
||||||
if( xResult == pdPASS )
|
* if( xResult == pdPASS )
|
||||||
{
|
* {
|
||||||
// The character was successfully posted to the queue.
|
* // The character was successfully posted to the queue.
|
||||||
}
|
* }
|
||||||
else
|
* else
|
||||||
{
|
* {
|
||||||
// Could not post the character to the queue.
|
* // Could not post the character to the queue.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Enable the UART Tx interrupt to cause an interrupt in this
|
* // Enable the UART Tx interrupt to cause an interrupt in this
|
||||||
// hypothetical UART. The interrupt will obtain the character
|
* // hypothetical UART. The interrupt will obtain the character
|
||||||
// from the queue and send it.
|
* // from the queue and send it.
|
||||||
ENABLE_RX_INTERRUPT();
|
* ENABLE_RX_INTERRUPT();
|
||||||
|
*
|
||||||
// Increment to the next character then block for a fixed period.
|
* // Increment to the next character then block for a fixed period.
|
||||||
// cCharToTx will maintain its value across the delay as it is
|
* // cCharToTx will maintain its value across the delay as it is
|
||||||
// declared static.
|
* // declared static.
|
||||||
cCharToTx++;
|
* cCharToTx++;
|
||||||
if( cCharToTx > 'x' )
|
* if( cCharToTx > 'x' )
|
||||||
{
|
* {
|
||||||
cCharToTx = 'a';
|
* cCharToTx = 'a';
|
||||||
}
|
* }
|
||||||
crDELAY( 100 );
|
* crDELAY( 100 );
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// All co-routines must end with a call to crEND().
|
* // All co-routines must end with a call to crEND().
|
||||||
crEND();
|
* crEND();
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// An ISR that uses a queue to receive characters to send on a UART.
|
* // An ISR that uses a queue to receive characters to send on a UART.
|
||||||
void vUART_ISR( void )
|
* void vUART_ISR( void )
|
||||||
{
|
* {
|
||||||
char cCharToTx;
|
* char cCharToTx;
|
||||||
BaseType_t xCRWokenByPost = pdFALSE;
|
* BaseType_t xCRWokenByPost = pdFALSE;
|
||||||
|
*
|
||||||
while( UART_TX_REG_EMPTY() )
|
* while( UART_TX_REG_EMPTY() )
|
||||||
{
|
* {
|
||||||
// Are there any characters in the queue waiting to be sent?
|
* // Are there any characters in the queue waiting to be sent?
|
||||||
// xCRWokenByPost will automatically be set to pdTRUE if a co-routine
|
* // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
|
||||||
// is woken by the post - ensuring that only a single co-routine is
|
* // is woken by the post - ensuring that only a single co-routine is
|
||||||
// woken no matter how many times we go around this loop.
|
* // woken no matter how many times we go around this loop.
|
||||||
if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
|
* if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
|
||||||
{
|
* {
|
||||||
SEND_CHARACTER( cCharToTx );
|
* SEND_CHARACTER( cCharToTx );
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
}</pre>
|
* }
|
||||||
|
* </pre>
|
||||||
* \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR
|
* \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) )
|
#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) \
|
||||||
|
xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is intended for internal use by the co-routine macros only.
|
* This function is intended for internal use by the co-routine macros only.
|
||||||
|
@ -702,7 +730,8 @@ void vCoRoutineSchedule( void );
|
||||||
* Removes the current co-routine from its ready list and places it in the
|
* Removes the current co-routine from its ready list and places it in the
|
||||||
* appropriate delayed list.
|
* appropriate delayed list.
|
||||||
*/
|
*/
|
||||||
void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList );
|
void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay,
|
||||||
|
List_t * pxEventList );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function is intended for internal use by the queue implementation only.
|
* This function is intended for internal use by the queue implementation only.
|
||||||
|
@ -713,8 +742,10 @@ void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList )
|
||||||
*/
|
*/
|
||||||
BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList );
|
BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList );
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif /* CO_ROUTINE_H */
|
#endif /* CO_ROUTINE_H */
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DEPRECATED_DEFINITIONS_H
|
#ifndef DEPRECATED_DEFINITIONS_H
|
||||||
|
@ -30,13 +29,13 @@
|
||||||
|
|
||||||
|
|
||||||
/* Each FreeRTOS port has a unique portmacro.h header file. Originally a
|
/* Each FreeRTOS port has a unique portmacro.h header file. Originally a
|
||||||
pre-processor definition was used to ensure the pre-processor found the correct
|
* pre-processor definition was used to ensure the pre-processor found the correct
|
||||||
portmacro.h file for the port being used. That scheme was deprecated in favour
|
* portmacro.h file for the port being used. That scheme was deprecated in favour
|
||||||
of setting the compiler's include path such that it found the correct
|
* of setting the compiler's include path such that it found the correct
|
||||||
portmacro.h file - removing the need for the constant and allowing the
|
* portmacro.h file - removing the need for the constant and allowing the
|
||||||
portmacro.h file to be located anywhere in relation to the port being used. The
|
* portmacro.h file to be located anywhere in relation to the port being used. The
|
||||||
definitions below remain in the code for backward compatibility only. New
|
* definitions below remain in the code for backward compatibility only. New
|
||||||
projects should not use them. */
|
* projects should not use them. */
|
||||||
|
|
||||||
#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT
|
#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT
|
||||||
#include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h"
|
#include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h"
|
||||||
|
@ -209,16 +208,18 @@ projects should not use them. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BCC_INDUSTRIAL_PC_PORT
|
#ifdef BCC_INDUSTRIAL_PC_PORT
|
||||||
|
|
||||||
/* A short file name has to be used in place of the normal
|
/* A short file name has to be used in place of the normal
|
||||||
FreeRTOSConfig.h when using the Borland compiler. */
|
* FreeRTOSConfig.h when using the Borland compiler. */
|
||||||
#include "frconfig.h"
|
#include "frconfig.h"
|
||||||
#include "..\portable\BCC\16BitDOS\PC\prtmacro.h"
|
#include "..\portable\BCC\16BitDOS\PC\prtmacro.h"
|
||||||
typedef void ( __interrupt __far * pxISR )();
|
typedef void ( __interrupt __far * pxISR )();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BCC_FLASH_LITE_186_PORT
|
#ifdef BCC_FLASH_LITE_186_PORT
|
||||||
|
|
||||||
/* A short file name has to be used in place of the normal
|
/* A short file name has to be used in place of the normal
|
||||||
FreeRTOSConfig.h when using the Borland compiler. */
|
* FreeRTOSConfig.h when using the Borland compiler. */
|
||||||
#include "frconfig.h"
|
#include "frconfig.h"
|
||||||
#include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h"
|
#include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h"
|
||||||
typedef void ( __interrupt __far * pxISR )();
|
typedef void ( __interrupt __far * pxISR )();
|
||||||
|
@ -276,4 +277,3 @@ projects should not use them. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* DEPRECATED_DEFINITIONS_H */
|
#endif /* DEPRECATED_DEFINITIONS_H */
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EVENT_GROUPS_H
|
#ifndef EVENT_GROUPS_H
|
||||||
|
@ -35,9 +34,11 @@
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An event group is a collection of bits to which an application can assign a
|
* An event group is a collection of bits to which an application can assign a
|
||||||
|
@ -94,8 +95,8 @@ typedef TickType_t EventBits_t;
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventGroupHandle_t xEventGroupCreate( void );
|
* EventGroupHandle_t xEventGroupCreate( void );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Create a new event group.
|
* Create a new event group.
|
||||||
*
|
*
|
||||||
|
@ -103,7 +104,7 @@ typedef TickType_t EventBits_t;
|
||||||
* block of memory, in which the event group's structure is stored. If an event
|
* block of memory, in which the event group's structure is stored. If an event
|
||||||
* groups is created using xEventGropuCreate() then the required memory is
|
* groups is created using xEventGropuCreate() then the required memory is
|
||||||
* automatically dynamically allocated inside the xEventGroupCreate() function.
|
* automatically dynamically allocated inside the xEventGroupCreate() function.
|
||||||
* (see http://www.freertos.org/a00111.html). If an event group is created
|
* (see https://www.FreeRTOS.org/a00111.html). If an event group is created
|
||||||
* using xEventGropuCreateStatic() then the application writer must instead
|
* using xEventGropuCreateStatic() then the application writer must instead
|
||||||
* provide the memory that will get used by the event group.
|
* provide the memory that will get used by the event group.
|
||||||
* xEventGroupCreateStatic() therefore allows an event group to be created
|
* xEventGroupCreateStatic() therefore allows an event group to be created
|
||||||
|
@ -119,27 +120,27 @@ typedef TickType_t EventBits_t;
|
||||||
*
|
*
|
||||||
* @return If the event group was created then a handle to the event group is
|
* @return If the event group was created then a handle to the event group is
|
||||||
* returned. If there was insufficient FreeRTOS heap available to create the
|
* returned. If there was insufficient FreeRTOS heap available to create the
|
||||||
* event group then NULL is returned. See http://www.freertos.org/a00111.html
|
* event group then NULL is returned. See https://www.FreeRTOS.org/a00111.html
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// Declare a variable to hold the created event group.
|
* // Declare a variable to hold the created event group.
|
||||||
EventGroupHandle_t xCreatedEventGroup;
|
* EventGroupHandle_t xCreatedEventGroup;
|
||||||
|
*
|
||||||
// Attempt to create the event group.
|
* // Attempt to create the event group.
|
||||||
xCreatedEventGroup = xEventGroupCreate();
|
* xCreatedEventGroup = xEventGroupCreate();
|
||||||
|
*
|
||||||
// Was the event group created successfully?
|
* // Was the event group created successfully?
|
||||||
if( xCreatedEventGroup == NULL )
|
* if( xCreatedEventGroup == NULL )
|
||||||
{
|
* {
|
||||||
// The event group was not created because there was insufficient
|
* // The event group was not created because there was insufficient
|
||||||
// FreeRTOS heap available.
|
* // FreeRTOS heap available.
|
||||||
}
|
* }
|
||||||
else
|
* else
|
||||||
{
|
* {
|
||||||
// The event group was created.
|
* // The event group was created.
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xEventGroupCreate xEventGroupCreate
|
* \defgroup xEventGroupCreate xEventGroupCreate
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
|
@ -150,8 +151,8 @@ typedef TickType_t EventBits_t;
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
|
* EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Create a new event group.
|
* Create a new event group.
|
||||||
*
|
*
|
||||||
|
@ -159,7 +160,7 @@ typedef TickType_t EventBits_t;
|
||||||
* block of memory, in which the event group's structure is stored. If an event
|
* block of memory, in which the event group's structure is stored. If an event
|
||||||
* groups is created using xEventGropuCreate() then the required memory is
|
* groups is created using xEventGropuCreate() then the required memory is
|
||||||
* automatically dynamically allocated inside the xEventGroupCreate() function.
|
* automatically dynamically allocated inside the xEventGroupCreate() function.
|
||||||
* (see http://www.freertos.org/a00111.html). If an event group is created
|
* (see https://www.FreeRTOS.org/a00111.html). If an event group is created
|
||||||
* using xEventGropuCreateStatic() then the application writer must instead
|
* using xEventGropuCreateStatic() then the application writer must instead
|
||||||
* provide the memory that will get used by the event group.
|
* provide the memory that will get used by the event group.
|
||||||
* xEventGroupCreateStatic() therefore allows an event group to be created
|
* xEventGroupCreateStatic() therefore allows an event group to be created
|
||||||
|
@ -181,20 +182,20 @@ typedef TickType_t EventBits_t;
|
||||||
* returned. If pxEventGroupBuffer was NULL then NULL is returned.
|
* returned. If pxEventGroupBuffer was NULL then NULL is returned.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// StaticEventGroup_t is a publicly accessible structure that has the same
|
* // StaticEventGroup_t is a publicly accessible structure that has the same
|
||||||
// size and alignment requirements as the real event group structure. It is
|
* // size and alignment requirements as the real event group structure. It is
|
||||||
// provided as a mechanism for applications to know the size of the event
|
* // provided as a mechanism for applications to know the size of the event
|
||||||
// group (which is dependent on the architecture and configuration file
|
* // group (which is dependent on the architecture and configuration file
|
||||||
// settings) without breaking the strict data hiding policy by exposing the
|
* // settings) without breaking the strict data hiding policy by exposing the
|
||||||
// real event group internals. This StaticEventGroup_t variable is passed
|
* // real event group internals. This StaticEventGroup_t variable is passed
|
||||||
// into the xSemaphoreCreateEventGroupStatic() function and is used to store
|
* // into the xSemaphoreCreateEventGroupStatic() function and is used to store
|
||||||
// the event group's data structures
|
* // the event group's data structures
|
||||||
StaticEventGroup_t xEventGroupBuffer;
|
* StaticEventGroup_t xEventGroupBuffer;
|
||||||
|
*
|
||||||
// Create the event group without dynamically allocating any memory.
|
* // Create the event group without dynamically allocating any memory.
|
||||||
xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
|
* xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*/
|
*/
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION;
|
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION;
|
||||||
|
@ -203,12 +204,12 @@ typedef TickType_t EventBits_t;
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
|
* EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
|
||||||
const EventBits_t uxBitsToWaitFor,
|
* const EventBits_t uxBitsToWaitFor,
|
||||||
const BaseType_t xClearOnExit,
|
* const BaseType_t xClearOnExit,
|
||||||
const BaseType_t xWaitForAllBits,
|
* const BaseType_t xWaitForAllBits,
|
||||||
const TickType_t xTicksToWait );
|
* const TickType_t xTicksToWait );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* [Potentially] block to wait for one or more bits to be set within a
|
* [Potentially] block to wait for one or more bits to be set within a
|
||||||
* previously created event group.
|
* previously created event group.
|
||||||
|
@ -252,53 +253,57 @@ typedef TickType_t EventBits_t;
|
||||||
* pdTRUE.
|
* pdTRUE.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
#define BIT_0 ( 1 << 0 )
|
#define BIT_0 ( 1 << 0 )
|
||||||
#define BIT_4 ( 1 << 4 )
|
#define BIT_4 ( 1 << 4 )
|
||||||
|
*
|
||||||
void aFunction( EventGroupHandle_t xEventGroup )
|
* void aFunction( EventGroupHandle_t xEventGroup )
|
||||||
{
|
* {
|
||||||
EventBits_t uxBits;
|
* EventBits_t uxBits;
|
||||||
const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
* const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
||||||
|
*
|
||||||
// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
|
* // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
|
||||||
// the event group. Clear the bits before exiting.
|
* // the event group. Clear the bits before exiting.
|
||||||
uxBits = xEventGroupWaitBits(
|
* uxBits = xEventGroupWaitBits(
|
||||||
xEventGroup, // The event group being tested.
|
* xEventGroup, // The event group being tested.
|
||||||
BIT_0 | BIT_4, // The bits within the event group to wait for.
|
* BIT_0 | BIT_4, // The bits within the event group to wait for.
|
||||||
pdTRUE, // BIT_0 and BIT_4 should be cleared before returning.
|
* pdTRUE, // BIT_0 and BIT_4 should be cleared before returning.
|
||||||
pdFALSE, // Don't wait for both bits, either bit will do.
|
* pdFALSE, // Don't wait for both bits, either bit will do.
|
||||||
xTicksToWait ); // Wait a maximum of 100ms for either bit to be set.
|
* xTicksToWait ); // Wait a maximum of 100ms for either bit to be set.
|
||||||
|
*
|
||||||
if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
* if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
||||||
{
|
* {
|
||||||
// xEventGroupWaitBits() returned because both bits were set.
|
* // xEventGroupWaitBits() returned because both bits were set.
|
||||||
}
|
* }
|
||||||
else if( ( uxBits & BIT_0 ) != 0 )
|
* else if( ( uxBits & BIT_0 ) != 0 )
|
||||||
{
|
* {
|
||||||
// xEventGroupWaitBits() returned because just BIT_0 was set.
|
* // xEventGroupWaitBits() returned because just BIT_0 was set.
|
||||||
}
|
* }
|
||||||
else if( ( uxBits & BIT_4 ) != 0 )
|
* else if( ( uxBits & BIT_4 ) != 0 )
|
||||||
{
|
* {
|
||||||
// xEventGroupWaitBits() returned because just BIT_4 was set.
|
* // xEventGroupWaitBits() returned because just BIT_4 was set.
|
||||||
}
|
* }
|
||||||
else
|
* else
|
||||||
{
|
* {
|
||||||
// xEventGroupWaitBits() returned because xTicksToWait ticks passed
|
* // xEventGroupWaitBits() returned because xTicksToWait ticks passed
|
||||||
// without either BIT_0 or BIT_4 becoming set.
|
* // without either BIT_0 or BIT_4 becoming set.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xEventGroupWaitBits xEventGroupWaitBits
|
* \defgroup xEventGroupWaitBits xEventGroupWaitBits
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
const BaseType_t xClearOnExit,
|
||||||
|
const BaseType_t xWaitForAllBits,
|
||||||
|
TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
|
* EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Clear bits within an event group. This function cannot be called from an
|
* Clear bits within an event group. This function cannot be called from an
|
||||||
* interrupt.
|
* interrupt.
|
||||||
|
@ -312,50 +317,51 @@ EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits
|
||||||
* @return The value of the event group before the specified bits were cleared.
|
* @return The value of the event group before the specified bits were cleared.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
#define BIT_0 ( 1 << 0 )
|
#define BIT_0 ( 1 << 0 )
|
||||||
#define BIT_4 ( 1 << 4 )
|
#define BIT_4 ( 1 << 4 )
|
||||||
|
*
|
||||||
void aFunction( EventGroupHandle_t xEventGroup )
|
* void aFunction( EventGroupHandle_t xEventGroup )
|
||||||
{
|
* {
|
||||||
EventBits_t uxBits;
|
* EventBits_t uxBits;
|
||||||
|
*
|
||||||
// Clear bit 0 and bit 4 in xEventGroup.
|
* // Clear bit 0 and bit 4 in xEventGroup.
|
||||||
uxBits = xEventGroupClearBits(
|
* uxBits = xEventGroupClearBits(
|
||||||
xEventGroup, // The event group being updated.
|
* xEventGroup, // The event group being updated.
|
||||||
BIT_0 | BIT_4 );// The bits being cleared.
|
* BIT_0 | BIT_4 );// The bits being cleared.
|
||||||
|
*
|
||||||
if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
* if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
||||||
{
|
* {
|
||||||
// Both bit 0 and bit 4 were set before xEventGroupClearBits() was
|
* // Both bit 0 and bit 4 were set before xEventGroupClearBits() was
|
||||||
// called. Both will now be clear (not set).
|
* // called. Both will now be clear (not set).
|
||||||
}
|
* }
|
||||||
else if( ( uxBits & BIT_0 ) != 0 )
|
* else if( ( uxBits & BIT_0 ) != 0 )
|
||||||
{
|
* {
|
||||||
// Bit 0 was set before xEventGroupClearBits() was called. It will
|
* // Bit 0 was set before xEventGroupClearBits() was called. It will
|
||||||
// now be clear.
|
* // now be clear.
|
||||||
}
|
* }
|
||||||
else if( ( uxBits & BIT_4 ) != 0 )
|
* else if( ( uxBits & BIT_4 ) != 0 )
|
||||||
{
|
* {
|
||||||
// Bit 4 was set before xEventGroupClearBits() was called. It will
|
* // Bit 4 was set before xEventGroupClearBits() was called. It will
|
||||||
// now be clear.
|
* // now be clear.
|
||||||
}
|
* }
|
||||||
else
|
* else
|
||||||
{
|
* {
|
||||||
// Neither bit 0 nor bit 4 were set in the first place.
|
* // Neither bit 0 nor bit 4 were set in the first place.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xEventGroupClearBits xEventGroupClearBits
|
* \defgroup xEventGroupClearBits xEventGroupClearBits
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;
|
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
|
* BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* A version of xEventGroupClearBits() that can be called from an interrupt.
|
* A version of xEventGroupClearBits() that can be called from an interrupt.
|
||||||
*
|
*
|
||||||
|
@ -380,41 +386,43 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit
|
||||||
* if the timer service queue was full.
|
* if the timer service queue was full.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
#define BIT_0 ( 1 << 0 )
|
#define BIT_0 ( 1 << 0 )
|
||||||
#define BIT_4 ( 1 << 4 )
|
#define BIT_4 ( 1 << 4 )
|
||||||
|
*
|
||||||
// An event group which it is assumed has already been created by a call to
|
* // An event group which it is assumed has already been created by a call to
|
||||||
// xEventGroupCreate().
|
* // xEventGroupCreate().
|
||||||
EventGroupHandle_t xEventGroup;
|
* EventGroupHandle_t xEventGroup;
|
||||||
|
*
|
||||||
void anInterruptHandler( void )
|
* void anInterruptHandler( void )
|
||||||
{
|
* {
|
||||||
// Clear bit 0 and bit 4 in xEventGroup.
|
* // Clear bit 0 and bit 4 in xEventGroup.
|
||||||
xResult = xEventGroupClearBitsFromISR(
|
* xResult = xEventGroupClearBitsFromISR(
|
||||||
xEventGroup, // The event group being updated.
|
* xEventGroup, // The event group being updated.
|
||||||
BIT_0 | BIT_4 ); // The bits being set.
|
* BIT_0 | BIT_4 ); // The bits being set.
|
||||||
|
*
|
||||||
if( xResult == pdPASS )
|
* if( xResult == pdPASS )
|
||||||
{
|
* {
|
||||||
// The message was posted successfully.
|
* // The message was posted successfully.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR
|
* \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;
|
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;
|
||||||
#else
|
#else
|
||||||
#define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL )
|
#define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) \
|
||||||
|
xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
|
* EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Set bits within an event group.
|
* Set bits within an event group.
|
||||||
* This function cannot be called from an interrupt. xEventGroupSetBitsFromISR()
|
* This function cannot be called from an interrupt. xEventGroupSetBitsFromISR()
|
||||||
|
@ -440,55 +448,56 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit
|
||||||
* event group value before the call to xEventGroupSetBits() returns.
|
* event group value before the call to xEventGroupSetBits() returns.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
#define BIT_0 ( 1 << 0 )
|
#define BIT_0 ( 1 << 0 )
|
||||||
#define BIT_4 ( 1 << 4 )
|
#define BIT_4 ( 1 << 4 )
|
||||||
|
*
|
||||||
void aFunction( EventGroupHandle_t xEventGroup )
|
* void aFunction( EventGroupHandle_t xEventGroup )
|
||||||
{
|
* {
|
||||||
EventBits_t uxBits;
|
* EventBits_t uxBits;
|
||||||
|
*
|
||||||
// Set bit 0 and bit 4 in xEventGroup.
|
* // Set bit 0 and bit 4 in xEventGroup.
|
||||||
uxBits = xEventGroupSetBits(
|
* uxBits = xEventGroupSetBits(
|
||||||
xEventGroup, // The event group being updated.
|
* xEventGroup, // The event group being updated.
|
||||||
BIT_0 | BIT_4 );// The bits being set.
|
* BIT_0 | BIT_4 );// The bits being set.
|
||||||
|
*
|
||||||
if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
* if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
||||||
{
|
* {
|
||||||
// Both bit 0 and bit 4 remained set when the function returned.
|
* // Both bit 0 and bit 4 remained set when the function returned.
|
||||||
}
|
* }
|
||||||
else if( ( uxBits & BIT_0 ) != 0 )
|
* else if( ( uxBits & BIT_0 ) != 0 )
|
||||||
{
|
* {
|
||||||
// Bit 0 remained set when the function returned, but bit 4 was
|
* // Bit 0 remained set when the function returned, but bit 4 was
|
||||||
// cleared. It might be that bit 4 was cleared automatically as a
|
* // cleared. It might be that bit 4 was cleared automatically as a
|
||||||
// task that was waiting for bit 4 was removed from the Blocked
|
* // task that was waiting for bit 4 was removed from the Blocked
|
||||||
// state.
|
* // state.
|
||||||
}
|
* }
|
||||||
else if( ( uxBits & BIT_4 ) != 0 )
|
* else if( ( uxBits & BIT_4 ) != 0 )
|
||||||
{
|
* {
|
||||||
// Bit 4 remained set when the function returned, but bit 0 was
|
* // Bit 4 remained set when the function returned, but bit 0 was
|
||||||
// cleared. It might be that bit 0 was cleared automatically as a
|
* // cleared. It might be that bit 0 was cleared automatically as a
|
||||||
// task that was waiting for bit 0 was removed from the Blocked
|
* // task that was waiting for bit 0 was removed from the Blocked
|
||||||
// state.
|
* // state.
|
||||||
}
|
* }
|
||||||
else
|
* else
|
||||||
{
|
* {
|
||||||
// Neither bit 0 nor bit 4 remained set. It might be that a task
|
* // Neither bit 0 nor bit 4 remained set. It might be that a task
|
||||||
// was waiting for both of the bits to be set, and the bits were
|
* // was waiting for both of the bits to be set, and the bits were
|
||||||
// cleared as the task left the Blocked state.
|
* // cleared as the task left the Blocked state.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xEventGroupSetBits xEventGroupSetBits
|
* \defgroup xEventGroupSetBits xEventGroupSetBits
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION;
|
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* A version of xEventGroupSetBits() that can be called from an interrupt.
|
* A version of xEventGroupSetBits() that can be called from an interrupt.
|
||||||
*
|
*
|
||||||
|
@ -521,55 +530,58 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_
|
||||||
* if the timer service queue was full.
|
* if the timer service queue was full.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
#define BIT_0 ( 1 << 0 )
|
#define BIT_0 ( 1 << 0 )
|
||||||
#define BIT_4 ( 1 << 4 )
|
#define BIT_4 ( 1 << 4 )
|
||||||
|
*
|
||||||
// An event group which it is assumed has already been created by a call to
|
* // An event group which it is assumed has already been created by a call to
|
||||||
// xEventGroupCreate().
|
* // xEventGroupCreate().
|
||||||
EventGroupHandle_t xEventGroup;
|
* EventGroupHandle_t xEventGroup;
|
||||||
|
*
|
||||||
void anInterruptHandler( void )
|
* void anInterruptHandler( void )
|
||||||
{
|
* {
|
||||||
BaseType_t xHigherPriorityTaskWoken, xResult;
|
* BaseType_t xHigherPriorityTaskWoken, xResult;
|
||||||
|
*
|
||||||
// xHigherPriorityTaskWoken must be initialised to pdFALSE.
|
* // xHigherPriorityTaskWoken must be initialised to pdFALSE.
|
||||||
xHigherPriorityTaskWoken = pdFALSE;
|
* xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
*
|
||||||
// Set bit 0 and bit 4 in xEventGroup.
|
* // Set bit 0 and bit 4 in xEventGroup.
|
||||||
xResult = xEventGroupSetBitsFromISR(
|
* xResult = xEventGroupSetBitsFromISR(
|
||||||
xEventGroup, // The event group being updated.
|
* xEventGroup, // The event group being updated.
|
||||||
BIT_0 | BIT_4 // The bits being set.
|
* BIT_0 | BIT_4 // The bits being set.
|
||||||
&xHigherPriorityTaskWoken );
|
* &xHigherPriorityTaskWoken );
|
||||||
|
*
|
||||||
// Was the message posted successfully?
|
* // Was the message posted successfully?
|
||||||
if( xResult == pdPASS )
|
* if( xResult == pdPASS )
|
||||||
{
|
* {
|
||||||
// If xHigherPriorityTaskWoken is now set to pdTRUE then a context
|
* // If xHigherPriorityTaskWoken is now set to pdTRUE then a context
|
||||||
// switch should be requested. The macro used is port specific and
|
* // switch should be requested. The macro used is port specific and
|
||||||
// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
|
* // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
|
||||||
// refer to the documentation page for the port being used.
|
* // refer to the documentation page for the port being used.
|
||||||
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
* portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR
|
* \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet,
|
||||||
|
BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
||||||
#else
|
#else
|
||||||
#define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken )
|
#define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) \
|
||||||
|
xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
|
* EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
|
||||||
const EventBits_t uxBitsToSet,
|
* const EventBits_t uxBitsToSet,
|
||||||
const EventBits_t uxBitsToWaitFor,
|
* const EventBits_t uxBitsToWaitFor,
|
||||||
TickType_t xTicksToWait );
|
* TickType_t xTicksToWait );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Atomically set bits within an event group, then wait for a combination of
|
* Atomically set bits within an event group, then wait for a combination of
|
||||||
* bits to be set within the same event group. This functionality is typically
|
* bits to be set within the same event group. This functionality is typically
|
||||||
|
@ -608,92 +620,95 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_
|
||||||
* automatically cleared.
|
* automatically cleared.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
* <pre>
|
||||||
// Bits used by the three tasks.
|
* // Bits used by the three tasks.
|
||||||
#define TASK_0_BIT ( 1 << 0 )
|
#define TASK_0_BIT ( 1 << 0 )
|
||||||
#define TASK_1_BIT ( 1 << 1 )
|
#define TASK_1_BIT ( 1 << 1 )
|
||||||
#define TASK_2_BIT ( 1 << 2 )
|
#define TASK_2_BIT ( 1 << 2 )
|
||||||
|
*
|
||||||
#define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
|
#define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
|
||||||
|
*
|
||||||
// Use an event group to synchronise three tasks. It is assumed this event
|
* // Use an event group to synchronise three tasks. It is assumed this event
|
||||||
// group has already been created elsewhere.
|
* // group has already been created elsewhere.
|
||||||
EventGroupHandle_t xEventBits;
|
* EventGroupHandle_t xEventBits;
|
||||||
|
*
|
||||||
void vTask0( void *pvParameters )
|
* void vTask0( void *pvParameters )
|
||||||
{
|
* {
|
||||||
EventBits_t uxReturn;
|
* EventBits_t uxReturn;
|
||||||
TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
* TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
||||||
|
*
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Perform task functionality here.
|
* // Perform task functionality here.
|
||||||
|
*
|
||||||
// Set bit 0 in the event flag to note this task has reached the
|
* // Set bit 0 in the event flag to note this task has reached the
|
||||||
// sync point. The other two tasks will set the other two bits defined
|
* // sync point. The other two tasks will set the other two bits defined
|
||||||
// by ALL_SYNC_BITS. All three tasks have reached the synchronisation
|
* // by ALL_SYNC_BITS. All three tasks have reached the synchronisation
|
||||||
// point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms
|
* // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms
|
||||||
// for this to happen.
|
* // for this to happen.
|
||||||
uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
|
* uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
|
||||||
|
*
|
||||||
if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
|
* if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
|
||||||
{
|
* {
|
||||||
// All three tasks reached the synchronisation point before the call
|
* // All three tasks reached the synchronisation point before the call
|
||||||
// to xEventGroupSync() timed out.
|
* // to xEventGroupSync() timed out.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
void vTask1( void *pvParameters )
|
* void vTask1( void *pvParameters )
|
||||||
{
|
* {
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Perform task functionality here.
|
* // Perform task functionality here.
|
||||||
|
*
|
||||||
// Set bit 1 in the event flag to note this task has reached the
|
* // Set bit 1 in the event flag to note this task has reached the
|
||||||
// synchronisation point. The other two tasks will set the other two
|
* // synchronisation point. The other two tasks will set the other two
|
||||||
// bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
* // bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
||||||
// synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
* // synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
||||||
// indefinitely for this to happen.
|
* // indefinitely for this to happen.
|
||||||
xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
* xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
||||||
|
*
|
||||||
// xEventGroupSync() was called with an indefinite block time, so
|
* // xEventGroupSync() was called with an indefinite block time, so
|
||||||
// this task will only reach here if the syncrhonisation was made by all
|
* // this task will only reach here if the syncrhonisation was made by all
|
||||||
// three tasks, so there is no need to test the return value.
|
* // three tasks, so there is no need to test the return value.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
void vTask2( void *pvParameters )
|
* void vTask2( void *pvParameters )
|
||||||
{
|
* {
|
||||||
for( ;; )
|
* for( ;; )
|
||||||
{
|
* {
|
||||||
// Perform task functionality here.
|
* // Perform task functionality here.
|
||||||
|
*
|
||||||
// Set bit 2 in the event flag to note this task has reached the
|
* // Set bit 2 in the event flag to note this task has reached the
|
||||||
// synchronisation point. The other two tasks will set the other two
|
* // synchronisation point. The other two tasks will set the other two
|
||||||
// bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
* // bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
||||||
// synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
* // synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
||||||
// indefinitely for this to happen.
|
* // indefinitely for this to happen.
|
||||||
xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
* xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
||||||
|
*
|
||||||
// xEventGroupSync() was called with an indefinite block time, so
|
* // xEventGroupSync() was called with an indefinite block time, so
|
||||||
// this task will only reach here if the syncrhonisation was made by all
|
* // this task will only reach here if the syncrhonisation was made by all
|
||||||
// three tasks, so there is no need to test the return value.
|
* // three tasks, so there is no need to test the return value.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xEventGroupSync xEventGroupSync
|
* \defgroup xEventGroupSync xEventGroupSync
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
|
* EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Returns the current value of the bits in an event group. This function
|
* Returns the current value of the bits in an event group. This function
|
||||||
* cannot be used from an interrupt.
|
* cannot be used from an interrupt.
|
||||||
|
@ -710,8 +725,8 @@ EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t u
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
|
* EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* A version of xEventGroupGetBits() that can be called from an ISR.
|
* A version of xEventGroupGetBits() that can be called from an ISR.
|
||||||
*
|
*
|
||||||
|
@ -727,8 +742,8 @@ EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEG
|
||||||
/**
|
/**
|
||||||
* event_groups.h
|
* event_groups.h
|
||||||
* <pre>
|
* <pre>
|
||||||
void xEventGroupDelete( EventGroupHandle_t xEventGroup );
|
* void xEventGroupDelete( EventGroupHandle_t xEventGroup );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Delete an event group that was previously created by a call to
|
* Delete an event group that was previously created by a call to
|
||||||
* xEventGroupCreate(). Tasks that are blocked on the event group will be
|
* xEventGroupCreate(). Tasks that are blocked on the event group will be
|
||||||
|
@ -739,19 +754,22 @@ EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEG
|
||||||
void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION;
|
void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/* For internal use only. */
|
/* For internal use only. */
|
||||||
void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION;
|
void vEventGroupSetBitsCallback( void * pvEventGroup,
|
||||||
void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;
|
const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION;
|
||||||
|
void vEventGroupClearBitsCallback( void * pvEventGroup,
|
||||||
|
const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) PRIVILEGED_FUNCTION;
|
||||||
void vEventGroupSetNumber( void* xEventGroup, UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION;
|
void vEventGroupSetNumber( void * xEventGroup,
|
||||||
|
UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif /* EVENT_GROUPS_H */
|
#endif /* EVENT_GROUPS_H */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -53,13 +52,14 @@
|
||||||
* \ingroup FreeRTOSIntro
|
* \ingroup FreeRTOSIntro
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef INC_FREERTOS_H
|
|
||||||
#error FreeRTOS.h must be included before list.h
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LIST_H
|
#ifndef LIST_H
|
||||||
#define LIST_H
|
#define LIST_H
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOS_H
|
||||||
|
#error "FreeRTOS.h must be included before list.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The list structure members are modified from within interrupts, and therefore
|
* The list structure members are modified from within interrupts, and therefore
|
||||||
* by rights should be declared volatile. However, they are only modified in a
|
* by rights should be declared volatile. However, they are only modified in a
|
||||||
|
@ -92,15 +92,17 @@
|
||||||
#define configLIST_VOLATILE
|
#define configLIST_VOLATILE
|
||||||
#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */
|
#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/* Macros that can be used to place known values within the list structures,
|
/* Macros that can be used to place known values within the list structures,
|
||||||
then check that the known values do not get corrupted during the execution of
|
* then check that the known values do not get corrupted during the execution of
|
||||||
the application. These may catch the list data structures being overwritten in
|
* the application. These may catch the list data structures being overwritten in
|
||||||
memory. They will not catch data errors caused by incorrect configuration or
|
* memory. They will not catch data errors caused by incorrect configuration or
|
||||||
use of FreeRTOS.*/
|
* use of FreeRTOS.*/
|
||||||
#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 )
|
#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 )
|
||||||
/* Define the macros to do nothing. */
|
/* Define the macros to do nothing. */
|
||||||
#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
|
#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
|
||||||
|
@ -113,7 +115,7 @@ use of FreeRTOS.*/
|
||||||
#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )
|
#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )
|
||||||
#define listTEST_LIST_ITEM_INTEGRITY( pxItem )
|
#define listTEST_LIST_ITEM_INTEGRITY( pxItem )
|
||||||
#define listTEST_LIST_INTEGRITY( pxList )
|
#define listTEST_LIST_INTEGRITY( pxList )
|
||||||
#else
|
#else /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */
|
||||||
/* Define macros that add new members into the list structures. */
|
/* Define macros that add new members into the list structures. */
|
||||||
#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1;
|
#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1;
|
||||||
#define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2;
|
#define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2;
|
||||||
|
@ -127,7 +129,7 @@ use of FreeRTOS.*/
|
||||||
#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE
|
#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE
|
||||||
|
|
||||||
/* Define macros that will assert if one of the structure members does not
|
/* Define macros that will assert if one of the structure members does not
|
||||||
contain its expected value. */
|
* contain its expected value. */
|
||||||
#define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) )
|
#define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) )
|
||||||
#define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) )
|
#define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) )
|
||||||
#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */
|
#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */
|
||||||
|
@ -366,7 +368,8 @@ void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION;
|
||||||
* \page vListInsert vListInsert
|
* \page vListInsert vListInsert
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
*/
|
*/
|
||||||
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION;
|
void vListInsert( List_t * const pxList,
|
||||||
|
ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Insert a list item into a list. The item will be inserted in a position
|
* Insert a list item into a list. The item will be inserted in a position
|
||||||
|
@ -387,7 +390,8 @@ void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIV
|
||||||
* \page vListInsertEnd vListInsertEnd
|
* \page vListInsertEnd vListInsertEnd
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
*/
|
*/
|
||||||
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION;
|
void vListInsertEnd( List_t * const pxList,
|
||||||
|
ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove an item from a list. The list item has a pointer to the list that
|
* Remove an item from a list. The list item has a pointer to the list that
|
||||||
|
@ -404,9 +408,10 @@ void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) P
|
||||||
*/
|
*/
|
||||||
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif
|
#endif /* ifndef LIST_H */
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,9 +68,11 @@
|
||||||
/* Message buffers are built onto of stream buffers. */
|
/* Message buffers are built onto of stream buffers. */
|
||||||
#include "stream_buffer.h"
|
#include "stream_buffer.h"
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#if defined( __cplusplus )
|
#if defined( __cplusplus )
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type by which message buffers are referenced. For example, a call to
|
* Type by which message buffers are referenced. For example, a call to
|
||||||
|
@ -86,9 +87,9 @@ typedef void * MessageBufferHandle_t;
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );
|
* MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Creates a new message buffer using dynamically allocated memory. See
|
* Creates a new message buffer using dynamically allocated memory. See
|
||||||
* xMessageBufferCreateStatic() for a version that uses statically allocated
|
* xMessageBufferCreateStatic() for a version that uses statically allocated
|
||||||
|
@ -112,43 +113,44 @@ MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );
|
||||||
* buffer.
|
* buffer.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
|
*
|
||||||
void vAFunction( void )
|
* void vAFunction( void )
|
||||||
{
|
* {
|
||||||
MessageBufferHandle_t xMessageBuffer;
|
* MessageBufferHandle_t xMessageBuffer;
|
||||||
const size_t xMessageBufferSizeBytes = 100;
|
* const size_t xMessageBufferSizeBytes = 100;
|
||||||
|
*
|
||||||
// Create a message buffer that can hold 100 bytes. The memory used to hold
|
* // Create a message buffer that can hold 100 bytes. The memory used to hold
|
||||||
// both the message buffer structure and the messages themselves is allocated
|
* // both the message buffer structure and the messages themselves is allocated
|
||||||
// dynamically. Each message added to the buffer consumes an additional 4
|
* // dynamically. Each message added to the buffer consumes an additional 4
|
||||||
// bytes which are used to hold the lengh of the message.
|
* // bytes which are used to hold the lengh of the message.
|
||||||
xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes );
|
* xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes );
|
||||||
|
*
|
||||||
if( xMessageBuffer == NULL )
|
* if( xMessageBuffer == NULL )
|
||||||
{
|
* {
|
||||||
// There was not enough heap memory space available to create the
|
* // There was not enough heap memory space available to create the
|
||||||
// message buffer.
|
* // message buffer.
|
||||||
}
|
* }
|
||||||
else
|
* else
|
||||||
{
|
* {
|
||||||
// The message buffer was created successfully and can now be used.
|
* // The message buffer was created successfully and can now be used.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xMessageBufferCreate xMessageBufferCreate
|
* \defgroup xMessageBufferCreate xMessageBufferCreate
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferCreate( xBufferSizeBytes ) ( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE )
|
#define xMessageBufferCreate( xBufferSizeBytes ) \
|
||||||
|
( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,
|
* MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,
|
||||||
uint8_t *pucMessageBufferStorageArea,
|
* uint8_t *pucMessageBufferStorageArea,
|
||||||
StaticMessageBuffer_t *pxStaticMessageBuffer );
|
* StaticMessageBuffer_t *pxStaticMessageBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
* Creates a new message buffer using statically allocated memory. See
|
* Creates a new message buffer using statically allocated memory. See
|
||||||
* xMessageBufferCreate() for a version that uses dynamically allocated memory.
|
* xMessageBufferCreate() for a version that uses dynamically allocated memory.
|
||||||
*
|
*
|
||||||
|
@ -173,49 +175,50 @@ MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,
|
||||||
* pxStaticmessageBuffer are NULL then NULL is returned.
|
* pxStaticmessageBuffer are NULL then NULL is returned.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
|
*
|
||||||
// Used to dimension the array used to hold the messages. The available space
|
* // Used to dimension the array used to hold the messages. The available space
|
||||||
// will actually be one less than this, so 999.
|
* // will actually be one less than this, so 999.
|
||||||
#define STORAGE_SIZE_BYTES 1000
|
#define STORAGE_SIZE_BYTES 1000
|
||||||
|
*
|
||||||
// Defines the memory that will actually hold the messages within the message
|
* // Defines the memory that will actually hold the messages within the message
|
||||||
// buffer.
|
* // buffer.
|
||||||
static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
|
* static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
|
||||||
|
*
|
||||||
// The variable used to hold the message buffer structure.
|
* // The variable used to hold the message buffer structure.
|
||||||
StaticMessageBuffer_t xMessageBufferStruct;
|
* StaticMessageBuffer_t xMessageBufferStruct;
|
||||||
|
*
|
||||||
void MyFunction( void )
|
* void MyFunction( void )
|
||||||
{
|
* {
|
||||||
MessageBufferHandle_t xMessageBuffer;
|
* MessageBufferHandle_t xMessageBuffer;
|
||||||
|
*
|
||||||
xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucBufferStorage ),
|
* xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucBufferStorage ),
|
||||||
ucBufferStorage,
|
* ucBufferStorage,
|
||||||
&xMessageBufferStruct );
|
* &xMessageBufferStruct );
|
||||||
|
*
|
||||||
// As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer
|
* // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer
|
||||||
// parameters were NULL, xMessageBuffer will not be NULL, and can be used to
|
* // parameters were NULL, xMessageBuffer will not be NULL, and can be used to
|
||||||
// reference the created message buffer in other message buffer API calls.
|
* // reference the created message buffer in other message buffer API calls.
|
||||||
|
*
|
||||||
// Other code that uses the message buffer can go here.
|
* // Other code that uses the message buffer can go here.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic
|
* \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) ( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer )
|
#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \
|
||||||
|
( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,
|
* size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,
|
||||||
const void *pvTxData,
|
* const void *pvTxData,
|
||||||
size_t xDataLengthBytes,
|
* size_t xDataLengthBytes,
|
||||||
TickType_t xTicksToWait );
|
* TickType_t xTicksToWait );
|
||||||
<pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Sends a discrete message to the message buffer. The message can be any
|
* Sends a discrete message to the message buffer. The message can be any
|
||||||
* length that fits within the buffer's free space, and is copied into the
|
* length that fits within the buffer's free space, and is copied into the
|
||||||
|
@ -272,49 +275,50 @@ size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,
|
||||||
* time out then xDataLengthBytes is returned.
|
* time out then xDataLengthBytes is returned.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
void vAFunction( MessageBufferHandle_t xMessageBuffer )
|
* void vAFunction( MessageBufferHandle_t xMessageBuffer )
|
||||||
{
|
* {
|
||||||
size_t xBytesSent;
|
* size_t xBytesSent;
|
||||||
uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
|
* uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
|
||||||
char *pcStringToSend = "String to send";
|
* char *pcStringToSend = "String to send";
|
||||||
const TickType_t x100ms = pdMS_TO_TICKS( 100 );
|
* const TickType_t x100ms = pdMS_TO_TICKS( 100 );
|
||||||
|
*
|
||||||
// Send an array to the message buffer, blocking for a maximum of 100ms to
|
* // Send an array to the message buffer, blocking for a maximum of 100ms to
|
||||||
// wait for enough space to be available in the message buffer.
|
* // wait for enough space to be available in the message buffer.
|
||||||
xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
|
* xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
|
||||||
|
*
|
||||||
if( xBytesSent != sizeof( ucArrayToSend ) )
|
* if( xBytesSent != sizeof( ucArrayToSend ) )
|
||||||
{
|
* {
|
||||||
// The call to xMessageBufferSend() times out before there was enough
|
* // The call to xMessageBufferSend() times out before there was enough
|
||||||
// space in the buffer for the data to be written.
|
* // space in the buffer for the data to be written.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Send the string to the message buffer. Return immediately if there is
|
* // Send the string to the message buffer. Return immediately if there is
|
||||||
// not enough space in the buffer.
|
* // not enough space in the buffer.
|
||||||
xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
|
* xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
|
||||||
|
*
|
||||||
if( xBytesSent != strlen( pcStringToSend ) )
|
* if( xBytesSent != strlen( pcStringToSend ) )
|
||||||
{
|
* {
|
||||||
// The string could not be added to the message buffer because there was
|
* // The string could not be added to the message buffer because there was
|
||||||
// not enough free space in the buffer.
|
* // not enough free space in the buffer.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xMessageBufferSend xMessageBufferSend
|
* \defgroup xMessageBufferSend xMessageBufferSend
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait )
|
#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \
|
||||||
|
xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,
|
* size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,
|
||||||
const void *pvTxData,
|
* const void *pvTxData,
|
||||||
size_t xDataLengthBytes,
|
* size_t xDataLengthBytes,
|
||||||
BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
<pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Interrupt safe version of the API function that sends a discrete message to
|
* Interrupt safe version of the API function that sends a discrete message to
|
||||||
* the message buffer. The message can be any length that fits within the
|
* the message buffer. The message can be any length that fits within the
|
||||||
|
@ -372,53 +376,54 @@ size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,
|
||||||
* then 0 is returned, otherwise xDataLengthBytes is returned.
|
* then 0 is returned, otherwise xDataLengthBytes is returned.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
// A message buffer that has already been created.
|
* // A message buffer that has already been created.
|
||||||
MessageBufferHandle_t xMessageBuffer;
|
* MessageBufferHandle_t xMessageBuffer;
|
||||||
|
*
|
||||||
void vAnInterruptServiceRoutine( void )
|
* void vAnInterruptServiceRoutine( void )
|
||||||
{
|
* {
|
||||||
size_t xBytesSent;
|
* size_t xBytesSent;
|
||||||
char *pcStringToSend = "String to send";
|
* char *pcStringToSend = "String to send";
|
||||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
* BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
|
*
|
||||||
// Attempt to send the string to the message buffer.
|
* // Attempt to send the string to the message buffer.
|
||||||
xBytesSent = xMessageBufferSendFromISR( xMessageBuffer,
|
* xBytesSent = xMessageBufferSendFromISR( xMessageBuffer,
|
||||||
( void * ) pcStringToSend,
|
* ( void * ) pcStringToSend,
|
||||||
strlen( pcStringToSend ),
|
* strlen( pcStringToSend ),
|
||||||
&xHigherPriorityTaskWoken );
|
* &xHigherPriorityTaskWoken );
|
||||||
|
*
|
||||||
if( xBytesSent != strlen( pcStringToSend ) )
|
* if( xBytesSent != strlen( pcStringToSend ) )
|
||||||
{
|
* {
|
||||||
// The string could not be added to the message buffer because there was
|
* // The string could not be added to the message buffer because there was
|
||||||
// not enough free space in the buffer.
|
* // not enough free space in the buffer.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// If xHigherPriorityTaskWoken was set to pdTRUE inside
|
* // If xHigherPriorityTaskWoken was set to pdTRUE inside
|
||||||
// xMessageBufferSendFromISR() then a task that has a priority above the
|
* // xMessageBufferSendFromISR() then a task that has a priority above the
|
||||||
// priority of the currently executing task was unblocked and a context
|
* // priority of the currently executing task was unblocked and a context
|
||||||
// switch should be performed to ensure the ISR returns to the unblocked
|
* // switch should be performed to ensure the ISR returns to the unblocked
|
||||||
// task. In most FreeRTOS ports this is done by simply passing
|
* // task. In most FreeRTOS ports this is done by simply passing
|
||||||
// xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
|
* // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
|
||||||
// variables value, and perform the context switch if necessary. Check the
|
* // variables value, and perform the context switch if necessary. Check the
|
||||||
// documentation for the port in use for port specific instructions.
|
* // documentation for the port in use for port specific instructions.
|
||||||
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
* portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR
|
* \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken )
|
#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \
|
||||||
|
xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,
|
* size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,
|
||||||
void *pvRxData,
|
* void *pvRxData,
|
||||||
size_t xBufferLengthBytes,
|
* size_t xBufferLengthBytes,
|
||||||
TickType_t xTicksToWait );
|
* TickType_t xTicksToWait );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Receives a discrete message from a message buffer. Messages can be of
|
* Receives a discrete message from a message buffer. Messages can be of
|
||||||
* variable length and are copied out of the buffer.
|
* variable length and are copied out of the buffer.
|
||||||
|
@ -471,43 +476,44 @@ size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,
|
||||||
* zero is returned.
|
* zero is returned.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
void vAFunction( MessageBuffer_t xMessageBuffer )
|
* void vAFunction( MessageBuffer_t xMessageBuffer )
|
||||||
{
|
* {
|
||||||
uint8_t ucRxData[ 20 ];
|
* uint8_t ucRxData[ 20 ];
|
||||||
size_t xReceivedBytes;
|
* size_t xReceivedBytes;
|
||||||
const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
|
* const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
|
||||||
|
*
|
||||||
// Receive the next message from the message buffer. Wait in the Blocked
|
* // Receive the next message from the message buffer. Wait in the Blocked
|
||||||
// state (so not using any CPU processing time) for a maximum of 100ms for
|
* // state (so not using any CPU processing time) for a maximum of 100ms for
|
||||||
// a message to become available.
|
* // a message to become available.
|
||||||
xReceivedBytes = xMessageBufferReceive( xMessageBuffer,
|
* xReceivedBytes = xMessageBufferReceive( xMessageBuffer,
|
||||||
( void * ) ucRxData,
|
* ( void * ) ucRxData,
|
||||||
sizeof( ucRxData ),
|
* sizeof( ucRxData ),
|
||||||
xBlockTime );
|
* xBlockTime );
|
||||||
|
*
|
||||||
if( xReceivedBytes > 0 )
|
* if( xReceivedBytes > 0 )
|
||||||
{
|
* {
|
||||||
// A ucRxData contains a message that is xReceivedBytes long. Process
|
* // A ucRxData contains a message that is xReceivedBytes long. Process
|
||||||
// the message here....
|
* // the message here....
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xMessageBufferReceive xMessageBufferReceive
|
* \defgroup xMessageBufferReceive xMessageBufferReceive
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait )
|
#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \
|
||||||
|
xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait )
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,
|
* size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,
|
||||||
void *pvRxData,
|
* void *pvRxData,
|
||||||
size_t xBufferLengthBytes,
|
* size_t xBufferLengthBytes,
|
||||||
BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* An interrupt safe version of the API function that receives a discrete
|
* An interrupt safe version of the API function that receives a discrete
|
||||||
* message from a message buffer. Messages can be of variable length and are
|
* message from a message buffer. Messages can be of variable length and are
|
||||||
|
@ -561,50 +567,51 @@ size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,
|
||||||
* any.
|
* any.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
// A message buffer that has already been created.
|
* // A message buffer that has already been created.
|
||||||
MessageBuffer_t xMessageBuffer;
|
* MessageBuffer_t xMessageBuffer;
|
||||||
|
*
|
||||||
void vAnInterruptServiceRoutine( void )
|
* void vAnInterruptServiceRoutine( void )
|
||||||
{
|
* {
|
||||||
uint8_t ucRxData[ 20 ];
|
* uint8_t ucRxData[ 20 ];
|
||||||
size_t xReceivedBytes;
|
* size_t xReceivedBytes;
|
||||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
* BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
|
*
|
||||||
// Receive the next message from the message buffer.
|
* // Receive the next message from the message buffer.
|
||||||
xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer,
|
* xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer,
|
||||||
( void * ) ucRxData,
|
* ( void * ) ucRxData,
|
||||||
sizeof( ucRxData ),
|
* sizeof( ucRxData ),
|
||||||
&xHigherPriorityTaskWoken );
|
* &xHigherPriorityTaskWoken );
|
||||||
|
*
|
||||||
if( xReceivedBytes > 0 )
|
* if( xReceivedBytes > 0 )
|
||||||
{
|
* {
|
||||||
// A ucRxData contains a message that is xReceivedBytes long. Process
|
* // A ucRxData contains a message that is xReceivedBytes long. Process
|
||||||
// the message here....
|
* // the message here....
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// If xHigherPriorityTaskWoken was set to pdTRUE inside
|
* // If xHigherPriorityTaskWoken was set to pdTRUE inside
|
||||||
// xMessageBufferReceiveFromISR() then a task that has a priority above the
|
* // xMessageBufferReceiveFromISR() then a task that has a priority above the
|
||||||
// priority of the currently executing task was unblocked and a context
|
* // priority of the currently executing task was unblocked and a context
|
||||||
// switch should be performed to ensure the ISR returns to the unblocked
|
* // switch should be performed to ensure the ISR returns to the unblocked
|
||||||
// task. In most FreeRTOS ports this is done by simply passing
|
* // task. In most FreeRTOS ports this is done by simply passing
|
||||||
// xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
|
* // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
|
||||||
// variables value, and perform the context switch if necessary. Check the
|
* // variables value, and perform the context switch if necessary. Check the
|
||||||
// documentation for the port in use for port specific instructions.
|
* // documentation for the port in use for port specific instructions.
|
||||||
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
* portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR
|
* \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken )
|
#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \
|
||||||
|
xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );
|
* void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Deletes a message buffer that was previously created using a call to
|
* Deletes a message buffer that was previously created using a call to
|
||||||
* xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message
|
* xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message
|
||||||
|
@ -617,13 +624,14 @@ void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );
|
||||||
* @param xMessageBuffer The handle of the message buffer to be deleted.
|
* @param xMessageBuffer The handle of the message buffer to be deleted.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define vMessageBufferDelete( xMessageBuffer ) vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer )
|
#define vMessageBufferDelete( xMessageBuffer ) \
|
||||||
|
vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ) );
|
* BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Tests to see if a message buffer is full. A message buffer is full if it
|
* Tests to see if a message buffer is full. A message buffer is full if it
|
||||||
* cannot accept any more messages, of any size, until space is made available
|
* cannot accept any more messages, of any size, until space is made available
|
||||||
|
@ -634,13 +642,14 @@ BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
* @return If the message buffer referenced by xMessageBuffer is full then
|
* @return If the message buffer referenced by xMessageBuffer is full then
|
||||||
* pdTRUE is returned. Otherwise pdFALSE is returned.
|
* pdTRUE is returned. Otherwise pdFALSE is returned.
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferIsFull( xMessageBuffer ) xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer )
|
#define xMessageBufferIsFull( xMessageBuffer ) \
|
||||||
|
xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ) );
|
* BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Tests to see if a message buffer is empty (does not contain any messages).
|
* Tests to see if a message buffer is empty (does not contain any messages).
|
||||||
*
|
*
|
||||||
|
@ -650,13 +659,14 @@ BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
* pdTRUE is returned. Otherwise pdFALSE is returned.
|
* pdTRUE is returned. Otherwise pdFALSE is returned.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferIsEmpty( xMessageBuffer ) xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer )
|
#define xMessageBufferIsEmpty( xMessageBuffer ) \
|
||||||
|
xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );
|
* BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Resets a message buffer to its initial empty state, discarding any message it
|
* Resets a message buffer to its initial empty state, discarding any message it
|
||||||
* contained.
|
* contained.
|
||||||
|
@ -673,14 +683,15 @@ BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );
|
||||||
* \defgroup xMessageBufferReset xMessageBufferReset
|
* \defgroup xMessageBufferReset xMessageBufferReset
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferReset( xMessageBuffer ) xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer )
|
#define xMessageBufferReset( xMessageBuffer ) \
|
||||||
|
xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer )
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
|
* size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
</pre>
|
* </pre>
|
||||||
* Returns the number of bytes of free space in the message buffer.
|
* Returns the number of bytes of free space in the message buffer.
|
||||||
*
|
*
|
||||||
* @param xMessageBuffer The handle of the message buffer being queried.
|
* @param xMessageBuffer The handle of the message buffer being queried.
|
||||||
|
@ -695,14 +706,16 @@ size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
* \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable
|
* \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer )
|
#define xMessageBufferSpaceAvailable( xMessageBuffer ) \
|
||||||
#define xMessageBufferSpacesAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */
|
xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer )
|
||||||
|
#define xMessageBufferSpacesAvailable( xMessageBuffer ) \
|
||||||
|
xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) );
|
* size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
</pre>
|
* </pre>
|
||||||
* Returns the length (in bytes) of the next message in a message buffer.
|
* Returns the length (in bytes) of the next message in a message buffer.
|
||||||
* Useful if xMessageBufferReceive() returned 0 because the size of the buffer
|
* Useful if xMessageBufferReceive() returned 0 because the size of the buffer
|
||||||
* passed into xMessageBufferReceive() was too small to hold the next message.
|
* passed into xMessageBufferReceive() was too small to hold the next message.
|
||||||
|
@ -715,14 +728,15 @@ size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
* \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes
|
* \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferNextLengthBytes( xMessageBuffer ) xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION;
|
#define xMessageBufferNextLengthBytes( xMessageBuffer ) \
|
||||||
|
xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* For advanced users only.
|
* For advanced users only.
|
||||||
*
|
*
|
||||||
|
@ -754,14 +768,15 @@ BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xStreamBuff
|
||||||
* \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR
|
* \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken )
|
#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \
|
||||||
|
xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* For advanced users only.
|
* For advanced users only.
|
||||||
*
|
*
|
||||||
|
@ -794,10 +809,13 @@ BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xStreamB
|
||||||
* \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR
|
* \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken )
|
#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \
|
||||||
|
xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken )
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#if defined( __cplusplus )
|
#if defined( __cplusplus )
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */
|
#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -38,19 +37,38 @@
|
||||||
#define MPU_PROTOTYPES_H
|
#define MPU_PROTOTYPES_H
|
||||||
|
|
||||||
/* MPU versions of tasks.h API functions. */
|
/* MPU versions of tasks.h API functions. */
|
||||||
BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode,
|
||||||
TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL;
|
const char * const pcName,
|
||||||
BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) FREERTOS_SYSTEM_CALL;
|
const uint16_t usStackDepth,
|
||||||
BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) FREERTOS_SYSTEM_CALL;
|
void * const pvParameters,
|
||||||
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t uxPriority,
|
||||||
|
TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL;
|
||||||
|
TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode,
|
||||||
|
const char * const pcName,
|
||||||
|
const uint32_t ulStackDepth,
|
||||||
|
void * const pvParameters,
|
||||||
|
UBaseType_t uxPriority,
|
||||||
|
StackType_t * const puxStackBuffer,
|
||||||
|
StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
|
||||||
|
TaskHandle_t * pxCreatedTask ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,
|
||||||
|
TaskHandle_t * pxCreatedTask ) FREERTOS_SYSTEM_CALL;
|
||||||
|
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask,
|
||||||
|
const MemoryRegion_t * const pxRegions ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
|
||||||
|
const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskGetInfo( TaskHandle_t xTask,
|
||||||
void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL;
|
TaskStatus_t * pxTaskStatus,
|
||||||
|
BaseType_t xGetFreeStackSpace,
|
||||||
|
eTaskState eState ) FREERTOS_SYSTEM_CALL;
|
||||||
|
void MPU_vTaskPrioritySet( TaskHandle_t xTask,
|
||||||
|
UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL;
|
||||||
|
@ -62,87 +80,166 @@ char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) FREERTOS_SYSTEM_CALL;
|
TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask,
|
||||||
|
TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,
|
||||||
void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) FREERTOS_SYSTEM_CALL;
|
BaseType_t xIndex,
|
||||||
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) FREERTOS_SYSTEM_CALL;
|
void * pvValue ) FREERTOS_SYSTEM_CALL;
|
||||||
|
void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,
|
||||||
|
BaseType_t xIndex ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask,
|
||||||
|
void * pvParameter ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,
|
||||||
|
const UBaseType_t uxArraySize,
|
||||||
|
uint32_t * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;
|
||||||
uint32_t MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;
|
uint32_t MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify,
|
||||||
BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t uxIndexToNotify,
|
||||||
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
uint32_t ulValue,
|
||||||
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
eNotifyAction eAction,
|
||||||
uint32_t MPU_ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL;
|
uint32_t * pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,
|
||||||
|
uint32_t ulBitsToClearOnEntry,
|
||||||
|
uint32_t ulBitsToClearOnExit,
|
||||||
|
uint32_t * pulNotificationValue,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,
|
||||||
|
BaseType_t xClearCountOnExit,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask,
|
||||||
|
UBaseType_t uxIndexToClear ) FREERTOS_SYSTEM_CALL;
|
||||||
|
uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask,
|
||||||
|
UBaseType_t uxIndexToClear,
|
||||||
|
uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,
|
||||||
|
TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
||||||
/* MPU versions of queue.h API functions. */
|
/* MPU versions of queue.h API functions. */
|
||||||
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue,
|
||||||
BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
const void * const pvItemToQueue,
|
||||||
BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
TickType_t xTicksToWait,
|
||||||
BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue,
|
||||||
|
void * const pvBuffer,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue,
|
||||||
|
void * const pvBuffer,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
|
QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL;
|
QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType,
|
||||||
QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL;
|
StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL;
|
QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,
|
||||||
|
const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL;
|
||||||
|
QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,
|
||||||
|
const UBaseType_t uxInitialCount,
|
||||||
|
StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL;
|
TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) FREERTOS_SYSTEM_CALL;
|
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue,
|
||||||
|
const char * pcName ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
|
QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength,
|
||||||
QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
|
const UBaseType_t uxItemSize,
|
||||||
|
const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
|
||||||
|
QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,
|
||||||
|
const UBaseType_t uxItemSize,
|
||||||
|
uint8_t * pucQueueStorage,
|
||||||
|
StaticQueue_t * pxStaticQueue,
|
||||||
|
const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL;
|
QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
|
||||||
BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
|
QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,
|
||||||
BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL;
|
QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL;
|
QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
|
||||||
|
const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue,
|
||||||
|
BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
|
void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue,
|
||||||
|
UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
||||||
/* MPU versions of timers.h API functions. */
|
/* MPU versions of timers.h API functions. */
|
||||||
TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL;
|
TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName,
|
||||||
TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ) FREERTOS_SYSTEM_CALL;
|
const TickType_t xTimerPeriodInTicks,
|
||||||
|
const UBaseType_t uxAutoReload,
|
||||||
|
void * const pvTimerID,
|
||||||
|
TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL;
|
||||||
|
TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName,
|
||||||
|
const TickType_t xTimerPeriodInTicks,
|
||||||
|
const UBaseType_t uxAutoReload,
|
||||||
|
void * const pvTimerID,
|
||||||
|
TimerCallbackFunction_t pxCallbackFunction,
|
||||||
|
StaticTimer_t * pxTimerBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTimerSetTimerID( TimerHandle_t xTimer,
|
||||||
|
void * pvNewID ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,
|
||||||
|
void * pvParameter1,
|
||||||
|
uint32_t ulParameter2,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;
|
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer,
|
||||||
|
const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer,
|
||||||
|
const BaseType_t xCommandID,
|
||||||
|
const TickType_t xOptionalValue,
|
||||||
|
BaseType_t * const pxHigherPriorityTaskWoken,
|
||||||
|
const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
||||||
/* MPU versions of event_group.h API functions. */
|
/* MPU versions of event_group.h API functions. */
|
||||||
EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL;
|
EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL;
|
||||||
EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL;
|
EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
|
||||||
EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL;
|
const EventBits_t uxBitsToWaitFor,
|
||||||
EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL;
|
const BaseType_t xClearOnExit,
|
||||||
EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
const BaseType_t xWaitForAllBits,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL;
|
||||||
|
EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL;
|
||||||
|
EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL;
|
void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL;
|
UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
||||||
/* MPU versions of message/stream_buffer.h API functions. */
|
/* MPU versions of message/stream_buffer.h API functions. */
|
||||||
size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||||
size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
const void * pvTxData,
|
||||||
|
size_t xDataLengthBytes,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
|
size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
void * pvRxData,
|
||||||
|
size_t xBufferLengthBytes,
|
||||||
|
TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
|
@ -150,11 +247,17 @@ BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERT
|
||||||
BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL;
|
BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,
|
||||||
StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer ) FREERTOS_SYSTEM_CALL;
|
size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL;
|
||||||
StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer, uint8_t * const pucStreamBufferStorageArea, StaticStreamBuffer_t * const pxStaticStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes,
|
||||||
|
size_t xTriggerLevelBytes,
|
||||||
|
BaseType_t xIsMessageBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
|
StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
|
||||||
|
size_t xTriggerLevelBytes,
|
||||||
|
BaseType_t xIsMessageBuffer,
|
||||||
|
uint8_t * const pucStreamBufferStorageArea,
|
||||||
|
StaticStreamBuffer_t * const pxStaticStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* MPU_PROTOTYPES_H */
|
#endif /* MPU_PROTOTYPES_H */
|
||||||
|
|
||||||
|
|
|
@ -19,22 +19,21 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MPU_WRAPPERS_H
|
#ifndef MPU_WRAPPERS_H
|
||||||
#define MPU_WRAPPERS_H
|
#define MPU_WRAPPERS_H
|
||||||
|
|
||||||
/* This file redefines API functions to be called through a wrapper macro, but
|
/* This file redefines API functions to be called through a wrapper macro, but
|
||||||
only for ports that are using the MPU. */
|
* only for ports that are using the MPU. */
|
||||||
#ifdef portUSING_MPU_WRAPPERS
|
#ifdef portUSING_MPU_WRAPPERS
|
||||||
|
|
||||||
/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is
|
/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is
|
||||||
included from queue.c or task.c to prevent it from having an effect within
|
* included from queue.c or task.c to prevent it from having an effect within
|
||||||
those files. */
|
* those files. */
|
||||||
#ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
#ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -79,10 +78,10 @@ only for ports that are using the MPU. */
|
||||||
#define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
|
#define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
|
||||||
#define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter
|
#define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter
|
||||||
#define xTaskGenericNotify MPU_xTaskGenericNotify
|
#define xTaskGenericNotify MPU_xTaskGenericNotify
|
||||||
#define xTaskNotifyWait MPU_xTaskNotifyWait
|
#define xTaskGenericNotifyWait MPU_xTaskGenericNotifyWait
|
||||||
#define ulTaskNotifyTake MPU_ulTaskNotifyTake
|
#define ulTaskGenericNotifyTake MPU_ulTaskGenericNotifyTake
|
||||||
#define xTaskNotifyStateClear MPU_xTaskNotifyStateClear
|
#define xTaskGenericNotifyStateClear MPU_xTaskGenericNotifyStateClear
|
||||||
#define ulTaskNotifyValueClear MPU_ulTaskNotifyValueClear
|
#define ulTaskGenericNotifyValueClear MPU_ulTaskGenericNotifyValueClear
|
||||||
#define xTaskCatchUpTicks MPU_xTaskCatchUpTicks
|
#define xTaskCatchUpTicks MPU_xTaskCatchUpTicks
|
||||||
|
|
||||||
#define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
|
#define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
|
||||||
|
@ -144,7 +143,7 @@ only for ports that are using the MPU. */
|
||||||
#define vEventGroupDelete MPU_vEventGroupDelete
|
#define vEventGroupDelete MPU_vEventGroupDelete
|
||||||
|
|
||||||
/* Map standard message/stream_buffer.h API functions to the MPU
|
/* Map standard message/stream_buffer.h API functions to the MPU
|
||||||
equivalents. */
|
* equivalents. */
|
||||||
#define xStreamBufferSend MPU_xStreamBufferSend
|
#define xStreamBufferSend MPU_xStreamBufferSend
|
||||||
#define xStreamBufferReceive MPU_xStreamBufferReceive
|
#define xStreamBufferReceive MPU_xStreamBufferReceive
|
||||||
#define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes
|
#define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes
|
||||||
|
@ -160,8 +159,8 @@ only for ports that are using the MPU. */
|
||||||
|
|
||||||
|
|
||||||
/* Remove the privileged function macro, but keep the PRIVILEGED_DATA
|
/* Remove the privileged function macro, but keep the PRIVILEGED_DATA
|
||||||
macro so applications can place data in privileged access sections
|
* macro so applications can place data in privileged access sections
|
||||||
(useful when using statically allocated objects). */
|
* (useful when using statically allocated objects). */
|
||||||
#define PRIVILEGED_FUNCTION
|
#define PRIVILEGED_FUNCTION
|
||||||
#define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) )
|
#define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) )
|
||||||
#define FREERTOS_SYSTEM_CALL
|
#define FREERTOS_SYSTEM_CALL
|
||||||
|
@ -186,4 +185,3 @@ only for ports that are using the MPU. */
|
||||||
|
|
||||||
|
|
||||||
#endif /* MPU_WRAPPERS_H */
|
#endif /* MPU_WRAPPERS_H */
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
|
@ -33,21 +32,21 @@
|
||||||
#define PORTABLE_H
|
#define PORTABLE_H
|
||||||
|
|
||||||
/* Each FreeRTOS port has a unique portmacro.h header file. Originally a
|
/* Each FreeRTOS port has a unique portmacro.h header file. Originally a
|
||||||
pre-processor definition was used to ensure the pre-processor found the correct
|
* pre-processor definition was used to ensure the pre-processor found the correct
|
||||||
portmacro.h file for the port being used. That scheme was deprecated in favour
|
* portmacro.h file for the port being used. That scheme was deprecated in favour
|
||||||
of setting the compiler's include path such that it found the correct
|
* of setting the compiler's include path such that it found the correct
|
||||||
portmacro.h file - removing the need for the constant and allowing the
|
* portmacro.h file - removing the need for the constant and allowing the
|
||||||
portmacro.h file to be located anywhere in relation to the port being used.
|
* portmacro.h file to be located anywhere in relation to the port being used.
|
||||||
Purely for reasons of backward compatibility the old method is still valid, but
|
* Purely for reasons of backward compatibility the old method is still valid, but
|
||||||
to make it clear that new projects should not use it, support for the port
|
* to make it clear that new projects should not use it, support for the port
|
||||||
specific constants has been moved into the deprecated_definitions.h header
|
* specific constants has been moved into the deprecated_definitions.h header
|
||||||
file. */
|
* file. */
|
||||||
#include "deprecated_definitions.h"
|
#include "deprecated_definitions.h"
|
||||||
|
|
||||||
/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h
|
/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h
|
||||||
did not result in a portmacro.h header file being included - and it should be
|
* did not result in a portmacro.h header file being included - and it should be
|
||||||
included here. In this case the path to the correct portmacro.h header file
|
* included here. In this case the path to the correct portmacro.h header file
|
||||||
must be set in the compiler's include path. */
|
* must be set in the compiler's include path. */
|
||||||
#ifndef portENTER_CRITICAL
|
#ifndef portENTER_CRITICAL
|
||||||
#include "portmacro.h"
|
#include "portmacro.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -92,9 +91,11 @@ must be set in the compiler's include path. */
|
||||||
#define portARCH_NAME NULL
|
#define portARCH_NAME NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#include "mpu_wrappers.h"
|
#include "mpu_wrappers.h"
|
||||||
|
|
||||||
|
@ -106,20 +107,32 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#if ( portUSING_MPU_WRAPPERS == 1 )
|
#if ( portUSING_MPU_WRAPPERS == 1 )
|
||||||
#if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
#if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
StackType_t * pxEndOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters,
|
||||||
|
BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
||||||
#else
|
#else
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters,
|
||||||
|
BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else /* if ( portUSING_MPU_WRAPPERS == 1 ) */
|
||||||
#if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
#if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
StackType_t * pxEndOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters ) PRIVILEGED_FUNCTION;
|
||||||
#else
|
#else
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
#endif
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* if ( portUSING_MPU_WRAPPERS == 1 ) */
|
||||||
|
|
||||||
/* Used by heap_5.c to define the start address and size of each memory region
|
/* Used by heap_5.c to define the start address and size of each memory region
|
||||||
that together comprise the total FreeRTOS heap space. */
|
* that together comprise the total FreeRTOS heap space. */
|
||||||
typedef struct HeapRegion
|
typedef struct HeapRegion
|
||||||
{
|
{
|
||||||
uint8_t * pucStartAddress;
|
uint8_t * pucStartAddress;
|
||||||
|
@ -188,12 +201,16 @@ void vPortEndScheduler( void ) PRIVILEGED_FUNCTION;
|
||||||
*/
|
*/
|
||||||
#if ( portUSING_MPU_WRAPPERS == 1 )
|
#if ( portUSING_MPU_WRAPPERS == 1 )
|
||||||
struct xMEMORY_REGION;
|
struct xMEMORY_REGION;
|
||||||
void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION;
|
void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,
|
||||||
|
const struct xMEMORY_REGION * const xRegions,
|
||||||
|
StackType_t * pxBottomOfStack,
|
||||||
|
uint32_t ulStackDepth ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif /* PORTABLE_H */
|
#endif /* PORTABLE_H */
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PROJDEFS_H
|
#ifndef PROJDEFS_H
|
||||||
|
@ -35,10 +34,10 @@
|
||||||
typedef void (* TaskFunction_t)( void * );
|
typedef void (* TaskFunction_t)( void * );
|
||||||
|
|
||||||
/* Converts a time in milliseconds to a time in ticks. This macro can be
|
/* Converts a time in milliseconds to a time in ticks. This macro can be
|
||||||
overridden by a macro of the same name defined in FreeRTOSConfig.h in case the
|
* overridden by a macro of the same name defined in FreeRTOSConfig.h in case the
|
||||||
definition here is not suitable for your application. */
|
* definition here is not suitable for your application. */
|
||||||
#ifndef pdMS_TO_TICKS
|
#ifndef pdMS_TO_TICKS
|
||||||
#define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) )
|
#define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define pdFALSE ( ( BaseType_t ) 0 )
|
#define pdFALSE ( ( BaseType_t ) 0 )
|
||||||
|
@ -66,7 +65,7 @@ definition here is not suitable for your application. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The following errno values are used by FreeRTOS+ components, not FreeRTOS
|
/* The following errno values are used by FreeRTOS+ components, not FreeRTOS
|
||||||
itself. */
|
* itself. */
|
||||||
#define pdFREERTOS_ERRNO_NONE 0 /* No errors */
|
#define pdFREERTOS_ERRNO_NONE 0 /* No errors */
|
||||||
#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */
|
#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */
|
||||||
#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */
|
#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */
|
||||||
|
@ -109,7 +108,7 @@ itself. */
|
||||||
#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */
|
#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */
|
||||||
|
|
||||||
/* The following endian values are used by FreeRTOS+ components, not FreeRTOS
|
/* The following endian values are used by FreeRTOS+ components, not FreeRTOS
|
||||||
itself. */
|
* itself. */
|
||||||
#define pdFREERTOS_LITTLE_ENDIAN 0
|
#define pdFREERTOS_LITTLE_ENDIAN 0
|
||||||
#define pdFREERTOS_BIG_ENDIAN 1
|
#define pdFREERTOS_BIG_ENDIAN 1
|
||||||
|
|
||||||
|
@ -119,6 +118,3 @@ itself. */
|
||||||
|
|
||||||
|
|
||||||
#endif /* PROJDEFS_H */
|
#endif /* PROJDEFS_H */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
1505
include/queue.h
1505
include/queue.h
File diff suppressed because it is too large
Load diff
893
include/semphr.h
893
include/semphr.h
File diff suppressed because it is too large
Load diff
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef STACK_MACROS_H
|
#ifndef STACK_MACROS_H
|
||||||
|
@ -126,4 +125,3 @@
|
||||||
|
|
||||||
|
|
||||||
#endif /* STACK_MACROS_H */
|
#endif /* STACK_MACROS_H */
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -55,9 +54,11 @@
|
||||||
#error "include FreeRTOS.h must appear in source files before include stream_buffer.h"
|
#error "include FreeRTOS.h must appear in source files before include stream_buffer.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#if defined( __cplusplus )
|
#if defined( __cplusplus )
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type by which stream buffers are referenced. For example, a call to
|
* Type by which stream buffers are referenced. For example, a call to
|
||||||
|
@ -72,9 +73,9 @@ typedef struct StreamBufferDef_t * StreamBufferHandle_t;
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );
|
* StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Creates a new stream buffer using dynamically allocated memory. See
|
* Creates a new stream buffer using dynamically allocated memory. See
|
||||||
* xStreamBufferCreateStatic() for a version that uses statically allocated
|
* xStreamBufferCreateStatic() for a version that uses statically allocated
|
||||||
|
@ -108,29 +109,29 @@ StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTrigg
|
||||||
* buffer.
|
* buffer.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
|
*
|
||||||
void vAFunction( void )
|
* void vAFunction( void )
|
||||||
{
|
* {
|
||||||
StreamBufferHandle_t xStreamBuffer;
|
* StreamBufferHandle_t xStreamBuffer;
|
||||||
const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10;
|
* const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10;
|
||||||
|
*
|
||||||
// Create a stream buffer that can hold 100 bytes. The memory used to hold
|
* // Create a stream buffer that can hold 100 bytes. The memory used to hold
|
||||||
// both the stream buffer structure and the data in the stream buffer is
|
* // both the stream buffer structure and the data in the stream buffer is
|
||||||
// allocated dynamically.
|
* // allocated dynamically.
|
||||||
xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel );
|
* xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel );
|
||||||
|
*
|
||||||
if( xStreamBuffer == NULL )
|
* if( xStreamBuffer == NULL )
|
||||||
{
|
* {
|
||||||
// There was not enough heap memory space available to create the
|
* // There was not enough heap memory space available to create the
|
||||||
// stream buffer.
|
* // stream buffer.
|
||||||
}
|
* }
|
||||||
else
|
* else
|
||||||
{
|
* {
|
||||||
// The stream buffer was created successfully and can now be used.
|
* // The stream buffer was created successfully and can now be used.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xStreamBufferCreate xStreamBufferCreate
|
* \defgroup xStreamBufferCreate xStreamBufferCreate
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
|
@ -139,12 +140,12 @@ const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10;
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,
|
* StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,
|
||||||
size_t xTriggerLevelBytes,
|
* size_t xTriggerLevelBytes,
|
||||||
uint8_t *pucStreamBufferStorageArea,
|
* uint8_t *pucStreamBufferStorageArea,
|
||||||
StaticStreamBuffer_t *pxStaticStreamBuffer );
|
* StaticStreamBuffer_t *pxStaticStreamBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
* Creates a new stream buffer using statically allocated memory. See
|
* Creates a new stream buffer using statically allocated memory. See
|
||||||
* xStreamBufferCreate() for a version that uses dynamically allocated memory.
|
* xStreamBufferCreate() for a version that uses dynamically allocated memory.
|
||||||
*
|
*
|
||||||
|
@ -181,51 +182,52 @@ StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,
|
||||||
* pxStaticstreamBuffer are NULL then NULL is returned.
|
* pxStaticstreamBuffer are NULL then NULL is returned.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
|
*
|
||||||
// Used to dimension the array used to hold the streams. The available space
|
* // Used to dimension the array used to hold the streams. The available space
|
||||||
// will actually be one less than this, so 999.
|
* // will actually be one less than this, so 999.
|
||||||
#define STORAGE_SIZE_BYTES 1000
|
#define STORAGE_SIZE_BYTES 1000
|
||||||
|
*
|
||||||
// Defines the memory that will actually hold the streams within the stream
|
* // Defines the memory that will actually hold the streams within the stream
|
||||||
// buffer.
|
* // buffer.
|
||||||
static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
|
* static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
|
||||||
|
*
|
||||||
// The variable used to hold the stream buffer structure.
|
* // The variable used to hold the stream buffer structure.
|
||||||
StaticStreamBuffer_t xStreamBufferStruct;
|
* StaticStreamBuffer_t xStreamBufferStruct;
|
||||||
|
*
|
||||||
void MyFunction( void )
|
* void MyFunction( void )
|
||||||
{
|
* {
|
||||||
StreamBufferHandle_t xStreamBuffer;
|
* StreamBufferHandle_t xStreamBuffer;
|
||||||
const size_t xTriggerLevel = 1;
|
* const size_t xTriggerLevel = 1;
|
||||||
|
*
|
||||||
xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucBufferStorage ),
|
* xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucBufferStorage ),
|
||||||
xTriggerLevel,
|
* xTriggerLevel,
|
||||||
ucBufferStorage,
|
* ucBufferStorage,
|
||||||
&xStreamBufferStruct );
|
* &xStreamBufferStruct );
|
||||||
|
*
|
||||||
// As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer
|
* // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer
|
||||||
// parameters were NULL, xStreamBuffer will not be NULL, and can be used to
|
* // parameters were NULL, xStreamBuffer will not be NULL, and can be used to
|
||||||
// reference the created stream buffer in other stream buffer API calls.
|
* // reference the created stream buffer in other stream buffer API calls.
|
||||||
|
*
|
||||||
// Other code that uses the stream buffer can go here.
|
* // Other code that uses the stream buffer can go here.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic
|
* \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer )
|
#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \
|
||||||
|
xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
* size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||||
const void *pvTxData,
|
* const void *pvTxData,
|
||||||
size_t xDataLengthBytes,
|
* size_t xDataLengthBytes,
|
||||||
TickType_t xTicksToWait );
|
* TickType_t xTicksToWait );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Sends bytes to a stream buffer. The bytes are copied into the stream buffer.
|
* Sends bytes to a stream buffer. The bytes are copied into the stream buffer.
|
||||||
*
|
*
|
||||||
|
@ -275,37 +277,37 @@ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||||
* write as many bytes as possible.
|
* write as many bytes as possible.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
void vAFunction( StreamBufferHandle_t xStreamBuffer )
|
* void vAFunction( StreamBufferHandle_t xStreamBuffer )
|
||||||
{
|
* {
|
||||||
size_t xBytesSent;
|
* size_t xBytesSent;
|
||||||
uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
|
* uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
|
||||||
char *pcStringToSend = "String to send";
|
* char *pcStringToSend = "String to send";
|
||||||
const TickType_t x100ms = pdMS_TO_TICKS( 100 );
|
* const TickType_t x100ms = pdMS_TO_TICKS( 100 );
|
||||||
|
*
|
||||||
// Send an array to the stream buffer, blocking for a maximum of 100ms to
|
* // Send an array to the stream buffer, blocking for a maximum of 100ms to
|
||||||
// wait for enough space to be available in the stream buffer.
|
* // wait for enough space to be available in the stream buffer.
|
||||||
xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
|
* xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
|
||||||
|
*
|
||||||
if( xBytesSent != sizeof( ucArrayToSend ) )
|
* if( xBytesSent != sizeof( ucArrayToSend ) )
|
||||||
{
|
* {
|
||||||
// The call to xStreamBufferSend() times out before there was enough
|
* // The call to xStreamBufferSend() times out before there was enough
|
||||||
// space in the buffer for the data to be written, but it did
|
* // space in the buffer for the data to be written, but it did
|
||||||
// successfully write xBytesSent bytes.
|
* // successfully write xBytesSent bytes.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// Send the string to the stream buffer. Return immediately if there is not
|
* // Send the string to the stream buffer. Return immediately if there is not
|
||||||
// enough space in the buffer.
|
* // enough space in the buffer.
|
||||||
xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
|
* xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
|
||||||
|
*
|
||||||
if( xBytesSent != strlen( pcStringToSend ) )
|
* if( xBytesSent != strlen( pcStringToSend ) )
|
||||||
{
|
* {
|
||||||
// The entire string could not be added to the stream buffer because
|
* // The entire string could not be added to the stream buffer because
|
||||||
// there was not enough free space in the buffer, but xBytesSent bytes
|
* // there was not enough free space in the buffer, but xBytesSent bytes
|
||||||
// were sent. Could try again to send the remaining bytes.
|
* // were sent. Could try again to send the remaining bytes.
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xStreamBufferSend xStreamBufferSend
|
* \defgroup xStreamBufferSend xStreamBufferSend
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
|
@ -317,12 +319,12 @@ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
|
* size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
const void *pvTxData,
|
* const void *pvTxData,
|
||||||
size_t xDataLengthBytes,
|
* size_t xDataLengthBytes,
|
||||||
BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Interrupt safe version of the API function that sends a stream of bytes to
|
* Interrupt safe version of the API function that sends a stream of bytes to
|
||||||
* the stream buffer.
|
* the stream buffer.
|
||||||
|
@ -374,39 +376,39 @@ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
* space for all the bytes to be written.
|
* space for all the bytes to be written.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
// A stream buffer that has already been created.
|
* // A stream buffer that has already been created.
|
||||||
StreamBufferHandle_t xStreamBuffer;
|
* StreamBufferHandle_t xStreamBuffer;
|
||||||
|
*
|
||||||
void vAnInterruptServiceRoutine( void )
|
* void vAnInterruptServiceRoutine( void )
|
||||||
{
|
* {
|
||||||
size_t xBytesSent;
|
* size_t xBytesSent;
|
||||||
char *pcStringToSend = "String to send";
|
* char *pcStringToSend = "String to send";
|
||||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
* BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
|
*
|
||||||
// Attempt to send the string to the stream buffer.
|
* // Attempt to send the string to the stream buffer.
|
||||||
xBytesSent = xStreamBufferSendFromISR( xStreamBuffer,
|
* xBytesSent = xStreamBufferSendFromISR( xStreamBuffer,
|
||||||
( void * ) pcStringToSend,
|
* ( void * ) pcStringToSend,
|
||||||
strlen( pcStringToSend ),
|
* strlen( pcStringToSend ),
|
||||||
&xHigherPriorityTaskWoken );
|
* &xHigherPriorityTaskWoken );
|
||||||
|
*
|
||||||
if( xBytesSent != strlen( pcStringToSend ) )
|
* if( xBytesSent != strlen( pcStringToSend ) )
|
||||||
{
|
* {
|
||||||
// There was not enough free space in the stream buffer for the entire
|
* // There was not enough free space in the stream buffer for the entire
|
||||||
// string to be written, ut xBytesSent bytes were written.
|
* // string to be written, ut xBytesSent bytes were written.
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// If xHigherPriorityTaskWoken was set to pdTRUE inside
|
* // If xHigherPriorityTaskWoken was set to pdTRUE inside
|
||||||
// xStreamBufferSendFromISR() then a task that has a priority above the
|
* // xStreamBufferSendFromISR() then a task that has a priority above the
|
||||||
// priority of the currently executing task was unblocked and a context
|
* // priority of the currently executing task was unblocked and a context
|
||||||
// switch should be performed to ensure the ISR returns to the unblocked
|
* // switch should be performed to ensure the ISR returns to the unblocked
|
||||||
// task. In most FreeRTOS ports this is done by simply passing
|
* // task. In most FreeRTOS ports this is done by simply passing
|
||||||
// xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
|
* // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
|
||||||
// variables value, and perform the context switch if necessary. Check the
|
* // variables value, and perform the context switch if necessary. Check the
|
||||||
// documentation for the port in use for port specific instructions.
|
* // documentation for the port in use for port specific instructions.
|
||||||
taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
* taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR
|
* \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
|
@ -418,12 +420,12 @@ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
* size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||||
void *pvRxData,
|
* void *pvRxData,
|
||||||
size_t xBufferLengthBytes,
|
* size_t xBufferLengthBytes,
|
||||||
TickType_t xTicksToWait );
|
* TickType_t xTicksToWait );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Receives bytes from a stream buffer.
|
* Receives bytes from a stream buffer.
|
||||||
*
|
*
|
||||||
|
@ -473,29 +475,29 @@ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||||
* out before xBufferLengthBytes were available.
|
* out before xBufferLengthBytes were available.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
void vAFunction( StreamBuffer_t xStreamBuffer )
|
* void vAFunction( StreamBuffer_t xStreamBuffer )
|
||||||
{
|
* {
|
||||||
uint8_t ucRxData[ 20 ];
|
* uint8_t ucRxData[ 20 ];
|
||||||
size_t xReceivedBytes;
|
* size_t xReceivedBytes;
|
||||||
const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
|
* const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
|
||||||
|
*
|
||||||
// Receive up to another sizeof( ucRxData ) bytes from the stream buffer.
|
* // Receive up to another sizeof( ucRxData ) bytes from the stream buffer.
|
||||||
// Wait in the Blocked state (so not using any CPU processing time) for a
|
* // Wait in the Blocked state (so not using any CPU processing time) for a
|
||||||
// maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be
|
* // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be
|
||||||
// available.
|
* // available.
|
||||||
xReceivedBytes = xStreamBufferReceive( xStreamBuffer,
|
* xReceivedBytes = xStreamBufferReceive( xStreamBuffer,
|
||||||
( void * ) ucRxData,
|
* ( void * ) ucRxData,
|
||||||
sizeof( ucRxData ),
|
* sizeof( ucRxData ),
|
||||||
xBlockTime );
|
* xBlockTime );
|
||||||
|
*
|
||||||
if( xReceivedBytes > 0 )
|
* if( xReceivedBytes > 0 )
|
||||||
{
|
* {
|
||||||
// A ucRxData contains another xRecievedBytes bytes of data, which can
|
* // A ucRxData contains another xRecievedBytes bytes of data, which can
|
||||||
// be processed here....
|
* // be processed here....
|
||||||
}
|
* }
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xStreamBufferReceive xStreamBufferReceive
|
* \defgroup xStreamBufferReceive xStreamBufferReceive
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
|
@ -507,12 +509,12 @@ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
|
* size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
void *pvRxData,
|
* void *pvRxData,
|
||||||
size_t xBufferLengthBytes,
|
* size_t xBufferLengthBytes,
|
||||||
BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* An interrupt safe version of the API function that receives bytes from a
|
* An interrupt safe version of the API function that receives bytes from a
|
||||||
* stream buffer.
|
* stream buffer.
|
||||||
|
@ -549,39 +551,39 @@ size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
* @return The number of bytes read from the stream buffer, if any.
|
* @return The number of bytes read from the stream buffer, if any.
|
||||||
*
|
*
|
||||||
* Example use:
|
* Example use:
|
||||||
<pre>
|
* <pre>
|
||||||
// A stream buffer that has already been created.
|
* // A stream buffer that has already been created.
|
||||||
StreamBuffer_t xStreamBuffer;
|
* StreamBuffer_t xStreamBuffer;
|
||||||
|
*
|
||||||
void vAnInterruptServiceRoutine( void )
|
* void vAnInterruptServiceRoutine( void )
|
||||||
{
|
* {
|
||||||
uint8_t ucRxData[ 20 ];
|
* uint8_t ucRxData[ 20 ];
|
||||||
size_t xReceivedBytes;
|
* size_t xReceivedBytes;
|
||||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
* BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
|
*
|
||||||
// Receive the next stream from the stream buffer.
|
* // Receive the next stream from the stream buffer.
|
||||||
xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer,
|
* xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer,
|
||||||
( void * ) ucRxData,
|
* ( void * ) ucRxData,
|
||||||
sizeof( ucRxData ),
|
* sizeof( ucRxData ),
|
||||||
&xHigherPriorityTaskWoken );
|
* &xHigherPriorityTaskWoken );
|
||||||
|
*
|
||||||
if( xReceivedBytes > 0 )
|
* if( xReceivedBytes > 0 )
|
||||||
{
|
* {
|
||||||
// ucRxData contains xReceivedBytes read from the stream buffer.
|
* // ucRxData contains xReceivedBytes read from the stream buffer.
|
||||||
// Process the stream here....
|
* // Process the stream here....
|
||||||
}
|
* }
|
||||||
|
*
|
||||||
// If xHigherPriorityTaskWoken was set to pdTRUE inside
|
* // If xHigherPriorityTaskWoken was set to pdTRUE inside
|
||||||
// xStreamBufferReceiveFromISR() then a task that has a priority above the
|
* // xStreamBufferReceiveFromISR() then a task that has a priority above the
|
||||||
// priority of the currently executing task was unblocked and a context
|
* // priority of the currently executing task was unblocked and a context
|
||||||
// switch should be performed to ensure the ISR returns to the unblocked
|
* // switch should be performed to ensure the ISR returns to the unblocked
|
||||||
// task. In most FreeRTOS ports this is done by simply passing
|
* // task. In most FreeRTOS ports this is done by simply passing
|
||||||
// xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
|
* // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
|
||||||
// variables value, and perform the context switch if necessary. Check the
|
* // variables value, and perform the context switch if necessary. Check the
|
||||||
// documentation for the port in use for port specific instructions.
|
* // documentation for the port in use for port specific instructions.
|
||||||
taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
* taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
* }
|
||||||
</pre>
|
* </pre>
|
||||||
* \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR
|
* \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
|
@ -593,9 +595,9 @@ size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );
|
* void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Deletes a stream buffer that was previously created using a call to
|
* Deletes a stream buffer that was previously created using a call to
|
||||||
* xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream
|
* xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream
|
||||||
|
@ -615,9 +617,9 @@ void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTI
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );
|
* BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Queries a stream buffer to see if it is full. A stream buffer is full if it
|
* Queries a stream buffer to see if it is full. A stream buffer is full if it
|
||||||
* does not have any free space, and therefore cannot accept any more data.
|
* does not have any free space, and therefore cannot accept any more data.
|
||||||
|
@ -635,9 +637,9 @@ BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );
|
* BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Queries a stream buffer to see if it is empty. A stream buffer is empty if
|
* Queries a stream buffer to see if it is empty. A stream buffer is empty if
|
||||||
* it does not contain any data.
|
* it does not contain any data.
|
||||||
|
@ -655,9 +657,9 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );
|
* BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Resets a stream buffer to its initial, empty, state. Any data that was in
|
* Resets a stream buffer to its initial, empty, state. Any data that was in
|
||||||
* the stream buffer is discarded. A stream buffer can only be reset if there
|
* the stream buffer is discarded. A stream buffer can only be reset if there
|
||||||
|
@ -678,9 +680,9 @@ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_F
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );
|
* size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Queries a stream buffer to see how much free space it contains, which is
|
* Queries a stream buffer to see how much free space it contains, which is
|
||||||
* equal to the amount of data that can be sent to the stream buffer before it
|
* equal to the amount of data that can be sent to the stream buffer before it
|
||||||
|
@ -699,9 +701,9 @@ size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVIL
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );
|
* size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Queries a stream buffer to see how much data it contains, which is equal to
|
* Queries a stream buffer to see how much data it contains, which is equal to
|
||||||
* the number of bytes that can be read from the stream buffer before the stream
|
* the number of bytes that can be read from the stream buffer before the stream
|
||||||
|
@ -720,9 +722,9 @@ size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILE
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );
|
* BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* A stream buffer's trigger level is the number of bytes that must be in the
|
* A stream buffer's trigger level is the number of bytes that must be in the
|
||||||
* stream buffer before a task that is blocked on the stream buffer to
|
* stream buffer before a task that is blocked on the stream buffer to
|
||||||
|
@ -752,14 +754,15 @@ BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, siz
|
||||||
* \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel
|
* \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) PRIVILEGED_FUNCTION;
|
BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
size_t xTriggerLevel ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* For advanced users only.
|
* For advanced users only.
|
||||||
*
|
*
|
||||||
|
@ -791,14 +794,15 @@ BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer
|
||||||
* \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR
|
* \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stream_buffer.h
|
* stream_buffer.h
|
||||||
*
|
*
|
||||||
<pre>
|
* <pre>
|
||||||
BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
* BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
|
||||||
</pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* For advanced users only.
|
* For advanced users only.
|
||||||
*
|
*
|
||||||
|
@ -831,7 +835,8 @@ BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuf
|
||||||
* \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR
|
* \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR
|
||||||
* \ingroup StreamBufferManagement
|
* \ingroup StreamBufferManagement
|
||||||
*/
|
*/
|
||||||
BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/* Functions below here are not part of the public API. */
|
/* Functions below here are not part of the public API. */
|
||||||
StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes,
|
StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes,
|
||||||
|
@ -847,13 +852,16 @@ StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
|
||||||
size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
|
size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION;
|
void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION;
|
||||||
UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
|
||||||
uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
|
uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#if defined( __cplusplus )
|
#if defined( __cplusplus )
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
#endif /* !defined( STREAM_BUFFER_H ) */
|
#endif /* !defined( STREAM_BUFFER_H ) */
|
||||||
|
|
2082
include/task.h
2082
include/task.h
File diff suppressed because it is too large
Load diff
100
include/timers.h
100
include/timers.h
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,23 +33,25 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*lint -save -e537 This headers are only multiply included if the application code
|
/*lint -save -e537 This headers are only multiply included if the application code
|
||||||
happens to also be including task.h. */
|
* happens to also be including task.h. */
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
/*lint -restore */
|
/*lint -restore */
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* MACROS AND DEFINITIONS
|
* MACROS AND DEFINITIONS
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
/* IDs for commands that can be sent/received on the timer queue. These are to
|
/* IDs for commands that can be sent/received on the timer queue. These are to
|
||||||
be used solely through the macros that make up the public software timer API,
|
* be used solely through the macros that make up the public software timer API,
|
||||||
as defined below. The commands that are sent from interrupts must use the
|
* as defined below. The commands that are sent from interrupts must use the
|
||||||
highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task
|
* highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task
|
||||||
or interrupt version of the queue send function should be used. */
|
* or interrupt version of the queue send function should be used. */
|
||||||
#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 )
|
#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 )
|
||||||
#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 )
|
#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 )
|
||||||
#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 )
|
#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 )
|
||||||
|
@ -85,7 +86,8 @@ typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer );
|
||||||
* Defines the prototype to which functions used with the
|
* Defines the prototype to which functions used with the
|
||||||
* xTimerPendFunctionCallFromISR() function must conform.
|
* xTimerPendFunctionCallFromISR() function must conform.
|
||||||
*/
|
*/
|
||||||
typedef void (*PendedFunction_t)( void *, uint32_t );
|
typedef void (* PendedFunction_t)( void *,
|
||||||
|
uint32_t );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TimerHandle_t xTimerCreate( const char * const pcTimerName,
|
* TimerHandle_t xTimerCreate( const char * const pcTimerName,
|
||||||
|
@ -101,7 +103,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* of memory, in which the timer data structure is stored. If a software timer
|
* of memory, in which the timer data structure is stored. If a software timer
|
||||||
* is created using xTimerCreate() then the required memory is automatically
|
* is created using xTimerCreate() then the required memory is automatically
|
||||||
* dynamically allocated inside the xTimerCreate() function. (see
|
* dynamically allocated inside the xTimerCreate() function. (see
|
||||||
* http://www.freertos.org/a00111.html). If a software timer is created using
|
* https://www.FreeRTOS.org/a00111.html). If a software timer is created using
|
||||||
* xTimerCreateStatic() then the application writer must provide the memory that
|
* xTimerCreateStatic() then the application writer must provide the memory that
|
||||||
* will get used by the software timer. xTimerCreateStatic() therefore allows a
|
* will get used by the software timer. xTimerCreateStatic() therefore allows a
|
||||||
* software timer to be created without using any dynamic memory allocation.
|
* software timer to be created without using any dynamic memory allocation.
|
||||||
|
@ -247,7 +249,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* of memory, in which the timer data structure is stored. If a software timer
|
* of memory, in which the timer data structure is stored. If a software timer
|
||||||
* is created using xTimerCreate() then the required memory is automatically
|
* is created using xTimerCreate() then the required memory is automatically
|
||||||
* dynamically allocated inside the xTimerCreate() function. (see
|
* dynamically allocated inside the xTimerCreate() function. (see
|
||||||
* http://www.freertos.org/a00111.html). If a software timer is created using
|
* https://www.FreeRTOS.org/a00111.html). If a software timer is created using
|
||||||
* xTimerCreateStatic() then the application writer must provide the memory that
|
* xTimerCreateStatic() then the application writer must provide the memory that
|
||||||
* will get used by the software timer. xTimerCreateStatic() therefore allows a
|
* will get used by the software timer. xTimerCreateStatic() therefore allows a
|
||||||
* software timer to be created without using any dynamic memory allocation.
|
* software timer to be created without using any dynamic memory allocation.
|
||||||
|
@ -404,7 +406,8 @@ void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
|
||||||
*
|
*
|
||||||
* See the xTimerCreate() API function example usage scenario.
|
* See the xTimerCreate() API function example usage scenario.
|
||||||
*/
|
*/
|
||||||
void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION;
|
void vTimerSetTimerID( TimerHandle_t xTimer,
|
||||||
|
void * pvNewID ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer );
|
* BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer );
|
||||||
|
@ -501,7 +504,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* See the xTimerCreate() API function example usage scenario.
|
* See the xTimerCreate() API function example usage scenario.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )
|
#define xTimerStart( xTimer, xTicksToWait ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );
|
* BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );
|
||||||
|
@ -543,7 +547,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* See the xTimerCreate() API function example usage scenario.
|
* See the xTimerCreate() API function example usage scenario.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) )
|
#define xTimerStop( xTimer, xTicksToWait ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
|
* BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
|
||||||
|
@ -623,7 +628,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* }
|
* }
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
#define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) )
|
#define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );
|
* BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );
|
||||||
|
@ -661,7 +667,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
*
|
*
|
||||||
* See the xTimerChangePeriod() API function example usage scenario.
|
* See the xTimerChangePeriod() API function example usage scenario.
|
||||||
*/
|
*/
|
||||||
#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) )
|
#define xTimerDelete( xTimer, xTicksToWait ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );
|
* BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );
|
||||||
|
@ -785,7 +792,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* }
|
* }
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )
|
#define xTimerReset( xTimer, xTicksToWait ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,
|
* BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,
|
||||||
|
@ -871,7 +879,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* }
|
* }
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )
|
#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,
|
* BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,
|
||||||
|
@ -934,7 +943,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* }
|
* }
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U )
|
#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer,
|
* BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer,
|
||||||
|
@ -1007,7 +1017,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* }
|
* }
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U )
|
#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,
|
* BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,
|
||||||
|
@ -1093,7 +1104,8 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* }
|
* }
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )
|
#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) \
|
||||||
|
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1184,7 +1196,10 @@ TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
* }
|
* }
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend,
|
||||||
|
void * pvParameter1,
|
||||||
|
uint32_t ulParameter2,
|
||||||
|
BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,
|
* BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,
|
||||||
|
@ -1218,7 +1233,10 @@ BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void
|
||||||
* timer daemon task, otherwise pdFALSE is returned.
|
* timer daemon task, otherwise pdFALSE is returned.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,
|
||||||
|
void * pvParameter1,
|
||||||
|
uint32_t ulParameter2,
|
||||||
|
TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* const char * const pcTimerGetName( TimerHandle_t xTimer );
|
* const char * const pcTimerGetName( TimerHandle_t xTimer );
|
||||||
|
@ -1246,7 +1264,8 @@ const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint
|
||||||
* uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and
|
* uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and
|
||||||
* enter the dormant state after it expires.
|
* enter the dormant state after it expires.
|
||||||
*/
|
*/
|
||||||
void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION;
|
void vTimerSetReloadMode( TimerHandle_t xTimer,
|
||||||
|
const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer );
|
* UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer );
|
||||||
|
@ -1293,17 +1312,40 @@ TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
|
||||||
* for use by the kernel only.
|
* for use by the kernel only.
|
||||||
*/
|
*/
|
||||||
BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION;
|
BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION;
|
||||||
BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
BaseType_t xTimerGenericCommand( TimerHandle_t xTimer,
|
||||||
|
const BaseType_t xCommandID,
|
||||||
|
const TickType_t xOptionalValue,
|
||||||
|
BaseType_t * const pxHigherPriorityTaskWoken,
|
||||||
|
const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION;
|
void vTimerSetTimerNumber( TimerHandle_t xTimer,
|
||||||
|
UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION;
|
||||||
UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task.h
|
||||||
|
* <pre>void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ) </pre>
|
||||||
|
*
|
||||||
|
* This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Timer Task TCB. This function is required when
|
||||||
|
* configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION
|
||||||
|
*
|
||||||
|
* @param ppxTimerTaskTCBBuffer A handle to a statically allocated TCB buffer
|
||||||
|
* @param ppxTimerTaskStackBuffer A handle to a statically allocated Stack buffer for thie idle task
|
||||||
|
* @param pulTimerTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer
|
||||||
|
*/
|
||||||
|
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
|
||||||
|
StackType_t ** ppxTimerTaskStackBuffer,
|
||||||
|
uint32_t * pulTimerTaskStackSize );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
#endif /* TIMERS_H */
|
#endif /* TIMERS_H */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
106
list.c
106
list.c
|
@ -19,17 +19,28 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
||||||
|
* all the API functions to use the MPU wrappers. That should only be done when
|
||||||
|
* task.h is included from an application file. */
|
||||||
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
|
/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified
|
||||||
|
* because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be
|
||||||
|
* defined for the header files above, but not in this file, in order to
|
||||||
|
* generate the correct privileged Vs unprivileged linkage and placement. */
|
||||||
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* PUBLIC LIST API documented in list.h
|
* PUBLIC LIST API documented in list.h
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
@ -37,23 +48,23 @@
|
||||||
void vListInitialise( List_t * const pxList )
|
void vListInitialise( List_t * const pxList )
|
||||||
{
|
{
|
||||||
/* The list structure contains a list item which is used to mark the
|
/* The list structure contains a list item which is used to mark the
|
||||||
end of the list. To initialise the list the list end is inserted
|
* end of the list. To initialise the list the list end is inserted
|
||||||
as the only list entry. */
|
* as the only list entry. */
|
||||||
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
|
|
||||||
/* The list end value is the highest possible value in the list to
|
/* The list end value is the highest possible value in the list to
|
||||||
ensure it remains at the end of the list. */
|
* ensure it remains at the end of the list. */
|
||||||
pxList->xListEnd.xItemValue = portMAX_DELAY;
|
pxList->xListEnd.xItemValue = portMAX_DELAY;
|
||||||
|
|
||||||
/* The list end next and previous pointers point to itself so we know
|
/* The list end next and previous pointers point to itself so we know
|
||||||
when the list is empty. */
|
* when the list is empty. */
|
||||||
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
|
|
||||||
pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
|
pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
|
||||||
|
|
||||||
/* Write known values into the list if
|
/* Write known values into the list if
|
||||||
configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
||||||
listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
|
listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
|
||||||
listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
|
listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
|
||||||
}
|
}
|
||||||
|
@ -65,25 +76,26 @@ void vListInitialiseItem( ListItem_t * const pxItem )
|
||||||
pxItem->pxContainer = NULL;
|
pxItem->pxContainer = NULL;
|
||||||
|
|
||||||
/* Write known values into the list item if
|
/* Write known values into the list item if
|
||||||
configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
||||||
listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
|
listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
|
||||||
listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
|
listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
|
void vListInsertEnd( List_t * const pxList,
|
||||||
|
ListItem_t * const pxNewListItem )
|
||||||
{
|
{
|
||||||
ListItem_t * const pxIndex = pxList->pxIndex;
|
ListItem_t * const pxIndex = pxList->pxIndex;
|
||||||
|
|
||||||
/* Only effective when configASSERT() is also defined, these tests may catch
|
/* Only effective when configASSERT() is also defined, these tests may catch
|
||||||
the list data structures being overwritten in memory. They will not catch
|
* the list data structures being overwritten in memory. They will not catch
|
||||||
data errors caused by incorrect configuration or use of FreeRTOS. */
|
* data errors caused by incorrect configuration or use of FreeRTOS. */
|
||||||
listTEST_LIST_INTEGRITY( pxList );
|
listTEST_LIST_INTEGRITY( pxList );
|
||||||
listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
|
listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
|
||||||
|
|
||||||
/* Insert a new list item into pxList, but rather than sort the list,
|
/* Insert a new list item into pxList, but rather than sort the list,
|
||||||
makes the new list item the last item to be removed by a call to
|
* makes the new list item the last item to be removed by a call to
|
||||||
listGET_OWNER_OF_NEXT_ENTRY(). */
|
* listGET_OWNER_OF_NEXT_ENTRY(). */
|
||||||
pxNewListItem->pxNext = pxIndex;
|
pxNewListItem->pxNext = pxIndex;
|
||||||
pxNewListItem->pxPrevious = pxIndex->pxPrevious;
|
pxNewListItem->pxPrevious = pxIndex->pxPrevious;
|
||||||
|
|
||||||
|
@ -100,25 +112,26 @@ ListItem_t * const pxIndex = pxList->pxIndex;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
|
void vListInsert( List_t * const pxList,
|
||||||
|
ListItem_t * const pxNewListItem )
|
||||||
{
|
{
|
||||||
ListItem_t * pxIterator;
|
ListItem_t * pxIterator;
|
||||||
const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
|
|
||||||
/* Only effective when configASSERT() is also defined, these tests may catch
|
/* Only effective when configASSERT() is also defined, these tests may catch
|
||||||
the list data structures being overwritten in memory. They will not catch
|
* the list data structures being overwritten in memory. They will not catch
|
||||||
data errors caused by incorrect configuration or use of FreeRTOS. */
|
* data errors caused by incorrect configuration or use of FreeRTOS. */
|
||||||
listTEST_LIST_INTEGRITY( pxList );
|
listTEST_LIST_INTEGRITY( pxList );
|
||||||
listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
|
listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
|
||||||
|
|
||||||
/* Insert the new list item into the list, sorted in xItemValue order.
|
/* Insert the new list item into the list, sorted in xItemValue order.
|
||||||
|
*
|
||||||
If the list already contains a list item with the same item value then the
|
* If the list already contains a list item with the same item value then the
|
||||||
new list item should be placed after it. This ensures that TCBs which are
|
* new list item should be placed after it. This ensures that TCBs which are
|
||||||
stored in ready lists (all of which have the same xItemValue value) get a
|
* stored in ready lists (all of which have the same xItemValue value) get a
|
||||||
share of the CPU. However, if the xItemValue is the same as the back marker
|
* share of the CPU. However, if the xItemValue is the same as the back marker
|
||||||
the iteration loop below will not end. Therefore the value is checked
|
* the iteration loop below will not end. Therefore the value is checked
|
||||||
first, and the algorithm slightly modified if necessary. */
|
* first, and the algorithm slightly modified if necessary. */
|
||||||
if( xValueOfInsertion == portMAX_DELAY )
|
if( xValueOfInsertion == portMAX_DELAY )
|
||||||
{
|
{
|
||||||
pxIterator = pxList->xListEnd.pxPrevious;
|
pxIterator = pxList->xListEnd.pxPrevious;
|
||||||
|
@ -126,31 +139,31 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* *** NOTE ***********************************************************
|
/* *** NOTE ***********************************************************
|
||||||
If you find your application is crashing here then likely causes are
|
* If you find your application is crashing here then likely causes are
|
||||||
listed below. In addition see https://www.freertos.org/FAQHelp.html for
|
* listed below. In addition see https://www.FreeRTOS.org/FAQHelp.html for
|
||||||
more tips, and ensure configASSERT() is defined!
|
* more tips, and ensure configASSERT() is defined!
|
||||||
https://www.freertos.org/a00110.html#configASSERT
|
* https://www.FreeRTOS.org/a00110.html#configASSERT
|
||||||
|
*
|
||||||
1) Stack overflow -
|
* 1) Stack overflow -
|
||||||
see https://www.freertos.org/Stacks-and-stack-overflow-checking.html
|
* see https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html
|
||||||
2) Incorrect interrupt priority assignment, especially on Cortex-M
|
* 2) Incorrect interrupt priority assignment, especially on Cortex-M
|
||||||
parts where numerically high priority values denote low actual
|
* parts where numerically high priority values denote low actual
|
||||||
interrupt priorities, which can seem counter intuitive. See
|
* interrupt priorities, which can seem counter intuitive. See
|
||||||
https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition
|
* https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html and the definition
|
||||||
of configMAX_SYSCALL_INTERRUPT_PRIORITY on
|
* of configMAX_SYSCALL_INTERRUPT_PRIORITY on
|
||||||
https://www.freertos.org/a00110.html
|
* https://www.FreeRTOS.org/a00110.html
|
||||||
3) Calling an API function from within a critical section or when
|
* 3) Calling an API function from within a critical section or when
|
||||||
the scheduler is suspended, or calling an API function that does
|
* the scheduler is suspended, or calling an API function that does
|
||||||
not end in "FromISR" from an interrupt.
|
* not end in "FromISR" from an interrupt.
|
||||||
4) Using a queue or semaphore before it has been initialised or
|
* 4) Using a queue or semaphore before it has been initialised or
|
||||||
before the scheduler has been started (are interrupts firing
|
* before the scheduler has been started (are interrupts firing
|
||||||
before vTaskStartScheduler() has been called?).
|
* before vTaskStartScheduler() has been called?).
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */
|
for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */
|
||||||
{
|
{
|
||||||
/* There is nothing to do here, just iterating to the wanted
|
/* There is nothing to do here, just iterating to the wanted
|
||||||
insertion position. */
|
* insertion position. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,7 +173,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
pxIterator->pxNext = pxNewListItem;
|
pxIterator->pxNext = pxNewListItem;
|
||||||
|
|
||||||
/* Remember which list the item is in. This allows fast removal of the
|
/* Remember which list the item is in. This allows fast removal of the
|
||||||
item later. */
|
* item later. */
|
||||||
pxNewListItem->pxContainer = pxList;
|
pxNewListItem->pxContainer = pxList;
|
||||||
|
|
||||||
( pxList->uxNumberOfItems )++;
|
( pxList->uxNumberOfItems )++;
|
||||||
|
@ -170,7 +183,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
|
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
|
||||||
{
|
{
|
||||||
/* The list item knows which list it is in. Obtain the list from the list
|
/* The list item knows which list it is in. Obtain the list from the list
|
||||||
item. */
|
* item. */
|
||||||
List_t * const pxList = pxItemToRemove->pxContainer;
|
List_t * const pxList = pxItemToRemove->pxContainer;
|
||||||
|
|
||||||
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
|
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
|
||||||
|
@ -195,4 +208,3 @@ List_t * const pxList = pxItemToRemove->pxContainer;
|
||||||
return pxList->uxNumberOfItems;
|
return pxList->uxNumberOfItems;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
# * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
# * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
# * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
# * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
# *
|
# *
|
||||||
# * http://www.FreeRTOS.org
|
# * https://www.FreeRTOS.org
|
||||||
# * http://aws.amazon.com/freertos
|
# * https://github.com/FreeRTOS
|
||||||
# *
|
# *
|
||||||
# * 1 tab == 4 spaces!
|
# * 1 tab == 4 spaces!
|
||||||
# */
|
# */
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
||||||
|
@ -74,7 +73,7 @@
|
||||||
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
|
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
|
||||||
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
|
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
|
||||||
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) )
|
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) )
|
||||||
#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
|
#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
|
||||||
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
||||||
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
||||||
#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL )
|
#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL )
|
||||||
|
@ -86,6 +85,7 @@
|
||||||
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* The way the SysTick is clocked is not modified in case it is not the
|
/* The way the SysTick is clocked is not modified in case it is not the
|
||||||
* same a the core. */
|
* same a the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
||||||
|
@ -206,6 +206,7 @@
|
||||||
#define portINITIAL_XPSR ( 0x01000000 )
|
#define portINITIAL_XPSR ( 0x01000000 )
|
||||||
|
|
||||||
#if ( configRUN_FREERTOS_SECURE_ONLY == 1 )
|
#if ( configRUN_FREERTOS_SECURE_ONLY == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initial EXC_RETURN value.
|
* @brief Initial EXC_RETURN value.
|
||||||
*
|
*
|
||||||
|
@ -222,6 +223,7 @@
|
||||||
*/
|
*/
|
||||||
#define portINITIAL_EXC_RETURN ( 0xfffffffd )
|
#define portINITIAL_EXC_RETURN ( 0xfffffffd )
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initial EXC_RETURN value.
|
* @brief Initial EXC_RETURN value.
|
||||||
*
|
*
|
||||||
|
@ -286,6 +288,7 @@
|
||||||
static void prvTaskExitError( void );
|
static void prvTaskExitError( void );
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Setup the Memory Protection Unit (MPU).
|
* @brief Setup the Memory Protection Unit (MPU).
|
||||||
*/
|
*/
|
||||||
|
@ -293,6 +296,7 @@ static void prvTaskExitError( void );
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
#if ( configENABLE_FPU == 1 )
|
#if ( configENABLE_FPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Setup the Floating Point Unit (FPU).
|
* @brief Setup the Floating Point Unit (FPU).
|
||||||
*/
|
*/
|
||||||
|
@ -345,33 +349,35 @@ portDONT_DISCARD void vPortSVCHandler_C( uint32_t *pulCallerStackAddress ) PRIVI
|
||||||
* @brief Each task maintains its own interrupt status in the critical nesting
|
* @brief Each task maintains its own interrupt status in the critical nesting
|
||||||
* variable.
|
* variable.
|
||||||
*/
|
*/
|
||||||
static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Saved as part of the task context to indicate which context the
|
* @brief Saved as part of the task context to indicate which context the
|
||||||
* task is using on the secure side.
|
* task is using on the secure side.
|
||||||
*/
|
*/
|
||||||
portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT;
|
PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT;
|
||||||
#endif /* configENABLE_TRUSTZONE */
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
#if ( configUSE_TICKLESS_IDLE == 1 )
|
#if ( configUSE_TICKLESS_IDLE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The number of SysTick increments that make up one tick period.
|
* @brief The number of SysTick increments that make up one tick period.
|
||||||
*/
|
*/
|
||||||
static uint32_t ulTimerCountsForOneTick = 0;
|
PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The maximum number of tick periods that can be suppressed is
|
* @brief The maximum number of tick periods that can be suppressed is
|
||||||
* limited by the 24 bit resolution of the SysTick timer.
|
* limited by the 24 bit resolution of the SysTick timer.
|
||||||
*/
|
*/
|
||||||
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Compensate for the CPU cycles that pass while the SysTick is
|
* @brief Compensate for the CPU cycles that pass while the SysTick is
|
||||||
* stopped (low power functionality only).
|
* stopped (low power functionality only).
|
||||||
*/
|
*/
|
||||||
static uint32_t ulStoppedTimerCompensation = 0;
|
PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -397,6 +403,7 @@ static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
* tick periods. -1 is used because this code will execute part way
|
* tick periods. -1 is used because this code will execute part way
|
||||||
* through one of the tick periods. */
|
* through one of the tick periods. */
|
||||||
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
||||||
|
|
||||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
if( ulReloadValue > ulStoppedTimerCompensation )
|
||||||
{
|
{
|
||||||
ulReloadValue -= ulStoppedTimerCompensation;
|
ulReloadValue -= ulStoppedTimerCompensation;
|
||||||
|
@ -447,12 +454,14 @@ static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
* so a copy is taken. */
|
* so a copy is taken. */
|
||||||
xModifiableIdleTime = xExpectedIdleTime;
|
xModifiableIdleTime = xExpectedIdleTime;
|
||||||
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||||
|
|
||||||
if( xModifiableIdleTime > 0 )
|
if( xModifiableIdleTime > 0 )
|
||||||
{
|
{
|
||||||
__asm volatile ( "dsb" ::: "memory" );
|
__asm volatile ( "dsb" ::: "memory" );
|
||||||
__asm volatile ( "wfi" );
|
__asm volatile ( "wfi" );
|
||||||
__asm volatile ( "isb" );
|
__asm volatile ( "isb" );
|
||||||
}
|
}
|
||||||
|
|
||||||
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
|
@ -557,7 +566,7 @@ __attribute__(( weak )) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNC
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
|
||||||
/* Configure SysTick to interrupt at the requested rate. */
|
/* Configure SysTick to interrupt at the requested rate. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
||||||
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -591,6 +600,7 @@ volatile uint32_t ulDummy = 0UL;
|
||||||
static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */
|
static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -601,7 +611,7 @@ volatile uint32_t ulDummy = 0UL;
|
||||||
extern uint32_t * __unprivileged_flash_end__;
|
extern uint32_t * __unprivileged_flash_end__;
|
||||||
extern uint32_t * __privileged_sram_start__;
|
extern uint32_t * __privileged_sram_start__;
|
||||||
extern uint32_t * __privileged_sram_end__;
|
extern uint32_t * __privileged_sram_end__;
|
||||||
#else
|
#else /* if defined( __ARMCC_VERSION ) */
|
||||||
/* Declaration when these variable are exported from linker scripts. */
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
extern uint32_t __privileged_functions_start__[];
|
extern uint32_t __privileged_functions_start__[];
|
||||||
extern uint32_t __privileged_functions_end__[];
|
extern uint32_t __privileged_functions_end__[];
|
||||||
|
@ -754,6 +764,7 @@ void vPortSVCHandler_C( uint32_t *pulCallerStackAddress ) /* PRIVILEGED_FUNCTION
|
||||||
{
|
{
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -784,7 +795,7 @@ uint8_t ucSVCNumber;
|
||||||
{
|
{
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
case portSVC_ALLOCATE_SECURE_CONTEXT:
|
case portSVC_ALLOCATE_SECURE_CONTEXT:
|
||||||
{
|
|
||||||
/* R0 contains the stack size passed as parameter to the
|
/* R0 contains the stack size passed as parameter to the
|
||||||
* vPortAllocateSecureContext function. */
|
* vPortAllocateSecureContext function. */
|
||||||
ulR0 = pulCallerStackAddress[ 0 ];
|
ulR0 = pulCallerStackAddress[ 0 ];
|
||||||
|
@ -801,7 +812,7 @@ uint8_t ucSVCNumber;
|
||||||
/* Allocate and load a context for the secure task. */
|
/* Allocate and load a context for the secure task. */
|
||||||
xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged );
|
xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged );
|
||||||
}
|
}
|
||||||
#else
|
#else /* if ( configENABLE_MPU == 1 ) */
|
||||||
{
|
{
|
||||||
/* Allocate and load a context for the secure task. */
|
/* Allocate and load a context for the secure task. */
|
||||||
xSecureContext = SecureContext_AllocateContext( ulR0 );
|
xSecureContext = SecureContext_AllocateContext( ulR0 );
|
||||||
|
@ -810,22 +821,18 @@ uint8_t ucSVCNumber;
|
||||||
|
|
||||||
configASSERT( xSecureContext != NULL );
|
configASSERT( xSecureContext != NULL );
|
||||||
SecureContext_LoadContext( xSecureContext );
|
SecureContext_LoadContext( xSecureContext );
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case portSVC_FREE_SECURE_CONTEXT:
|
case portSVC_FREE_SECURE_CONTEXT:
|
||||||
{
|
|
||||||
/* R0 contains the secure context handle to be freed. */
|
/* R0 contains the secure context handle to be freed. */
|
||||||
ulR0 = pulCallerStackAddress[ 0 ];
|
ulR0 = pulCallerStackAddress[ 0 ];
|
||||||
|
|
||||||
/* Free the secure context. */
|
/* Free the secure context. */
|
||||||
SecureContext_FreeContext( ( SecureContextHandle_t ) ulR0 );
|
SecureContext_FreeContext( ( SecureContextHandle_t ) ulR0 );
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif /* configENABLE_TRUSTZONE */
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
case portSVC_START_SCHEDULER:
|
case portSVC_START_SCHEDULER:
|
||||||
{
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
{
|
{
|
||||||
/* De-prioritize the non-secure exceptions so that the
|
/* De-prioritize the non-secure exceptions so that the
|
||||||
|
@ -847,37 +854,41 @@ uint8_t ucSVCNumber;
|
||||||
/* Setup the context of the first task so that the first task starts
|
/* Setup the context of the first task so that the first task starts
|
||||||
* executing. */
|
* executing. */
|
||||||
vRestoreContextOfFirstTask();
|
vRestoreContextOfFirstTask();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
case portSVC_RAISE_PRIVILEGE:
|
case portSVC_RAISE_PRIVILEGE:
|
||||||
{
|
|
||||||
/* Only raise the privilege, if the svc was raised from any of
|
/* Only raise the privilege, if the svc was raised from any of
|
||||||
* the system calls. */
|
* the system calls. */
|
||||||
if( ulPC >= ( uint32_t ) __syscalls_flash_start__ &&
|
if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||||
ulPC <= ( uint32_t ) __syscalls_flash_end__ )
|
( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) )
|
||||||
{
|
{
|
||||||
vRaisePrivilege();
|
vRaisePrivilege();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
|
||||||
/* Incorrect SVC call. */
|
/* Incorrect SVC call. */
|
||||||
configASSERT( pdFALSE );
|
configASSERT( pdFALSE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
/* *INDENT-OFF* */
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
StackType_t * pxEndOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters,
|
||||||
|
BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */
|
||||||
#else
|
#else
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) /* PRIVILEGED_FUNCTION */
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
StackType_t * pxEndOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters ) /* PRIVILEGED_FUNCTION */
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
/* *INDENT-ON* */
|
||||||
{
|
{
|
||||||
/* Simulate the stack frame as it would be created by a context switch
|
/* Simulate the stack frame as it would be created by a context switch
|
||||||
* interrupt. */
|
* interrupt. */
|
||||||
|
@ -897,6 +908,7 @@ uint8_t ucSVCNumber;
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
{
|
{
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
||||||
if( xRunPrivileged == pdTRUE )
|
if( xRunPrivileged == pdTRUE )
|
||||||
{
|
{
|
||||||
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
||||||
|
@ -958,6 +970,7 @@ uint8_t ucSVCNumber;
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
{
|
{
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
||||||
if( xRunPrivileged == pdTRUE )
|
if( xRunPrivileged == pdTRUE )
|
||||||
{
|
{
|
||||||
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
||||||
|
@ -988,8 +1001,8 @@ uint8_t ucSVCNumber;
|
||||||
BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
/* Make PendSV, CallSV and SysTick the same priority as the kernel. */
|
/* Make PendSV, CallSV and SysTick the same priority as the kernel. */
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
{
|
{
|
||||||
|
@ -1031,11 +1044,26 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth )
|
void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,
|
||||||
|
const struct xMEMORY_REGION * const xRegions,
|
||||||
|
StackType_t * pxBottomOfStack,
|
||||||
|
uint32_t ulStackDepth )
|
||||||
{
|
{
|
||||||
uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber;
|
uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber;
|
||||||
int32_t lIndex = 0;
|
int32_t lIndex = 0;
|
||||||
|
|
||||||
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
|
/* Declaration when these variable are defined in code instead of being
|
||||||
|
* exported from linker scripts. */
|
||||||
|
extern uint32_t * __privileged_sram_start__;
|
||||||
|
extern uint32_t * __privileged_sram_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __privileged_sram_start__[];
|
||||||
|
extern uint32_t __privileged_sram_end__[];
|
||||||
|
#endif /* defined( __ARMCC_VERSION ) */
|
||||||
|
|
||||||
/* Setup MAIR0. */
|
/* Setup MAIR0. */
|
||||||
xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK );
|
xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK );
|
||||||
xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK );
|
xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK );
|
||||||
|
@ -1046,9 +1074,23 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
* the stack region has already been configured. */
|
* the stack region has already been configured. */
|
||||||
if( ulStackDepth > 0 )
|
if( ulStackDepth > 0 )
|
||||||
{
|
{
|
||||||
/* Define the region that allows access to the stack. */
|
ulRegionStartAddress = ( uint32_t ) pxBottomOfStack;
|
||||||
ulRegionStartAddress = ( ( uint32_t ) pxBottomOfStack ) & portMPU_RBAR_ADDRESS_MASK;
|
|
||||||
ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1;
|
ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1;
|
||||||
|
|
||||||
|
/* If the stack is within the privileged SRAM, do not protect it
|
||||||
|
* using a separate MPU region. This is needed because privileged
|
||||||
|
* SRAM is already protected using an MPU region and ARMv8-M does
|
||||||
|
* not allow overlapping MPU regions. */
|
||||||
|
if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) &&
|
||||||
|
( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) )
|
||||||
|
{
|
||||||
|
xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0;
|
||||||
|
xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Define the region that allows access to the stack. */
|
||||||
|
ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK;
|
||||||
ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK;
|
ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK;
|
||||||
|
|
||||||
xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) |
|
xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) |
|
||||||
|
@ -1060,6 +1102,7 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
( portMPU_RLAR_ATTR_INDEX0 ) |
|
( portMPU_RLAR_ATTR_INDEX0 ) |
|
||||||
( portMPU_RLAR_REGION_ENABLE );
|
( portMPU_RLAR_REGION_ENABLE );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* User supplied configurable regions. */
|
/* User supplied configurable regions. */
|
||||||
for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ )
|
for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ )
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -244,6 +244,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate a secure context for the task.
|
* @brief Allocate a secure context for the task.
|
||||||
*
|
*
|
||||||
|
@ -269,6 +270,7 @@ typedef struct MPU_SETTINGS
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks whether or not the processor is privileged.
|
* @brief Checks whether or not the processor is privileged.
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -96,7 +96,8 @@ secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged )
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
|
||||||
|
uint32_t ulIsTaskPrivileged )
|
||||||
#else /* configENABLE_MPU */
|
#else /* configENABLE_MPU */
|
||||||
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize )
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize )
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
@ -104,6 +105,7 @@ secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
|
||||||
uint8_t * pucStackMemory = NULL;
|
uint8_t * pucStackMemory = NULL;
|
||||||
uint32_t ulIPSR;
|
uint32_t ulIPSR;
|
||||||
SecureContextHandle_t xSecureContextHandle = NULL;
|
SecureContextHandle_t xSecureContextHandle = NULL;
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
uint32_t * pulCurrentStackPointer = NULL;
|
uint32_t * pulCurrentStackPointer = NULL;
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
@ -144,6 +146,7 @@ secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
|
||||||
* context switch. */
|
* context switch. */
|
||||||
pulCurrentStackPointer = ( uint32_t * ) xSecureContextHandle->pucStackStart;
|
pulCurrentStackPointer = ( uint32_t * ) xSecureContextHandle->pucStackStart;
|
||||||
pulCurrentStackPointer--;
|
pulCurrentStackPointer--;
|
||||||
|
|
||||||
if( ulIsTaskPrivileged )
|
if( ulIsTaskPrivileged )
|
||||||
{
|
{
|
||||||
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
|
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
|
||||||
|
@ -162,7 +165,6 @@ secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
|
||||||
/* Current SP is set to the starting of the stack. This
|
/* Current SP is set to the starting of the stack. This
|
||||||
* value programmed in the PSP register on context switch. */
|
* value programmed in the PSP register on context switch. */
|
||||||
xSecureContextHandle->pucCurrentStackPointer = xSecureContextHandle->pucStackStart;
|
xSecureContextHandle->pucCurrentStackPointer = xSecureContextHandle->pucStackStart;
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -70,7 +70,8 @@ void SecureContext_Init( void );
|
||||||
* otherwise.
|
* otherwise.
|
||||||
*/
|
*/
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged );
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize,
|
||||||
|
uint32_t ulIsTaskPrivileged );
|
||||||
#else /* configENABLE_MPU */
|
#else /* configENABLE_MPU */
|
||||||
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize );
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize );
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -63,6 +63,7 @@
|
||||||
|
|
||||||
/* Allocate the memory for the heap. */
|
/* Allocate the memory for the heap. */
|
||||||
#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )
|
#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )
|
||||||
|
|
||||||
/* The application writer has already defined the array used for the RTOS
|
/* The application writer has already defined the array used for the RTOS
|
||||||
* heap - probably so it can be placed in a special segment or address. */
|
* heap - probably so it can be placed in a special segment or address. */
|
||||||
extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
||||||
|
@ -191,6 +192,7 @@ uint8_t *puc;
|
||||||
/* Do the block being inserted, and the block it is being inserted after
|
/* Do the block being inserted, and the block it is being inserted after
|
||||||
* make a contiguous block of memory? */
|
* make a contiguous block of memory? */
|
||||||
puc = ( uint8_t * ) pxIterator;
|
puc = ( uint8_t * ) pxIterator;
|
||||||
|
|
||||||
if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
|
if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
|
||||||
{
|
{
|
||||||
pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
|
pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
|
||||||
|
@ -204,6 +206,7 @@ uint8_t *puc;
|
||||||
/* Do the block being inserted, and the block it is being inserted before
|
/* Do the block being inserted, and the block it is being inserted before
|
||||||
* make a contiguous block of memory? */
|
* make a contiguous block of memory? */
|
||||||
puc = ( uint8_t * ) pxBlockToInsert;
|
puc = ( uint8_t * ) pxBlockToInsert;
|
||||||
|
|
||||||
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
|
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
|
||||||
{
|
{
|
||||||
if( pxIterator->pxNextFreeBlock != pxEnd )
|
if( pxIterator->pxNextFreeBlock != pxEnd )
|
||||||
|
@ -289,6 +292,7 @@ void *pvReturn = NULL;
|
||||||
* one of adequate size is found. */
|
* one of adequate size is found. */
|
||||||
pxPreviousBlock = &xStart;
|
pxPreviousBlock = &xStart;
|
||||||
pxBlock = xStart.pxNextFreeBlock;
|
pxBlock = xStart.pxNextFreeBlock;
|
||||||
|
|
||||||
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
|
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
|
||||||
{
|
{
|
||||||
pxPreviousBlock = pxBlock;
|
pxPreviousBlock = pxBlock;
|
||||||
|
@ -376,7 +380,7 @@ void *pvReturn = NULL;
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */
|
||||||
|
|
||||||
secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
return pvReturn;
|
return pvReturn;
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -127,7 +127,7 @@
|
||||||
{ \
|
{ \
|
||||||
secureportDISABLE_SECURE_INTERRUPTS(); \
|
secureportDISABLE_SECURE_INTERRUPTS(); \
|
||||||
secureportDISABLE_NON_SECURE_INTERRUPTS(); \
|
secureportDISABLE_NON_SECURE_INTERRUPTS(); \
|
||||||
for( ;; ); \
|
for( ; ; ) {; } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __SECURE_PORT_MACROS_H__ */
|
#endif /* __SECURE_PORT_MACROS_H__ */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,14 +19,13 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* Implementation of functions defined in portable.h for the ARM CM4F port.
|
* Implementation of functions defined in portable.h for the ARM CM3 port.
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Scheduler includes. */
|
/* Scheduler includes. */
|
||||||
|
@ -34,7 +33,7 @@
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
|
#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
|
||||||
#error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
|
#error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configSYSTICK_CLOCK_HZ
|
#ifndef configSYSTICK_CLOCK_HZ
|
||||||
|
@ -42,8 +41,9 @@
|
||||||
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* The way the SysTick is clocked is not modified in case it is not the same
|
/* The way the SysTick is clocked is not modified in case it is not the same
|
||||||
as the core. */
|
* as the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
|
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
|
||||||
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
|
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
|
||||||
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) )
|
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) )
|
||||||
#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
|
#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
|
||||||
/* ...then bits in the registers. */
|
/* ...then bits in the registers. */
|
||||||
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
||||||
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
@ -82,12 +82,12 @@
|
||||||
#define portMAX_24_BIT_NUMBER ( 0xffffffUL )
|
#define portMAX_24_BIT_NUMBER ( 0xffffffUL )
|
||||||
|
|
||||||
/* A fiddle factor to estimate the number of SysTick counts that would have
|
/* A fiddle factor to estimate the number of SysTick counts that would have
|
||||||
occurred while the SysTick counter is stopped during tickless idle
|
* occurred while the SysTick counter is stopped during tickless idle
|
||||||
calculations. */
|
* calculations. */
|
||||||
#define portMISSED_COUNTS_FACTOR ( 45UL )
|
#define portMISSED_COUNTS_FACTOR ( 45UL )
|
||||||
|
|
||||||
/* For strict compliance with the Cortex-M spec the task start address should
|
/* For strict compliance with the Cortex-M spec the task start address should
|
||||||
have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
|
* have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
|
||||||
#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL )
|
#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -115,11 +115,11 @@ static void prvTaskExitError( void );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY
|
/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY
|
||||||
setting. */
|
* setting. */
|
||||||
const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY;
|
const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY;
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
/* Each task maintains its own interrupt status in the critical nesting
|
||||||
variable. */
|
* variable. */
|
||||||
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -166,10 +166,10 @@ StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
void * pvParameters )
|
void * pvParameters )
|
||||||
{
|
{
|
||||||
/* Simulate the stack frame as it would be created by a context switch
|
/* Simulate the stack frame as it would be created by a context switch
|
||||||
interrupt. */
|
* interrupt. */
|
||||||
|
|
||||||
/* Offset added to account for the way the MCU uses the stack on entry/exit
|
/* Offset added to account for the way the MCU uses the stack on entry/exit
|
||||||
of interrupts, and to ensure alignment. */
|
* of interrupts, and to ensure alignment. */
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
||||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
||||||
|
@ -191,14 +191,17 @@ StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
static void prvTaskExitError( void )
|
static void prvTaskExitError( void )
|
||||||
{
|
{
|
||||||
/* A function that implements a task must not exit or attempt to return to
|
/* A function that implements a task must not exit or attempt to return to
|
||||||
its caller as there is nothing to return to. If a task wants to exit it
|
* its caller as there is nothing to return to. If a task wants to exit it
|
||||||
should instead call vTaskDelete( NULL ).
|
* should instead call vTaskDelete( NULL ).
|
||||||
|
*
|
||||||
Artificially force an assert() to be triggered if configASSERT() is
|
* Artificially force an assert() to be triggered if configASSERT() is
|
||||||
defined, then stop here so application writers can catch the error. */
|
* defined, then stop here so application writers can catch the error. */
|
||||||
configASSERT( uxCriticalNesting == ~0UL );
|
configASSERT( uxCriticalNesting == ~0UL );
|
||||||
portDISABLE_INTERRUPTS();
|
portDISABLE_INTERRUPTS();
|
||||||
for( ;; );
|
|
||||||
|
for( ; ; )
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -214,15 +217,15 @@ BaseType_t xPortStartScheduler( void )
|
||||||
volatile uint8_t ucMaxPriorityValue;
|
volatile uint8_t ucMaxPriorityValue;
|
||||||
|
|
||||||
/* Determine the maximum priority from which ISR safe FreeRTOS API
|
/* Determine the maximum priority from which ISR safe FreeRTOS API
|
||||||
functions can be called. ISR safe functions are those that end in
|
* functions can be called. ISR safe functions are those that end in
|
||||||
"FromISR". FreeRTOS maintains separate thread and ISR API functions to
|
* "FromISR". FreeRTOS maintains separate thread and ISR API functions to
|
||||||
ensure interrupt entry is as fast and simple as possible.
|
* ensure interrupt entry is as fast and simple as possible.
|
||||||
|
*
|
||||||
Save the interrupt priority value that is about to be clobbered. */
|
* Save the interrupt priority value that is about to be clobbered. */
|
||||||
ulOriginalPriority = *pucFirstUserPriorityRegister;
|
ulOriginalPriority = *pucFirstUserPriorityRegister;
|
||||||
|
|
||||||
/* Determine the number of priority bits available. First write to all
|
/* Determine the number of priority bits available. First write to all
|
||||||
possible bits. */
|
* possible bits. */
|
||||||
*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
|
*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
|
||||||
|
|
||||||
/* Read the value back to see how many bits stuck. */
|
/* Read the value back to see how many bits stuck. */
|
||||||
|
@ -232,8 +235,9 @@ BaseType_t xPortStartScheduler( void )
|
||||||
ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
|
ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
|
||||||
|
|
||||||
/* Calculate the maximum acceptable priority group value for the number
|
/* Calculate the maximum acceptable priority group value for the number
|
||||||
of bits read back. */
|
* of bits read back. */
|
||||||
ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
|
ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
|
||||||
|
|
||||||
while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
|
while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
|
||||||
{
|
{
|
||||||
ulMaxPRIGROUPValue--;
|
ulMaxPRIGROUPValue--;
|
||||||
|
@ -243,8 +247,8 @@ BaseType_t xPortStartScheduler( void )
|
||||||
#ifdef __NVIC_PRIO_BITS
|
#ifdef __NVIC_PRIO_BITS
|
||||||
{
|
{
|
||||||
/* Check the CMSIS configuration that defines the number of
|
/* Check the CMSIS configuration that defines the number of
|
||||||
priority bits matches the number of priority bits actually queried
|
* priority bits matches the number of priority bits actually queried
|
||||||
from the hardware. */
|
* from the hardware. */
|
||||||
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -252,29 +256,29 @@ BaseType_t xPortStartScheduler( void )
|
||||||
#ifdef configPRIO_BITS
|
#ifdef configPRIO_BITS
|
||||||
{
|
{
|
||||||
/* Check the FreeRTOS configuration that defines the number of
|
/* Check the FreeRTOS configuration that defines the number of
|
||||||
priority bits matches the number of priority bits actually queried
|
* priority bits matches the number of priority bits actually queried
|
||||||
from the hardware. */
|
* from the hardware. */
|
||||||
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Shift the priority group value back to its position within the AIRCR
|
/* Shift the priority group value back to its position within the AIRCR
|
||||||
register. */
|
* register. */
|
||||||
ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
|
ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
|
||||||
ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
|
ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
|
||||||
|
|
||||||
/* Restore the clobbered interrupt priority register to its original
|
/* Restore the clobbered interrupt priority register to its original
|
||||||
value. */
|
* value. */
|
||||||
*pucFirstUserPriorityRegister = ulOriginalPriority;
|
*pucFirstUserPriorityRegister = ulOriginalPriority;
|
||||||
}
|
}
|
||||||
#endif /* conifgASSERT_DEFINED */
|
#endif /* conifgASSERT_DEFINED */
|
||||||
|
|
||||||
/* Make PendSV and SysTick the lowest priority interrupts. */
|
/* Make PendSV and SysTick the lowest priority interrupts. */
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
|
|
||||||
/* Start the timer that generates the tick ISR. Interrupts are disabled
|
/* Start the timer that generates the tick ISR. Interrupts are disabled
|
||||||
here already. */
|
* here already. */
|
||||||
vPortSetupTimerInterrupt();
|
vPortSetupTimerInterrupt();
|
||||||
|
|
||||||
/* Initialise the critical nesting count ready for the first task. */
|
/* Initialise the critical nesting count ready for the first task. */
|
||||||
|
@ -291,7 +295,7 @@ BaseType_t xPortStartScheduler( void )
|
||||||
void vPortEndScheduler( void )
|
void vPortEndScheduler( void )
|
||||||
{
|
{
|
||||||
/* Not implemented in ports where there is nothing to return to.
|
/* Not implemented in ports where there is nothing to return to.
|
||||||
Artificially force an assert. */
|
* Artificially force an assert. */
|
||||||
configASSERT( uxCriticalNesting == 1000UL );
|
configASSERT( uxCriticalNesting == 1000UL );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -302,10 +306,10 @@ void vPortEnterCritical( void )
|
||||||
uxCriticalNesting++;
|
uxCriticalNesting++;
|
||||||
|
|
||||||
/* This is not the interrupt safe version of the enter critical function so
|
/* This is not the interrupt safe version of the enter critical function so
|
||||||
assert() if it is being called from an interrupt context. Only API
|
* assert() if it is being called from an interrupt context. Only API
|
||||||
functions that end in "FromISR" can be used in an interrupt. Only assert if
|
* functions that end in "FromISR" can be used in an interrupt. Only assert if
|
||||||
the critical nesting count is 1 to protect against recursive calls if the
|
* the critical nesting count is 1 to protect against recursive calls if the
|
||||||
assert function also uses a critical section. */
|
* assert function also uses a critical section. */
|
||||||
if( uxCriticalNesting == 1 )
|
if( uxCriticalNesting == 1 )
|
||||||
{
|
{
|
||||||
configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
|
configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
|
||||||
|
@ -317,6 +321,7 @@ void vPortExitCritical( void )
|
||||||
{
|
{
|
||||||
configASSERT( uxCriticalNesting );
|
configASSERT( uxCriticalNesting );
|
||||||
uxCriticalNesting--;
|
uxCriticalNesting--;
|
||||||
|
|
||||||
if( uxCriticalNesting == 0 )
|
if( uxCriticalNesting == 0 )
|
||||||
{
|
{
|
||||||
portENABLE_INTERRUPTS();
|
portENABLE_INTERRUPTS();
|
||||||
|
@ -327,16 +332,16 @@ void vPortExitCritical( void )
|
||||||
void xPortSysTickHandler( void )
|
void xPortSysTickHandler( void )
|
||||||
{
|
{
|
||||||
/* The SysTick runs at the lowest interrupt priority, so when this interrupt
|
/* The SysTick runs at the lowest interrupt priority, so when this interrupt
|
||||||
executes all interrupts must be unmasked. There is therefore no need to
|
* executes all interrupts must be unmasked. There is therefore no need to
|
||||||
save and then restore the interrupt mask value as its value is already
|
* save and then restore the interrupt mask value as its value is already
|
||||||
known. */
|
* known. */
|
||||||
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
|
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
|
||||||
{
|
{
|
||||||
/* Increment the RTOS tick. */
|
/* Increment the RTOS tick. */
|
||||||
if( xTaskIncrementTick() != pdFALSE )
|
if( xTaskIncrementTick() != pdFALSE )
|
||||||
{
|
{
|
||||||
/* A context switch is required. Context switching is performed in
|
/* A context switch is required. Context switching is performed in
|
||||||
the PendSV interrupt. Pend the PendSV interrupt. */
|
* the PendSV interrupt. Pend the PendSV interrupt. */
|
||||||
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -359,44 +364,44 @@ void xPortSysTickHandler( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stop the SysTick momentarily. The time the SysTick is stopped for
|
/* Stop the SysTick momentarily. The time the SysTick is stopped for
|
||||||
is accounted for as best it can be, but using the tickless mode will
|
* is accounted for as best it can be, but using the tickless mode will
|
||||||
inevitably result in some tiny drift of the time maintained by the
|
* inevitably result in some tiny drift of the time maintained by the
|
||||||
kernel with respect to calendar time. */
|
* kernel with respect to calendar time. */
|
||||||
portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
/* Calculate the reload value required to wait xExpectedIdleTime
|
/* Calculate the reload value required to wait xExpectedIdleTime
|
||||||
tick periods. -1 is used because this code will execute part way
|
* tick periods. -1 is used because this code will execute part way
|
||||||
through one of the tick periods. */
|
* through one of the tick periods. */
|
||||||
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
||||||
|
|
||||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
if( ulReloadValue > ulStoppedTimerCompensation )
|
||||||
{
|
{
|
||||||
ulReloadValue -= ulStoppedTimerCompensation;
|
ulReloadValue -= ulStoppedTimerCompensation;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
||||||
method as that will mask interrupts that should exit sleep mode. */
|
* method as that will mask interrupts that should exit sleep mode. */
|
||||||
__asm( " cpsid i");
|
__asm( " cpsid i");
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
|
|
||||||
|
|
||||||
/* If a context switch is pending or a task is waiting for the scheduler
|
/* If a context switch is pending or a task is waiting for the scheduler
|
||||||
to be unsuspended then abandon the low power entry. */
|
* to be unsuspended then abandon the low power entry. */
|
||||||
if( eTaskConfirmSleepModeStatus() == eAbortSleep )
|
if( eTaskConfirmSleepModeStatus() == eAbortSleep )
|
||||||
{
|
{
|
||||||
/* Restart from whatever is left in the count register to complete
|
/* Restart from whatever is left in the count register to complete
|
||||||
this tick period. */
|
* this tick period. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
||||||
|
|
||||||
/* Restart SysTick. */
|
/* Restart SysTick. */
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
/* Reset the reload register to the value required for normal tick
|
/* Reset the reload register to the value required for normal tick
|
||||||
periods. */
|
* periods. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above __disable_interrupt()
|
/* Re-enable interrupts - see comments above __disable_interrupt()
|
||||||
call above. */
|
* call above. */
|
||||||
__asm( " cpsie i");
|
__asm( " cpsie i");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -405,69 +410,71 @@ void xPortSysTickHandler( void )
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
|
portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
|
||||||
|
|
||||||
/* Clear the SysTick count flag and set the count value back to
|
/* Clear the SysTick count flag and set the count value back to
|
||||||
zero. */
|
* zero. */
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
|
||||||
/* Restart SysTick. */
|
/* Restart SysTick. */
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
/* Sleep until something happens. configPRE_SLEEP_PROCESSING() can
|
/* Sleep until something happens. configPRE_SLEEP_PROCESSING() can
|
||||||
set its parameter to 0 to indicate that its implementation contains
|
* set its parameter to 0 to indicate that its implementation contains
|
||||||
its own wait for interrupt or wait for event instruction, and so wfi
|
* its own wait for interrupt or wait for event instruction, and so wfi
|
||||||
should not be executed again. However, the original expected idle
|
* should not be executed again. However, the original expected idle
|
||||||
time variable must remain unmodified, so a copy is taken. */
|
* time variable must remain unmodified, so a copy is taken. */
|
||||||
xModifiableIdleTime = xExpectedIdleTime;
|
xModifiableIdleTime = xExpectedIdleTime;
|
||||||
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||||
|
|
||||||
if( xModifiableIdleTime > 0 )
|
if( xModifiableIdleTime > 0 )
|
||||||
{
|
{
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " wfi");
|
__asm( " wfi");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
}
|
}
|
||||||
|
|
||||||
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
out of sleep mode to execute immediately. see comments above
|
* out of sleep mode to execute immediately. see comments above
|
||||||
__disable_interrupt() call above. */
|
* __disable_interrupt() call above. */
|
||||||
__asm( " cpsie i");
|
__asm( " cpsie i");
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
|
|
||||||
/* Disable interrupts again because the clock is about to be stopped
|
/* Disable interrupts again because the clock is about to be stopped
|
||||||
and interrupts that execute while the clock is stopped will increase
|
* and interrupts that execute while the clock is stopped will increase
|
||||||
any slippage between the time maintained by the RTOS and calendar
|
* any slippage between the time maintained by the RTOS and calendar
|
||||||
time. */
|
* time. */
|
||||||
__asm( " cpsid i");
|
__asm( " cpsid i");
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
|
|
||||||
/* Disable the SysTick clock without reading the
|
/* Disable the SysTick clock without reading the
|
||||||
portNVIC_SYSTICK_CTRL_REG register to ensure the
|
* portNVIC_SYSTICK_CTRL_REG register to ensure the
|
||||||
portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again,
|
* portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again,
|
||||||
the time the SysTick is stopped for is accounted for as best it can
|
* the time the SysTick is stopped for is accounted for as best it can
|
||||||
be, but using the tickless mode will inevitably result in some tiny
|
* be, but using the tickless mode will inevitably result in some tiny
|
||||||
drift of the time maintained by the kernel with respect to calendar
|
* drift of the time maintained by the kernel with respect to calendar
|
||||||
time*/
|
* time*/
|
||||||
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );
|
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );
|
||||||
|
|
||||||
/* Determine if the SysTick clock has already counted to zero and
|
/* Determine if the SysTick clock has already counted to zero and
|
||||||
been set back to the current reload value (the reload back being
|
* been set back to the current reload value (the reload back being
|
||||||
correct for the entire expected idle time) or if the SysTick is yet
|
* correct for the entire expected idle time) or if the SysTick is yet
|
||||||
to count to zero (in which case an interrupt other than the SysTick
|
* to count to zero (in which case an interrupt other than the SysTick
|
||||||
must have brought the system out of sleep mode). */
|
* must have brought the system out of sleep mode). */
|
||||||
if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
||||||
{
|
{
|
||||||
uint32_t ulCalculatedLoadValue;
|
uint32_t ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* The tick interrupt is already pending, and the SysTick count
|
/* The tick interrupt is already pending, and the SysTick count
|
||||||
reloaded with ulReloadValue. Reset the
|
* reloaded with ulReloadValue. Reset the
|
||||||
portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
* portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
||||||
period. */
|
* period. */
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
||||||
|
|
||||||
/* Don't allow a tiny value, or values that have somehow
|
/* Don't allow a tiny value, or values that have somehow
|
||||||
underflowed because the post sleep hook did something
|
* underflowed because the post sleep hook did something
|
||||||
that took too long. */
|
* that took too long. */
|
||||||
if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
|
if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
|
||||||
{
|
{
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
||||||
|
@ -476,30 +483,30 @@ void xPortSysTickHandler( void )
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* As the pending tick will be processed as soon as this
|
/* As the pending tick will be processed as soon as this
|
||||||
function exits, the tick value maintained by the tick is stepped
|
* function exits, the tick value maintained by the tick is stepped
|
||||||
forward by one less than the time spent waiting. */
|
* forward by one less than the time spent waiting. */
|
||||||
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Something other than the tick interrupt ended the sleep.
|
/* Something other than the tick interrupt ended the sleep.
|
||||||
Work out how long the sleep lasted rounded to complete tick
|
* Work out how long the sleep lasted rounded to complete tick
|
||||||
periods (not the ulReload value which accounted for part
|
* periods (not the ulReload value which accounted for part
|
||||||
ticks). */
|
* ticks). */
|
||||||
ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
||||||
|
|
||||||
/* How many complete tick periods passed while the processor
|
/* How many complete tick periods passed while the processor
|
||||||
was waiting? */
|
* was waiting? */
|
||||||
ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
|
ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
|
||||||
|
|
||||||
/* The reload value is set to whatever fraction of a single tick
|
/* The reload value is set to whatever fraction of a single tick
|
||||||
period remains. */
|
* period remains. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
||||||
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
* again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
||||||
value. */
|
* value. */
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
|
@ -556,66 +563,45 @@ void vPortSetupTimerInterrupt( void )
|
||||||
ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
|
ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
|
||||||
|
|
||||||
/* The following assertion will fail if a service routine (ISR) for
|
/* The following assertion will fail if a service routine (ISR) for
|
||||||
an interrupt that has been assigned a priority above
|
* an interrupt that has been assigned a priority above
|
||||||
configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
|
* configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
|
||||||
function. ISR safe FreeRTOS API functions must *only* be called
|
* function. ISR safe FreeRTOS API functions must *only* be called
|
||||||
from interrupts that have been assigned a priority at or below
|
* from interrupts that have been assigned a priority at or below
|
||||||
configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
* configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
||||||
|
*
|
||||||
Numerically low interrupt priority numbers represent logically high
|
* Numerically low interrupt priority numbers represent logically high
|
||||||
interrupt priorities, therefore the priority of the interrupt must
|
* interrupt priorities, therefore the priority of the interrupt must
|
||||||
be set to a value equal to or numerically *higher* than
|
* be set to a value equal to or numerically *higher* than
|
||||||
configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
* configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
||||||
|
*
|
||||||
Interrupts that use the FreeRTOS API must not be left at their
|
* Interrupts that use the FreeRTOS API must not be left at their
|
||||||
default priority of zero as that is the highest possible priority,
|
* default priority of zero as that is the highest possible priority,
|
||||||
which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
|
* which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
|
||||||
and therefore also guaranteed to be invalid.
|
* and therefore also guaranteed to be invalid.
|
||||||
|
*
|
||||||
FreeRTOS maintains separate thread and ISR API functions to ensure
|
* FreeRTOS maintains separate thread and ISR API functions to ensure
|
||||||
interrupt entry is as fast and simple as possible.
|
* interrupt entry is as fast and simple as possible.
|
||||||
|
*
|
||||||
The following links provide detailed information:
|
* The following links provide detailed information:
|
||||||
http://www.freertos.org/RTOS-Cortex-M3-M4.html
|
* https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
|
||||||
http://www.freertos.org/FAQHelp.html */
|
* https://www.FreeRTOS.org/FAQHelp.html */
|
||||||
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
|
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Priority grouping: The interrupt controller (NVIC) allows the bits
|
/* Priority grouping: The interrupt controller (NVIC) allows the bits
|
||||||
that define each interrupt's priority to be split between bits that
|
* that define each interrupt's priority to be split between bits that
|
||||||
define the interrupt's pre-emption priority bits and bits that define
|
* define the interrupt's pre-emption priority bits and bits that define
|
||||||
the interrupt's sub-priority. For simplicity all bits must be defined
|
* the interrupt's sub-priority. For simplicity all bits must be defined
|
||||||
to be pre-emption priority bits. The following assertion will fail if
|
* to be pre-emption priority bits. The following assertion will fail if
|
||||||
this is not the case (if some bits represent a sub-priority).
|
* this is not the case (if some bits represent a sub-priority).
|
||||||
|
*
|
||||||
If the application only uses CMSIS libraries for interrupt
|
* If the application only uses CMSIS libraries for interrupt
|
||||||
configuration then the correct setting can be achieved on all Cortex-M
|
* configuration then the correct setting can be achieved on all Cortex-M
|
||||||
devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
|
* devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
|
||||||
scheduler. Note however that some vendor specific peripheral libraries
|
* scheduler. Note however that some vendor specific peripheral libraries
|
||||||
assume a non-zero priority group setting, in which cases using a value
|
* assume a non-zero priority group setting, in which cases using a value
|
||||||
of zero will result in unpredictable behaviour. */
|
* of zero will result in unpredictable behaviour. */
|
||||||
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configASSERT_DEFINED */
|
#endif /* configASSERT_DEFINED */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
; *
|
; *
|
||||||
; * http://www.FreeRTOS.org
|
; * https://www.FreeRTOS.org
|
||||||
; * http://aws.amazon.com/freertos
|
; * https://github.com/FreeRTOS
|
||||||
; *
|
; *
|
||||||
; * 1 tab == 4 spaces!
|
; * 1 tab == 4 spaces!
|
||||||
; */
|
; */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -64,7 +64,7 @@ typedef unsigned long UBaseType_t;
|
||||||
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
||||||
|
|
||||||
/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
|
/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
|
||||||
not need to be guarded with a critical section. */
|
* not need to be guarded with a critical section. */
|
||||||
#define portTICK_TYPE_IS_ATOMIC 1
|
#define portTICK_TYPE_IS_ATOMIC 1
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -147,8 +147,8 @@ extern void vPortExitCritical( void );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. These are
|
/* Task function macros as described on the FreeRTOS.org WEB site. These are
|
||||||
not necessary for to use this port. They are defined so the common demo files
|
* not necessary for to use this port. They are defined so the common demo files
|
||||||
(which build with all the ports) will build. */
|
* (which build with all the ports) will build. */
|
||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
||||||
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -168,4 +168,3 @@ not necessary for to use this port. They are defined so the common demo files
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* PORTMACRO_H */
|
#endif /* PORTMACRO_H */
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
|
@ -38,7 +37,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
|
#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 )
|
||||||
#error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
|
#error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configSYSTICK_CLOCK_HZ
|
#ifndef configSYSTICK_CLOCK_HZ
|
||||||
|
@ -46,8 +45,9 @@
|
||||||
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* The way the SysTick is clocked is not modified in case it is not the same
|
/* The way the SysTick is clocked is not modified in case it is not the same
|
||||||
as the core. */
|
* as the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
|
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
|
||||||
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
|
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
|
||||||
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) )
|
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) )
|
||||||
#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
|
#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
|
||||||
/* ...then bits in the registers. */
|
/* ...then bits in the registers. */
|
||||||
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
||||||
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
@ -91,12 +91,12 @@
|
||||||
#define portMAX_24_BIT_NUMBER ( 0xffffffUL )
|
#define portMAX_24_BIT_NUMBER ( 0xffffffUL )
|
||||||
|
|
||||||
/* A fiddle factor to estimate the number of SysTick counts that would have
|
/* A fiddle factor to estimate the number of SysTick counts that would have
|
||||||
occurred while the SysTick counter is stopped during tickless idle
|
* occurred while the SysTick counter is stopped during tickless idle
|
||||||
calculations. */
|
* calculations. */
|
||||||
#define portMISSED_COUNTS_FACTOR ( 45UL )
|
#define portMISSED_COUNTS_FACTOR ( 45UL )
|
||||||
|
|
||||||
/* For strict compliance with the Cortex-M spec the task start address should
|
/* For strict compliance with the Cortex-M spec the task start address should
|
||||||
have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
|
* have bit-0 clear, as it is loaded into the PC on exit from an ISR. */
|
||||||
#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL )
|
#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -129,11 +129,11 @@ static void prvTaskExitError( void );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY
|
/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY
|
||||||
setting. */
|
* setting. */
|
||||||
const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY;
|
const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY;
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
/* Each task maintains its own interrupt status in the critical nesting
|
||||||
variable. */
|
* variable. */
|
||||||
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -175,13 +175,15 @@ static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
/*
|
/*
|
||||||
* See header file for description.
|
* See header file for description.
|
||||||
*/
|
*/
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters )
|
||||||
{
|
{
|
||||||
/* Simulate the stack frame as it would be created by a context switch
|
/* Simulate the stack frame as it would be created by a context switch
|
||||||
interrupt. */
|
* interrupt. */
|
||||||
|
|
||||||
/* Offset added to account for the way the MCU uses the stack on entry/exit
|
/* Offset added to account for the way the MCU uses the stack on entry/exit
|
||||||
of interrupts, and to ensure alignment. */
|
* of interrupts, and to ensure alignment. */
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
||||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
||||||
|
@ -195,7 +197,7 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
|
||||||
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
|
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
|
||||||
|
|
||||||
/* A save method is being used that requires each task to maintain its
|
/* A save method is being used that requires each task to maintain its
|
||||||
own exec return value. */
|
* own exec return value. */
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
*pxTopOfStack = portINITIAL_EXC_RETURN;
|
*pxTopOfStack = portINITIAL_EXC_RETURN;
|
||||||
|
|
||||||
|
@ -208,14 +210,17 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
|
||||||
static void prvTaskExitError( void )
|
static void prvTaskExitError( void )
|
||||||
{
|
{
|
||||||
/* A function that implements a task must not exit or attempt to return to
|
/* A function that implements a task must not exit or attempt to return to
|
||||||
its caller as there is nothing to return to. If a task wants to exit it
|
* its caller as there is nothing to return to. If a task wants to exit it
|
||||||
should instead call vTaskDelete( NULL ).
|
* should instead call vTaskDelete( NULL ).
|
||||||
|
*
|
||||||
Artificially force an assert() to be triggered if configASSERT() is
|
* Artificially force an assert() to be triggered if configASSERT() is
|
||||||
defined, then stop here so application writers can catch the error. */
|
* defined, then stop here so application writers can catch the error. */
|
||||||
configASSERT( uxCriticalNesting == ~0UL );
|
configASSERT( uxCriticalNesting == ~0UL );
|
||||||
portDISABLE_INTERRUPTS();
|
portDISABLE_INTERRUPTS();
|
||||||
for( ;; );
|
|
||||||
|
for( ; ; )
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -231,15 +236,15 @@ BaseType_t xPortStartScheduler( void )
|
||||||
volatile uint8_t ucMaxPriorityValue;
|
volatile uint8_t ucMaxPriorityValue;
|
||||||
|
|
||||||
/* Determine the maximum priority from which ISR safe FreeRTOS API
|
/* Determine the maximum priority from which ISR safe FreeRTOS API
|
||||||
functions can be called. ISR safe functions are those that end in
|
* functions can be called. ISR safe functions are those that end in
|
||||||
"FromISR". FreeRTOS maintains separate thread and ISR API functions to
|
* "FromISR". FreeRTOS maintains separate thread and ISR API functions to
|
||||||
ensure interrupt entry is as fast and simple as possible.
|
* ensure interrupt entry is as fast and simple as possible.
|
||||||
|
*
|
||||||
Save the interrupt priority value that is about to be clobbered. */
|
* Save the interrupt priority value that is about to be clobbered. */
|
||||||
ulOriginalPriority = *pucFirstUserPriorityRegister;
|
ulOriginalPriority = *pucFirstUserPriorityRegister;
|
||||||
|
|
||||||
/* Determine the number of priority bits available. First write to all
|
/* Determine the number of priority bits available. First write to all
|
||||||
possible bits. */
|
* possible bits. */
|
||||||
*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
|
*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
|
||||||
|
|
||||||
/* Read the value back to see how many bits stuck. */
|
/* Read the value back to see how many bits stuck. */
|
||||||
|
@ -249,8 +254,9 @@ BaseType_t xPortStartScheduler( void )
|
||||||
ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
|
ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
|
||||||
|
|
||||||
/* Calculate the maximum acceptable priority group value for the number
|
/* Calculate the maximum acceptable priority group value for the number
|
||||||
of bits read back. */
|
* of bits read back. */
|
||||||
ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
|
ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
|
||||||
|
|
||||||
while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
|
while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
|
||||||
{
|
{
|
||||||
ulMaxPRIGROUPValue--;
|
ulMaxPRIGROUPValue--;
|
||||||
|
@ -260,8 +266,8 @@ BaseType_t xPortStartScheduler( void )
|
||||||
#ifdef __NVIC_PRIO_BITS
|
#ifdef __NVIC_PRIO_BITS
|
||||||
{
|
{
|
||||||
/* Check the CMSIS configuration that defines the number of
|
/* Check the CMSIS configuration that defines the number of
|
||||||
priority bits matches the number of priority bits actually queried
|
* priority bits matches the number of priority bits actually queried
|
||||||
from the hardware. */
|
* from the hardware. */
|
||||||
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -269,29 +275,29 @@ BaseType_t xPortStartScheduler( void )
|
||||||
#ifdef configPRIO_BITS
|
#ifdef configPRIO_BITS
|
||||||
{
|
{
|
||||||
/* Check the FreeRTOS configuration that defines the number of
|
/* Check the FreeRTOS configuration that defines the number of
|
||||||
priority bits matches the number of priority bits actually queried
|
* priority bits matches the number of priority bits actually queried
|
||||||
from the hardware. */
|
* from the hardware. */
|
||||||
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Shift the priority group value back to its position within the AIRCR
|
/* Shift the priority group value back to its position within the AIRCR
|
||||||
register. */
|
* register. */
|
||||||
ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
|
ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
|
||||||
ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
|
ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
|
||||||
|
|
||||||
/* Restore the clobbered interrupt priority register to its original
|
/* Restore the clobbered interrupt priority register to its original
|
||||||
value. */
|
* value. */
|
||||||
*pucFirstUserPriorityRegister = ulOriginalPriority;
|
*pucFirstUserPriorityRegister = ulOriginalPriority;
|
||||||
}
|
}
|
||||||
#endif /* conifgASSERT_DEFINED */
|
#endif /* conifgASSERT_DEFINED */
|
||||||
|
|
||||||
/* Make PendSV and SysTick the lowest priority interrupts. */
|
/* Make PendSV and SysTick the lowest priority interrupts. */
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
|
|
||||||
/* Start the timer that generates the tick ISR. Interrupts are disabled
|
/* Start the timer that generates the tick ISR. Interrupts are disabled
|
||||||
here already. */
|
* here already. */
|
||||||
vPortSetupTimerInterrupt();
|
vPortSetupTimerInterrupt();
|
||||||
|
|
||||||
/* Initialise the critical nesting count ready for the first task. */
|
/* Initialise the critical nesting count ready for the first task. */
|
||||||
|
@ -314,7 +320,7 @@ BaseType_t xPortStartScheduler( void )
|
||||||
void vPortEndScheduler( void )
|
void vPortEndScheduler( void )
|
||||||
{
|
{
|
||||||
/* Not implemented in ports where there is nothing to return to.
|
/* Not implemented in ports where there is nothing to return to.
|
||||||
Artificially force an assert. */
|
* Artificially force an assert. */
|
||||||
configASSERT( uxCriticalNesting == 1000UL );
|
configASSERT( uxCriticalNesting == 1000UL );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -325,10 +331,10 @@ void vPortEnterCritical( void )
|
||||||
uxCriticalNesting++;
|
uxCriticalNesting++;
|
||||||
|
|
||||||
/* This is not the interrupt safe version of the enter critical function so
|
/* This is not the interrupt safe version of the enter critical function so
|
||||||
assert() if it is being called from an interrupt context. Only API
|
* assert() if it is being called from an interrupt context. Only API
|
||||||
functions that end in "FromISR" can be used in an interrupt. Only assert if
|
* functions that end in "FromISR" can be used in an interrupt. Only assert if
|
||||||
the critical nesting count is 1 to protect against recursive calls if the
|
* the critical nesting count is 1 to protect against recursive calls if the
|
||||||
assert function also uses a critical section. */
|
* assert function also uses a critical section. */
|
||||||
if( uxCriticalNesting == 1 )
|
if( uxCriticalNesting == 1 )
|
||||||
{
|
{
|
||||||
configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
|
configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
|
||||||
|
@ -340,6 +346,7 @@ void vPortExitCritical( void )
|
||||||
{
|
{
|
||||||
configASSERT( uxCriticalNesting );
|
configASSERT( uxCriticalNesting );
|
||||||
uxCriticalNesting--;
|
uxCriticalNesting--;
|
||||||
|
|
||||||
if( uxCriticalNesting == 0 )
|
if( uxCriticalNesting == 0 )
|
||||||
{
|
{
|
||||||
portENABLE_INTERRUPTS();
|
portENABLE_INTERRUPTS();
|
||||||
|
@ -350,16 +357,16 @@ void vPortExitCritical( void )
|
||||||
void xPortSysTickHandler( void )
|
void xPortSysTickHandler( void )
|
||||||
{
|
{
|
||||||
/* The SysTick runs at the lowest interrupt priority, so when this interrupt
|
/* The SysTick runs at the lowest interrupt priority, so when this interrupt
|
||||||
executes all interrupts must be unmasked. There is therefore no need to
|
* executes all interrupts must be unmasked. There is therefore no need to
|
||||||
save and then restore the interrupt mask value as its value is already
|
* save and then restore the interrupt mask value as its value is already
|
||||||
known. */
|
* known. */
|
||||||
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
|
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
|
||||||
{
|
{
|
||||||
/* Increment the RTOS tick. */
|
/* Increment the RTOS tick. */
|
||||||
if( xTaskIncrementTick() != pdFALSE )
|
if( xTaskIncrementTick() != pdFALSE )
|
||||||
{
|
{
|
||||||
/* A context switch is required. Context switching is performed in
|
/* A context switch is required. Context switching is performed in
|
||||||
the PendSV interrupt. Pend the PendSV interrupt. */
|
* the PendSV interrupt. Pend the PendSV interrupt. */
|
||||||
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -382,44 +389,44 @@ void xPortSysTickHandler( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stop the SysTick momentarily. The time the SysTick is stopped for
|
/* Stop the SysTick momentarily. The time the SysTick is stopped for
|
||||||
is accounted for as best it can be, but using the tickless mode will
|
* is accounted for as best it can be, but using the tickless mode will
|
||||||
inevitably result in some tiny drift of the time maintained by the
|
* inevitably result in some tiny drift of the time maintained by the
|
||||||
kernel with respect to calendar time. */
|
* kernel with respect to calendar time. */
|
||||||
portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
/* Calculate the reload value required to wait xExpectedIdleTime
|
/* Calculate the reload value required to wait xExpectedIdleTime
|
||||||
tick periods. -1 is used because this code will execute part way
|
* tick periods. -1 is used because this code will execute part way
|
||||||
through one of the tick periods. */
|
* through one of the tick periods. */
|
||||||
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
||||||
|
|
||||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
if( ulReloadValue > ulStoppedTimerCompensation )
|
||||||
{
|
{
|
||||||
ulReloadValue -= ulStoppedTimerCompensation;
|
ulReloadValue -= ulStoppedTimerCompensation;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
||||||
method as that will mask interrupts that should exit sleep mode. */
|
* method as that will mask interrupts that should exit sleep mode. */
|
||||||
__asm( " cpsid i");
|
__asm( " cpsid i");
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
|
|
||||||
|
|
||||||
/* If a context switch is pending or a task is waiting for the scheduler
|
/* If a context switch is pending or a task is waiting for the scheduler
|
||||||
to be unsuspended then abandon the low power entry. */
|
* to be unsuspended then abandon the low power entry. */
|
||||||
if( eTaskConfirmSleepModeStatus() == eAbortSleep )
|
if( eTaskConfirmSleepModeStatus() == eAbortSleep )
|
||||||
{
|
{
|
||||||
/* Restart from whatever is left in the count register to complete
|
/* Restart from whatever is left in the count register to complete
|
||||||
this tick period. */
|
* this tick period. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
||||||
|
|
||||||
/* Restart SysTick. */
|
/* Restart SysTick. */
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
/* Reset the reload register to the value required for normal tick
|
/* Reset the reload register to the value required for normal tick
|
||||||
periods. */
|
* periods. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above __disable_interrupt()
|
/* Re-enable interrupts - see comments above __disable_interrupt()
|
||||||
call above. */
|
* call above. */
|
||||||
__asm( " cpsie i");
|
__asm( " cpsie i");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -428,69 +435,71 @@ void xPortSysTickHandler( void )
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
|
portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
|
||||||
|
|
||||||
/* Clear the SysTick count flag and set the count value back to
|
/* Clear the SysTick count flag and set the count value back to
|
||||||
zero. */
|
* zero. */
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
|
||||||
/* Restart SysTick. */
|
/* Restart SysTick. */
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
/* Sleep until something happens. configPRE_SLEEP_PROCESSING() can
|
/* Sleep until something happens. configPRE_SLEEP_PROCESSING() can
|
||||||
set its parameter to 0 to indicate that its implementation contains
|
* set its parameter to 0 to indicate that its implementation contains
|
||||||
its own wait for interrupt or wait for event instruction, and so wfi
|
* its own wait for interrupt or wait for event instruction, and so wfi
|
||||||
should not be executed again. However, the original expected idle
|
* should not be executed again. However, the original expected idle
|
||||||
time variable must remain unmodified, so a copy is taken. */
|
* time variable must remain unmodified, so a copy is taken. */
|
||||||
xModifiableIdleTime = xExpectedIdleTime;
|
xModifiableIdleTime = xExpectedIdleTime;
|
||||||
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||||
|
|
||||||
if( xModifiableIdleTime > 0 )
|
if( xModifiableIdleTime > 0 )
|
||||||
{
|
{
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " wfi");
|
__asm( " wfi");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
}
|
}
|
||||||
|
|
||||||
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
out of sleep mode to execute immediately. see comments above
|
* out of sleep mode to execute immediately. see comments above
|
||||||
__disable_interrupt() call above. */
|
* __disable_interrupt() call above. */
|
||||||
__asm( " cpsie i");
|
__asm( " cpsie i");
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
|
|
||||||
/* Disable interrupts again because the clock is about to be stopped
|
/* Disable interrupts again because the clock is about to be stopped
|
||||||
and interrupts that execute while the clock is stopped will increase
|
* and interrupts that execute while the clock is stopped will increase
|
||||||
any slippage between the time maintained by the RTOS and calendar
|
* any slippage between the time maintained by the RTOS and calendar
|
||||||
time. */
|
* time. */
|
||||||
__asm( " cpsid i");
|
__asm( " cpsid i");
|
||||||
__asm( " dsb");
|
__asm( " dsb");
|
||||||
__asm( " isb");
|
__asm( " isb");
|
||||||
|
|
||||||
/* Disable the SysTick clock without reading the
|
/* Disable the SysTick clock without reading the
|
||||||
portNVIC_SYSTICK_CTRL_REG register to ensure the
|
* portNVIC_SYSTICK_CTRL_REG register to ensure the
|
||||||
portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again,
|
* portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again,
|
||||||
the time the SysTick is stopped for is accounted for as best it can
|
* the time the SysTick is stopped for is accounted for as best it can
|
||||||
be, but using the tickless mode will inevitably result in some tiny
|
* be, but using the tickless mode will inevitably result in some tiny
|
||||||
drift of the time maintained by the kernel with respect to calendar
|
* drift of the time maintained by the kernel with respect to calendar
|
||||||
time*/
|
* time*/
|
||||||
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );
|
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );
|
||||||
|
|
||||||
/* Determine if the SysTick clock has already counted to zero and
|
/* Determine if the SysTick clock has already counted to zero and
|
||||||
been set back to the current reload value (the reload back being
|
* been set back to the current reload value (the reload back being
|
||||||
correct for the entire expected idle time) or if the SysTick is yet
|
* correct for the entire expected idle time) or if the SysTick is yet
|
||||||
to count to zero (in which case an interrupt other than the SysTick
|
* to count to zero (in which case an interrupt other than the SysTick
|
||||||
must have brought the system out of sleep mode). */
|
* must have brought the system out of sleep mode). */
|
||||||
if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
||||||
{
|
{
|
||||||
uint32_t ulCalculatedLoadValue;
|
uint32_t ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* The tick interrupt is already pending, and the SysTick count
|
/* The tick interrupt is already pending, and the SysTick count
|
||||||
reloaded with ulReloadValue. Reset the
|
* reloaded with ulReloadValue. Reset the
|
||||||
portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
* portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
||||||
period. */
|
* period. */
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
||||||
|
|
||||||
/* Don't allow a tiny value, or values that have somehow
|
/* Don't allow a tiny value, or values that have somehow
|
||||||
underflowed because the post sleep hook did something
|
* underflowed because the post sleep hook did something
|
||||||
that took too long. */
|
* that took too long. */
|
||||||
if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
|
if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
|
||||||
{
|
{
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
||||||
|
@ -499,30 +508,30 @@ void xPortSysTickHandler( void )
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* As the pending tick will be processed as soon as this
|
/* As the pending tick will be processed as soon as this
|
||||||
function exits, the tick value maintained by the tick is stepped
|
* function exits, the tick value maintained by the tick is stepped
|
||||||
forward by one less than the time spent waiting. */
|
* forward by one less than the time spent waiting. */
|
||||||
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Something other than the tick interrupt ended the sleep.
|
/* Something other than the tick interrupt ended the sleep.
|
||||||
Work out how long the sleep lasted rounded to complete tick
|
* Work out how long the sleep lasted rounded to complete tick
|
||||||
periods (not the ulReload value which accounted for part
|
* periods (not the ulReload value which accounted for part
|
||||||
ticks). */
|
* ticks). */
|
||||||
ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
||||||
|
|
||||||
/* How many complete tick periods passed while the processor
|
/* How many complete tick periods passed while the processor
|
||||||
was waiting? */
|
* was waiting? */
|
||||||
ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
|
ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
|
||||||
|
|
||||||
/* The reload value is set to whatever fraction of a single tick
|
/* The reload value is set to whatever fraction of a single tick
|
||||||
period remains. */
|
* period remains. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
||||||
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
* again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
||||||
value. */
|
* value. */
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
|
@ -579,66 +588,45 @@ void vPortSetupTimerInterrupt( void )
|
||||||
ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
|
ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];
|
||||||
|
|
||||||
/* The following assertion will fail if a service routine (ISR) for
|
/* The following assertion will fail if a service routine (ISR) for
|
||||||
an interrupt that has been assigned a priority above
|
* an interrupt that has been assigned a priority above
|
||||||
configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
|
* configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API
|
||||||
function. ISR safe FreeRTOS API functions must *only* be called
|
* function. ISR safe FreeRTOS API functions must *only* be called
|
||||||
from interrupts that have been assigned a priority at or below
|
* from interrupts that have been assigned a priority at or below
|
||||||
configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
* configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
||||||
|
*
|
||||||
Numerically low interrupt priority numbers represent logically high
|
* Numerically low interrupt priority numbers represent logically high
|
||||||
interrupt priorities, therefore the priority of the interrupt must
|
* interrupt priorities, therefore the priority of the interrupt must
|
||||||
be set to a value equal to or numerically *higher* than
|
* be set to a value equal to or numerically *higher* than
|
||||||
configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
* configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
||||||
|
*
|
||||||
Interrupts that use the FreeRTOS API must not be left at their
|
* Interrupts that use the FreeRTOS API must not be left at their
|
||||||
default priority of zero as that is the highest possible priority,
|
* default priority of zero as that is the highest possible priority,
|
||||||
which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
|
* which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,
|
||||||
and therefore also guaranteed to be invalid.
|
* and therefore also guaranteed to be invalid.
|
||||||
|
*
|
||||||
FreeRTOS maintains separate thread and ISR API functions to ensure
|
* FreeRTOS maintains separate thread and ISR API functions to ensure
|
||||||
interrupt entry is as fast and simple as possible.
|
* interrupt entry is as fast and simple as possible.
|
||||||
|
*
|
||||||
The following links provide detailed information:
|
* The following links provide detailed information:
|
||||||
http://www.freertos.org/RTOS-Cortex-M3-M4.html
|
* https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
|
||||||
http://www.freertos.org/FAQHelp.html */
|
* https://www.FreeRTOS.org/FAQHelp.html */
|
||||||
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
|
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Priority grouping: The interrupt controller (NVIC) allows the bits
|
/* Priority grouping: The interrupt controller (NVIC) allows the bits
|
||||||
that define each interrupt's priority to be split between bits that
|
* that define each interrupt's priority to be split between bits that
|
||||||
define the interrupt's pre-emption priority bits and bits that define
|
* define the interrupt's pre-emption priority bits and bits that define
|
||||||
the interrupt's sub-priority. For simplicity all bits must be defined
|
* the interrupt's sub-priority. For simplicity all bits must be defined
|
||||||
to be pre-emption priority bits. The following assertion will fail if
|
* to be pre-emption priority bits. The following assertion will fail if
|
||||||
this is not the case (if some bits represent a sub-priority).
|
* this is not the case (if some bits represent a sub-priority).
|
||||||
|
*
|
||||||
If the application only uses CMSIS libraries for interrupt
|
* If the application only uses CMSIS libraries for interrupt
|
||||||
configuration then the correct setting can be achieved on all Cortex-M
|
* configuration then the correct setting can be achieved on all Cortex-M
|
||||||
devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
|
* devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
|
||||||
scheduler. Note however that some vendor specific peripheral libraries
|
* scheduler. Note however that some vendor specific peripheral libraries
|
||||||
assume a non-zero priority group setting, in which cases using a value
|
* assume a non-zero priority group setting, in which cases using a value
|
||||||
of zero will result in unpredictable behaviour. */
|
* of zero will result in unpredictable behaviour. */
|
||||||
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configASSERT_DEFINED */
|
#endif /* configASSERT_DEFINED */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
; *
|
; *
|
||||||
; * http://www.FreeRTOS.org
|
; * https://www.FreeRTOS.org
|
||||||
; * http://aws.amazon.com/freertos
|
; * https://github.com/FreeRTOS
|
||||||
; *
|
; *
|
||||||
; * 1 tab == 4 spaces!
|
; * 1 tab == 4 spaces!
|
||||||
; */
|
; */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
@ -64,7 +64,7 @@ typedef unsigned long UBaseType_t;
|
||||||
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
||||||
|
|
||||||
/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
|
/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
|
||||||
not need to be guarded with a critical section. */
|
* not need to be guarded with a critical section. */
|
||||||
#define portTICK_TYPE_IS_ATOMIC 1
|
#define portTICK_TYPE_IS_ATOMIC 1
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -141,8 +141,8 @@ extern void vPortExitCritical( void );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. These are
|
/* Task function macros as described on the FreeRTOS.org WEB site. These are
|
||||||
not necessary for to use this port. They are defined so the common demo files
|
* not necessary for to use this port. They are defined so the common demo files
|
||||||
(which build with all the ports) will build. */
|
* (which build with all the ports) will build. */
|
||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
||||||
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -162,4 +162,3 @@ not necessary for to use this port. They are defined so the common demo files
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* PORTMACRO_H */
|
#endif /* PORTMACRO_H */
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
; *
|
; *
|
||||||
; * http://www.FreeRTOS.org
|
; * https://www.FreeRTOS.org
|
||||||
; * http://aws.amazon.com/freertos
|
; * https://github.com/FreeRTOS
|
||||||
; *
|
; *
|
||||||
; * 1 tab == 4 spaces!
|
; * 1 tab == 4 spaces!
|
||||||
; */
|
; */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
; *
|
; *
|
||||||
; * http://www.FreeRTOS.org
|
; * https://www.FreeRTOS.org
|
||||||
; * http://aws.amazon.com/freertos
|
; * https://github.com/FreeRTOS
|
||||||
; *
|
; *
|
||||||
; * 1 tab == 4 spaces!
|
; * 1 tab == 4 spaces!
|
||||||
; */
|
; */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
; *
|
; *
|
||||||
; * http://www.FreeRTOS.org
|
; * https://www.FreeRTOS.org
|
||||||
; * http://aws.amazon.com/freertos
|
; * https://github.com/FreeRTOS
|
||||||
; *
|
; *
|
||||||
; * 1 tab == 4 spaces!
|
; * 1 tab == 4 spaces!
|
||||||
; */
|
; */
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,10 +19,9 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -31,8 +30,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
||||||
all the API functions to use the MPU wrappers. That should only be done when
|
* all the API functions to use the MPU wrappers. That should only be done when
|
||||||
task.h is included from an application file. */
|
* task.h is included from an application file. */
|
||||||
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
/* Scheduler includes. */
|
/* Scheduler includes. */
|
||||||
|
@ -68,7 +67,7 @@ BaseType_t xRunningPrivileged;
|
||||||
xRunningPrivileged = portIS_PRIVILEGED();
|
xRunningPrivileged = portIS_PRIVILEGED();
|
||||||
|
|
||||||
/* If the processor is not already privileged, raise privilege. */
|
/* If the processor is not already privileged, raise privilege. */
|
||||||
if( xRunningPrivileged != pdTRUE )
|
if( xRunningPrivileged == pdFALSE )
|
||||||
{
|
{
|
||||||
portRAISE_PRIVILEGE();
|
portRAISE_PRIVILEGE();
|
||||||
}
|
}
|
||||||
|
@ -79,7 +78,7 @@ BaseType_t xRunningPrivileged;
|
||||||
|
|
||||||
void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
||||||
{
|
{
|
||||||
if( xRunningPrivileged != pdTRUE )
|
if( xRunningPrivileged == pdFALSE )
|
||||||
{
|
{
|
||||||
portRESET_PRIVILEGE();
|
portRESET_PRIVILEGE();
|
||||||
}
|
}
|
||||||
|
@ -87,7 +86,8 @@ void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
|
||||||
|
TaskHandle_t * pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -100,7 +100,8 @@ void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,
|
||||||
|
TaskHandle_t * pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -113,7 +114,12 @@ void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode,
|
||||||
|
const char * const pcName,
|
||||||
|
uint16_t usStackDepth,
|
||||||
|
void * pvParameters,
|
||||||
|
UBaseType_t uxPriority,
|
||||||
|
TaskHandle_t * pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -126,7 +132,13 @@ void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) /* FREERTOS_SYSTEM_CALL */
|
TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode,
|
||||||
|
const char * const pcName,
|
||||||
|
const uint32_t ulStackDepth,
|
||||||
|
void * const pvParameters,
|
||||||
|
UBaseType_t uxPriority,
|
||||||
|
StackType_t * const puxStackBuffer,
|
||||||
|
StaticTask_t * const pxTaskBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TaskHandle_t xReturn;
|
TaskHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -138,7 +150,8 @@ void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask,
|
||||||
|
const MemoryRegion_t * const xRegions ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -159,7 +172,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskDelayUntil == 1 )
|
#if ( INCLUDE_vTaskDelayUntil == 1 )
|
||||||
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, TickType_t xTimeIncrement ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
|
||||||
|
TickType_t xTimeIncrement ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -207,7 +221,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskPrioritySet == 1 )
|
#if ( INCLUDE_vTaskPrioritySet == 1 )
|
||||||
void MPU_vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTaskPrioritySet( TaskHandle_t pxTask,
|
||||||
|
UBaseType_t uxNewPriority ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -231,14 +246,17 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTaskGetInfo( TaskHandle_t xTask,
|
||||||
|
TaskStatus_t * pxTaskStatus,
|
||||||
|
BaseType_t xGetFreeStackSpace,
|
||||||
|
eTaskState eState ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState );
|
vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TRACE_FACILITY == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
|
#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
|
||||||
|
@ -378,7 +396,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
||||||
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxTagValue ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask,
|
||||||
|
TaskHookFunction_t pxTagValue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -402,7 +421,9 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
|
#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
|
||||||
void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,
|
||||||
|
BaseType_t xIndex,
|
||||||
|
void * pvValue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -413,7 +434,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
|
#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )
|
||||||
void *MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) /* FREERTOS_SYSTEM_CALL */
|
void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,
|
||||||
|
BaseType_t xIndex ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
void * pvReturn;
|
void * pvReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -422,11 +444,12 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return pvReturn;
|
return pvReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
||||||
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask,
|
||||||
|
void * pvParameter ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -435,11 +458,13 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t *pxTaskStatusArray, UBaseType_t uxArraySize, uint32_t *pulTotalRunTime ) /* FREERTOS_SYSTEM_CALL */
|
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * pxTaskStatusArray,
|
||||||
|
UBaseType_t uxArraySize,
|
||||||
|
uint32_t * pulTotalRunTime ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -448,7 +473,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return uxReturn;
|
return uxReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TRACE_FACILITY == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
@ -523,7 +548,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,
|
||||||
|
TickType_t * const pxTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -535,72 +561,87 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify,
|
||||||
|
UBaseType_t uxIndexToNotify,
|
||||||
|
uint32_t ulValue,
|
||||||
|
eNotifyAction eAction,
|
||||||
|
uint32_t * pulPreviousNotificationValue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
xReturn = xTaskGenericNotify( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue );
|
xReturn = xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,
|
||||||
|
uint32_t ulBitsToClearOnEntry,
|
||||||
|
uint32_t ulBitsToClearOnExit,
|
||||||
|
uint32_t * pulNotificationValue,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
xReturn = xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait );
|
xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,
|
||||||
|
BaseType_t xClearCountOnExit,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
uint32_t ulReturn;
|
uint32_t ulReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
ulReturn = ulTaskNotifyTake( xClearCountOnExit, xTicksToWait );
|
ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return ulReturn;
|
return ulReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask,
|
||||||
|
UBaseType_t uxIndexToClear ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
xReturn = xTaskNotifyStateClear( xTask );
|
xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if ( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
uint32_t MPU_ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) /* FREERTOS_SYSTEM_CALL */
|
uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask,
|
||||||
|
UBaseType_t uxIndexToClear,
|
||||||
|
uint32_t ulBitsToClear ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
uint32_t ulReturn;
|
uint32_t ulReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
ulReturn = ulTaskNotifyValueClear( xTask, ulBitsToClear );
|
ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return ulReturn;
|
return ulReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize, uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */
|
QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength,
|
||||||
|
UBaseType_t uxItemSize,
|
||||||
|
uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueHandle_t xReturn;
|
QueueHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -609,11 +650,15 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */
|
QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,
|
||||||
|
const UBaseType_t uxItemSize,
|
||||||
|
uint8_t * pucQueueStorage,
|
||||||
|
StaticQueue_t * pxStaticQueue,
|
||||||
|
const uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueHandle_t xReturn;
|
QueueHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -622,10 +667,11 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueGenericReset( QueueHandle_t pxQueue, BaseType_t xNewQueue ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueueGenericReset( QueueHandle_t pxQueue,
|
||||||
|
BaseType_t xNewQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -636,7 +682,10 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue,
|
||||||
|
const void * const pvItemToQueue,
|
||||||
|
TickType_t xTicksToWait,
|
||||||
|
BaseType_t xCopyPosition ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -669,7 +718,9 @@ UBaseType_t uxReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueReceive( QueueHandle_t pxQueue, void * const pvBuffer, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueueReceive( QueueHandle_t pxQueue,
|
||||||
|
void * const pvBuffer,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
@ -680,7 +731,9 @@ BaseType_t xReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue,
|
||||||
|
void * const pvBuffer,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
@ -691,7 +744,8 @@ BaseType_t xReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
@ -729,7 +783,8 @@ BaseType_t xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
|
#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
|
||||||
QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */
|
QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType,
|
||||||
|
StaticQueue_t * pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueHandle_t xReturn;
|
QueueHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -738,11 +793,12 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
||||||
QueueHandle_t MPU_xQueueCreateCountingSemaphore( UBaseType_t uxCountValue, UBaseType_t uxInitialCount ) /* FREERTOS_SYSTEM_CALL */
|
QueueHandle_t MPU_xQueueCreateCountingSemaphore( UBaseType_t uxCountValue,
|
||||||
|
UBaseType_t uxInitialCount ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueHandle_t xReturn;
|
QueueHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -751,12 +807,14 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
|
#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )
|
||||||
|
|
||||||
QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */
|
QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,
|
||||||
|
const UBaseType_t uxInitialCount,
|
||||||
|
StaticQueue_t * pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueHandle_t xReturn;
|
QueueHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -765,11 +823,12 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
||||||
BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xBlockTime ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex,
|
||||||
|
TickType_t xBlockTime ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -778,7 +837,7 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
||||||
|
@ -808,7 +867,8 @@ BaseType_t xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t xBlockTimeTicks ) /* FREERTOS_SYSTEM_CALL */
|
QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
|
||||||
|
TickType_t xBlockTimeTicks ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueSetMemberHandle_t xReturn;
|
QueueSetMemberHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -817,11 +877,12 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_QUEUE_SETS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
|
||||||
|
QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -830,11 +891,12 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_QUEUE_SETS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,
|
||||||
|
QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -843,11 +905,12 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_QUEUE_SETS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configQUEUE_REGISTRY_SIZE > 0
|
#if configQUEUE_REGISTRY_SIZE > 0
|
||||||
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue,
|
||||||
|
const char * pcName ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -881,7 +944,7 @@ BaseType_t xReturn;
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return pcReturn;
|
return pcReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if configQUEUE_REGISTRY_SIZE > 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void MPU_vQueueDelete( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vQueueDelete( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
@ -894,33 +957,6 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
|
||||||
void *MPU_pvPortMalloc( size_t xSize ) /* FREERTOS_SYSTEM_CALL */
|
|
||||||
{
|
|
||||||
void *pvReturn;
|
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
|
||||||
|
|
||||||
pvReturn = pvPortMalloc( xSize );
|
|
||||||
|
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
|
||||||
|
|
||||||
return pvReturn;
|
|
||||||
}
|
|
||||||
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
|
||||||
void MPU_vPortFree( void *pv ) /* FREERTOS_SYSTEM_CALL */
|
|
||||||
{
|
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
|
||||||
|
|
||||||
vPortFree( pv );
|
|
||||||
|
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
|
||||||
}
|
|
||||||
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
void MPU_vPortInitialiseBlocks( void ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vPortInitialiseBlocks( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
|
@ -949,7 +985,11 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) )
|
#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) )
|
||||||
TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) /* FREERTOS_SYSTEM_CALL */
|
TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName,
|
||||||
|
const TickType_t xTimerPeriodInTicks,
|
||||||
|
const UBaseType_t uxAutoReload,
|
||||||
|
void * const pvTimerID,
|
||||||
|
TimerCallbackFunction_t pxCallbackFunction ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TimerHandle_t xReturn;
|
TimerHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -959,11 +999,16 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) )
|
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) )
|
||||||
TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ) /* FREERTOS_SYSTEM_CALL */
|
TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName,
|
||||||
|
const TickType_t xTimerPeriodInTicks,
|
||||||
|
const UBaseType_t uxAutoReload,
|
||||||
|
void * const pvTimerID,
|
||||||
|
TimerCallbackFunction_t pxCallbackFunction,
|
||||||
|
StaticTimer_t * pxTimerBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TimerHandle_t xReturn;
|
TimerHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -973,7 +1018,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_TIMERS == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TIMERS == 1 )
|
#if ( configUSE_TIMERS == 1 )
|
||||||
|
@ -987,11 +1032,12 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return pvReturn;
|
return pvReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TIMERS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TIMERS == 1 )
|
#if ( configUSE_TIMERS == 1 )
|
||||||
void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTimerSetTimerID( TimerHandle_t xTimer,
|
||||||
|
void * pvNewID ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -1012,7 +1058,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TIMERS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TIMERS == 1 )
|
#if ( configUSE_TIMERS == 1 )
|
||||||
|
@ -1026,11 +1072,14 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TIMERS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
|
#if ( ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )
|
||||||
BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,
|
||||||
|
void * pvParameter1,
|
||||||
|
uint32_t ulParameter2,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1040,11 +1089,12 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TIMERS == 1 )
|
#if ( configUSE_TIMERS == 1 )
|
||||||
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) /* FREERTOS_SYSTEM_CALL */
|
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer,
|
||||||
|
const UBaseType_t uxAutoReload ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
@ -1078,7 +1128,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return pcReturn;
|
return pcReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TIMERS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TIMERS == 1 )
|
#if ( configUSE_TIMERS == 1 )
|
||||||
|
@ -1092,7 +1142,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TIMERS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TIMERS == 1 )
|
#if ( configUSE_TIMERS == 1 )
|
||||||
|
@ -1106,11 +1156,15 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TIMERS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TIMERS == 1 )
|
#if ( configUSE_TIMERS == 1 )
|
||||||
BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer,
|
||||||
|
const BaseType_t xCommandID,
|
||||||
|
const TickType_t xOptionalValue,
|
||||||
|
BaseType_t * const pxHigherPriorityTaskWoken,
|
||||||
|
const TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1120,7 +1174,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configUSE_TIMERS == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
|
@ -1134,7 +1188,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
|
@ -1148,10 +1202,14 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
const BaseType_t xClearOnExit,
|
||||||
|
const BaseType_t xWaitForAllBits,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
EventBits_t xReturn;
|
EventBits_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1163,7 +1221,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) /* FREERTOS_SYSTEM_CALL */
|
EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToClear ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
EventBits_t xReturn;
|
EventBits_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1175,7 +1234,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) /* FREERTOS_SYSTEM_CALL */
|
EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
EventBits_t xReturn;
|
EventBits_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1187,7 +1247,10 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup,
|
||||||
|
const EventBits_t uxBitsToSet,
|
||||||
|
const EventBits_t uxBitsToWaitFor,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
EventBits_t xReturn;
|
EventBits_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1208,7 +1271,10 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
const void * pvTxData,
|
||||||
|
size_t xDataLengthBytes,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
size_t xReturn;
|
size_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1232,7 +1298,10 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
void * pvRxData,
|
||||||
|
size_t xBufferLengthBytes,
|
||||||
|
TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
size_t xReturn;
|
size_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1313,7 +1382,8 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) /* FREERTOS_SYSTEM_CALL */
|
BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
size_t xTriggerLevel ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1326,7 +1396,9 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer ) /* FREERTOS_SYSTEM_CALL */
|
StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes,
|
||||||
|
size_t xTriggerLevelBytes,
|
||||||
|
BaseType_t xIsMessageBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
StreamBufferHandle_t xReturn;
|
StreamBufferHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1340,7 +1412,11 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer, uint8_t * const pucStreamBufferStorageArea, StaticStreamBuffer_t * const pxStaticStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
|
||||||
|
size_t xTriggerLevelBytes,
|
||||||
|
BaseType_t xIsMessageBuffer,
|
||||||
|
uint8_t * const pucStreamBufferStorageArea,
|
||||||
|
StaticStreamBuffer_t * const pxStaticStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
StreamBufferHandle_t xReturn;
|
StreamBufferHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
@ -1355,18 +1431,18 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
||||||
/* Functions that the application writer wants to execute in privileged mode
|
/* Functions that the application writer wants to execute in privileged mode
|
||||||
can be defined in application_defined_privileged_functions.h. The functions
|
* can be defined in application_defined_privileged_functions.h. The functions
|
||||||
must take the same format as those above whereby the privilege state on exit
|
* must take the same format as those above whereby the privilege state on exit
|
||||||
equals the privilege state on entry. For example:
|
* equals the privilege state on entry. For example:
|
||||||
|
*
|
||||||
void MPU_FunctionName( [parameters ] )
|
* void MPU_FunctionName( [parameters ] )
|
||||||
{
|
* {
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
* BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
*
|
||||||
FunctionName( [parameters ] );
|
* FunctionName( [parameters ] );
|
||||||
|
*
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
* vPortResetPrivilege( xRunningPrivileged );
|
||||||
}
|
* }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1
|
#if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* http://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue