aboutsummaryrefslogtreecommitdiff
path: root/product/rcar/src/CMSIS-FreeRTOS/Source/include/stack_macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'product/rcar/src/CMSIS-FreeRTOS/Source/include/stack_macros.h')
-rw-r--r--product/rcar/src/CMSIS-FreeRTOS/Source/include/stack_macros.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/product/rcar/src/CMSIS-FreeRTOS/Source/include/stack_macros.h b/product/rcar/src/CMSIS-FreeRTOS/Source/include/stack_macros.h
new file mode 100644
index 00000000..30334846
--- /dev/null
+++ b/product/rcar/src/CMSIS-FreeRTOS/Source/include/stack_macros.h
@@ -0,0 +1,133 @@
+/*
+ * FreeRTOS Kernel V10.3.1
+ * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER 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.
+ *
+ * http://www.FreeRTOS.org
+ * http://aws.amazon.com/freertos
+ *
+ * 1 tab == 4 spaces!
+ */
+
+#ifndef STACK_MACROS_H
+#define 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 */