Release v1.8.6
This commit is contained in:
parent
3d53398c29
commit
42472d601c
|
|
@ -1 +1 @@
|
||||||
Subproject commit 1d9e5f4f580ea970bdc512252ff0edf10481b5b2
|
Subproject commit 8a76309ed1250d817e9c888c4417171d2ba3ba63
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6ca7fc40cc862623dc05b33b0014789c1fbbbb86
|
Subproject commit 77fbb30b7a1d02533980400083e48c559aae5a4f
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# MIT License
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
@ -364,7 +364,7 @@ osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void
|
||||||
1, // period should be filled when starting the Timer using osTimerStart
|
1, // period should be filled when starting the Timer using osTimerStart
|
||||||
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
||||||
(void *) argument,
|
(void *) argument,
|
||||||
(TaskFunction_t)timer_def->ptimer,
|
(TimerCallbackFunction_t)timer_def->ptimer,
|
||||||
(StaticTimer_t *)timer_def->controlblock);
|
(StaticTimer_t *)timer_def->controlblock);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -372,21 +372,21 @@ osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void
|
||||||
1, // period should be filled when starting the Timer using osTimerStart
|
1, // period should be filled when starting the Timer using osTimerStart
|
||||||
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
||||||
(void *) argument,
|
(void *) argument,
|
||||||
(TaskFunction_t)timer_def->ptimer);
|
(TimerCallbackFunction_t)timer_def->ptimer);
|
||||||
}
|
}
|
||||||
#elif( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#elif( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
return xTimerCreateStatic((const char *)"",
|
return xTimerCreateStatic((const char *)"",
|
||||||
1, // period should be filled when starting the Timer using osTimerStart
|
1, // period should be filled when starting the Timer using osTimerStart
|
||||||
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
||||||
(void *) argument,
|
(void *) argument,
|
||||||
(TaskFunction_t)timer_def->ptimer,
|
(TimerCallbackFunction_t)timer_def->ptimer,
|
||||||
(StaticTimer_t *)timer_def->controlblock);
|
(StaticTimer_t *)timer_def->controlblock);
|
||||||
#else
|
#else
|
||||||
return xTimerCreate((const char *)"",
|
return xTimerCreate((const char *)"",
|
||||||
1, // period should be filled when starting the Timer using osTimerStart
|
1, // period should be filled when starting the Timer using osTimerStart
|
||||||
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
(type == osTimerPeriodic) ? pdTRUE : pdFALSE,
|
||||||
(void *) argument,
|
(void *) argument,
|
||||||
(TaskFunction_t)timer_def->ptimer);
|
(TimerCallbackFunction_t)timer_def->ptimer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
/* --------------------------------------------------------------------------
|
/*
|
||||||
* Portions Copyright © 2017 STMicroelectronics International N.V. All rights reserved.
|
* Copyright (c) 2013-2019 ARM Limited. All rights reserved.
|
||||||
* Portions Copyright (c) 2013-2017 ARM Limited. All rights reserved.
|
|
||||||
* --------------------------------------------------------------------------
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
|
@ -17,8 +15,13 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*
|
*
|
||||||
|
* ----------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* $Date: 10. January 2017
|
||||||
|
* $Revision: V2.1.0
|
||||||
|
*
|
||||||
* Project: CMSIS-RTOS API
|
* Project: CMSIS-RTOS API
|
||||||
* Title: cmsis_os.h header file
|
* Title: cmsis_os.h FreeRTOS header file
|
||||||
*
|
*
|
||||||
* Version 0.02
|
* Version 0.02
|
||||||
* Initial Proposal Phase
|
* Initial Proposal Phase
|
||||||
|
|
@ -36,7 +39,7 @@
|
||||||
* Version 1.02
|
* Version 1.02
|
||||||
* Control functions for short timeouts in microsecond resolution:
|
* Control functions for short timeouts in microsecond resolution:
|
||||||
* Added: osKernelSysTick, osKernelSysTickFrequency, osKernelSysTickMicroSec
|
* Added: osKernelSysTick, osKernelSysTickFrequency, osKernelSysTickMicroSec
|
||||||
* Removed: osSignalGet
|
* Removed: osSignalGet
|
||||||
* Version 2.0.0
|
* Version 2.0.0
|
||||||
* OS objects creation without macros (dynamic creation and resource allocation):
|
* OS objects creation without macros (dynamic creation and resource allocation):
|
||||||
* - added: osXxxxNew functions which replace osXxxxCreate
|
* - added: osXxxxNew functions which replace osXxxxCreate
|
||||||
|
|
@ -64,7 +67,7 @@
|
||||||
* - added: osThreadSuspend, osThreadResume
|
* - added: osThreadSuspend, osThreadResume
|
||||||
* - added: osThreadJoin, osThreadDetach, osThreadExit
|
* - added: osThreadJoin, osThreadDetach, osThreadExit
|
||||||
* - added: osThreadGetCount, osThreadEnumerate
|
* - added: osThreadGetCount, osThreadEnumerate
|
||||||
* - added: Thread Flags (moved from Signals)
|
* - added: Thread Flags (moved from Signals)
|
||||||
* Signals:
|
* Signals:
|
||||||
* - renamed osSignals to osThreadFlags (moved to Thread Flags)
|
* - renamed osSignals to osThreadFlags (moved to Thread Flags)
|
||||||
* - changed return value of Set/Clear/Wait functions
|
* - changed return value of Set/Clear/Wait functions
|
||||||
|
|
@ -107,7 +110,7 @@
|
||||||
* - added: osMessageQueueGetCapacity, osMessageQueueGetMsgSize
|
* - added: osMessageQueueGetCapacity, osMessageQueueGetMsgSize
|
||||||
* - added: osMessageQueueGetCount, osMessageQueueGetSpace
|
* - added: osMessageQueueGetCount, osMessageQueueGetSpace
|
||||||
* - added: osMessageQueueReset, osMessageQueueDelete
|
* - added: osMessageQueueReset, osMessageQueueDelete
|
||||||
* Mail Queue:
|
* Mail Queue:
|
||||||
* - deprecated (superseded by extended Message Queue functionality)
|
* - deprecated (superseded by extended Message Queue functionality)
|
||||||
* Version 2.1.0
|
* Version 2.1.0
|
||||||
* Support for critical and uncritical sections (nesting safe):
|
* Support for critical and uncritical sections (nesting safe):
|
||||||
|
|
@ -116,16 +119,22 @@
|
||||||
* Updated Thread and Event Flags:
|
* Updated Thread and Event Flags:
|
||||||
* - changed flags parameter and return type from int32_t to uint32_t
|
* - changed flags parameter and return type from int32_t to uint32_t
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef CMSIS_OS_H_
|
#ifndef CMSIS_OS_H_
|
||||||
#define CMSIS_OS_H_
|
#define CMSIS_OS_H_
|
||||||
|
|
||||||
#define osCMSIS 0x20001U ///< API version (main[31:16].sub[15:0])
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
#define osCMSIS_FreeRTOS 0xA0001U ///< RTOS identification and version (main[31:16].sub[15:0])
|
#define RTOS_ID_n ((tskKERNEL_VERSION_MAJOR << 16) | (tskKERNEL_VERSION_MINOR))
|
||||||
|
#define RTOS_ID_s ("FreeRTOS " tskKERNEL_VERSION_NUMBER)
|
||||||
|
|
||||||
#define osKernelSystemId "FreeRTOS V10.0.1" ///< RTOS identification string
|
#define osCMSIS 0x20001U ///< API version (main[31:16].sub[15:0])
|
||||||
|
|
||||||
|
#define osCMSIS_FreeRTOS RTOS_ID_n ///< RTOS identification and version (main[31:16].sub[15:0])
|
||||||
|
|
||||||
|
#define osKernelSystemId RTOS_ID_s ///< RTOS identification string
|
||||||
|
|
||||||
#define osFeature_MainThread 0 ///< main thread 1=main can be thread, 0=not available
|
#define osFeature_MainThread 0 ///< main thread 1=main can be thread, 0=not available
|
||||||
#define osFeature_Signals 24U ///< maximum number of Signal Flags available per thread
|
#define osFeature_Signals 24U ///< maximum number of Signal Flags available per thread
|
||||||
#define osFeature_Semaphore 65535U ///< maximum count for \ref osSemaphoreCreate function
|
#define osFeature_Semaphore 65535U ///< maximum count for \ref osSemaphoreCreate function
|
||||||
|
|
@ -134,7 +143,7 @@
|
||||||
#define osFeature_Pool 0 ///< Memory Pools: 1=available, 0=not available
|
#define osFeature_Pool 0 ///< Memory Pools: 1=available, 0=not available
|
||||||
#define osFeature_MessageQ 1 ///< Message Queues: 1=available, 0=not available
|
#define osFeature_MessageQ 1 ///< Message Queues: 1=available, 0=not available
|
||||||
#define osFeature_MailQ 0 ///< Mail Queues: 1=available, 0=not available
|
#define osFeature_MailQ 0 ///< Mail Queues: 1=available, 0=not available
|
||||||
|
|
||||||
#if defined(__CC_ARM)
|
#if defined(__CC_ARM)
|
||||||
#define os_InRegs __value_in_regs
|
#define os_InRegs __value_in_regs
|
||||||
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
|
@ -142,18 +151,17 @@
|
||||||
#else
|
#else
|
||||||
#define os_InRegs
|
#define os_InRegs
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cmsis_os2.h"
|
#include "cmsis_os2.h"
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ==== Enumerations, structures, defines ====
|
// ==== Enumerations, structures, defines ====
|
||||||
|
|
||||||
/// Priority values.
|
/// Priority values.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
@ -173,10 +181,10 @@ typedef enum {
|
||||||
|
|
||||||
/// Entry point of a thread.
|
/// Entry point of a thread.
|
||||||
typedef void (*os_pthread) (void const *argument);
|
typedef void (*os_pthread) (void const *argument);
|
||||||
|
|
||||||
/// Entry point of a timer call back function.
|
/// Entry point of a timer call back function.
|
||||||
typedef void (*os_ptimer) (void const *argument);
|
typedef void (*os_ptimer) (void const *argument);
|
||||||
|
|
||||||
/// Timer type.
|
/// Timer type.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
@ -186,10 +194,10 @@ typedef enum {
|
||||||
#else
|
#else
|
||||||
#define os_timer_type osTimerType_t
|
#define os_timer_type osTimerType_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Timeout value.
|
/// Timeout value.
|
||||||
#define osWaitForever 0xFFFFFFFFU ///< Wait forever timeout value.
|
#define osWaitForever 0xFFFFFFFFU ///< Wait forever timeout value.
|
||||||
|
|
||||||
/// Status code values returned by CMSIS-RTOS functions.
|
/// Status code values returned by CMSIS-RTOS functions.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
@ -221,48 +229,48 @@ typedef int32_t osStatus;
|
||||||
#define osErrorValue (-127)
|
#define osErrorValue (-127)
|
||||||
#define osErrorPriority (-128)
|
#define osErrorPriority (-128)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// >>> the following data type definitions may be adapted towards a specific RTOS
|
// >>> the following data type definitions may be adapted towards a specific RTOS
|
||||||
|
|
||||||
/// Thread ID identifies the thread.
|
/// Thread ID identifies the thread.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef void *osThreadId;
|
typedef void *osThreadId;
|
||||||
#else
|
#else
|
||||||
#define osThreadId osThreadId_t
|
#define osThreadId osThreadId_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Timer ID identifies the timer.
|
/// Timer ID identifies the timer.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef void *osTimerId;
|
typedef void *osTimerId;
|
||||||
#else
|
#else
|
||||||
#define osTimerId osTimerId_t
|
#define osTimerId osTimerId_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Mutex ID identifies the mutex.
|
/// Mutex ID identifies the mutex.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef void *osMutexId;
|
typedef void *osMutexId;
|
||||||
#else
|
#else
|
||||||
#define osMutexId osMutexId_t
|
#define osMutexId osMutexId_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Semaphore ID identifies the semaphore.
|
/// Semaphore ID identifies the semaphore.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef void *osSemaphoreId;
|
typedef void *osSemaphoreId;
|
||||||
#else
|
#else
|
||||||
#define osSemaphoreId osSemaphoreId_t
|
#define osSemaphoreId osSemaphoreId_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Pool ID identifies the memory pool.
|
/// Pool ID identifies the memory pool.
|
||||||
typedef void *osPoolId;
|
typedef void *osPoolId;
|
||||||
|
|
||||||
/// Message ID identifies the message queue.
|
/// Message ID identifies the message queue.
|
||||||
typedef void *osMessageQId;
|
typedef void *osMessageQId;
|
||||||
|
|
||||||
/// Mail ID identifies the mail queue.
|
/// Mail ID identifies the mail queue.
|
||||||
typedef void *osMailQId;
|
typedef void *osMailQId;
|
||||||
|
|
||||||
|
|
||||||
/// Thread Definition structure contains startup information of a thread.
|
/// Thread Definition structure contains startup information of a thread.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef struct os_thread_def {
|
typedef struct os_thread_def {
|
||||||
|
|
@ -277,7 +285,7 @@ typedef struct os_thread_def {
|
||||||
osThreadAttr_t attr; ///< thread attributes
|
osThreadAttr_t attr; ///< thread attributes
|
||||||
} osThreadDef_t;
|
} osThreadDef_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Timer Definition structure contains timer parameters.
|
/// Timer Definition structure contains timer parameters.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef struct os_timer_def {
|
typedef struct os_timer_def {
|
||||||
|
|
@ -289,7 +297,7 @@ typedef struct os_timer_def {
|
||||||
osTimerAttr_t attr; ///< timer attributes
|
osTimerAttr_t attr; ///< timer attributes
|
||||||
} osTimerDef_t;
|
} osTimerDef_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Mutex Definition structure contains setup information for a mutex.
|
/// Mutex Definition structure contains setup information for a mutex.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef struct os_mutex_def {
|
typedef struct os_mutex_def {
|
||||||
|
|
@ -298,7 +306,7 @@ typedef struct os_mutex_def {
|
||||||
#else
|
#else
|
||||||
#define osMutexDef_t osMutexAttr_t
|
#define osMutexDef_t osMutexAttr_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Semaphore Definition structure contains setup information for a semaphore.
|
/// Semaphore Definition structure contains setup information for a semaphore.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef struct os_semaphore_def {
|
typedef struct os_semaphore_def {
|
||||||
|
|
@ -307,7 +315,7 @@ typedef struct os_semaphore_def {
|
||||||
#else
|
#else
|
||||||
#define osSemaphoreDef_t osSemaphoreAttr_t
|
#define osSemaphoreDef_t osSemaphoreAttr_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Definition structure for memory block allocation.
|
/// Definition structure for memory block allocation.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef struct os_pool_def {
|
typedef struct os_pool_def {
|
||||||
|
|
@ -322,7 +330,7 @@ typedef struct os_pool_def {
|
||||||
osMemoryPoolAttr_t attr; ///< memory pool attributes
|
osMemoryPoolAttr_t attr; ///< memory pool attributes
|
||||||
} osPoolDef_t;
|
} osPoolDef_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Definition structure for message queue.
|
/// Definition structure for message queue.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef struct os_messageQ_def {
|
typedef struct os_messageQ_def {
|
||||||
|
|
@ -335,7 +343,7 @@ typedef struct os_messageQ_def {
|
||||||
osMessageQueueAttr_t attr; ///< message queue attributes
|
osMessageQueueAttr_t attr; ///< message queue attributes
|
||||||
} osMessageQDef_t;
|
} osMessageQDef_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Definition structure for mail queue.
|
/// Definition structure for mail queue.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
typedef struct os_mailQ_def {
|
typedef struct os_mailQ_def {
|
||||||
|
|
@ -352,8 +360,8 @@ typedef struct os_mailQ_def {
|
||||||
osMessageQueueAttr_t mq_attr; ///< message queue attributes
|
osMessageQueueAttr_t mq_attr; ///< message queue attributes
|
||||||
} osMailQDef_t;
|
} osMailQDef_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/// Event structure contains detailed information about an event.
|
/// Event structure contains detailed information about an event.
|
||||||
typedef struct {
|
typedef struct {
|
||||||
osStatus status; ///< status code: event or error information
|
osStatus status; ///< status code: event or error information
|
||||||
|
|
@ -367,44 +375,44 @@ typedef struct {
|
||||||
osMessageQId message_id; ///< message id obtained by \ref osMessageCreate
|
osMessageQId message_id; ///< message id obtained by \ref osMessageCreate
|
||||||
} def; ///< event definition
|
} def; ///< event definition
|
||||||
} osEvent;
|
} osEvent;
|
||||||
|
|
||||||
|
|
||||||
// ==== Kernel Management Functions ====
|
// ==== Kernel Management Functions ====
|
||||||
|
|
||||||
/// Initialize the RTOS Kernel for creating objects.
|
/// Initialize the RTOS Kernel for creating objects.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osKernelInitialize (void);
|
osStatus osKernelInitialize (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Start the RTOS Kernel scheduler.
|
/// Start the RTOS Kernel scheduler.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osKernelStart (void);
|
osStatus osKernelStart (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Check if the RTOS kernel is already started.
|
/// Check if the RTOS kernel is already started.
|
||||||
/// \return 0 RTOS is not started, 1 RTOS is started.
|
/// \return 0 RTOS is not started, 1 RTOS is started.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
int32_t osKernelRunning(void);
|
int32_t osKernelRunning(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(osFeature_SysTick) && (osFeature_SysTick != 0)) // System Timer available
|
#if (defined(osFeature_SysTick) && (osFeature_SysTick != 0)) // System Timer available
|
||||||
|
|
||||||
/// Get the RTOS kernel system timer counter.
|
/// Get the RTOS kernel system timer counter.
|
||||||
/// \return RTOS kernel system timer as 32-bit value
|
/// \return RTOS kernel system timer as 32-bit value
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
uint32_t osKernelSysTick (void);
|
uint32_t osKernelSysTick (void);
|
||||||
#else
|
#else
|
||||||
#define osKernelSysTick osKernelGetSysTimerCount
|
#define osKernelSysTick osKernelGetSysTimerCount
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// The RTOS kernel system timer frequency in Hz.
|
/// The RTOS kernel system timer frequency in Hz.
|
||||||
/// \note Reflects the system timer setting and is typically defined in a configuration file.
|
/// \note Reflects the system timer setting and is typically defined in a configuration file.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
#define osKernelSysTickFrequency 100000000
|
#define osKernelSysTickFrequency 100000000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Convert a microseconds value to a RTOS kernel system timer value.
|
/// Convert a microseconds value to a RTOS kernel system timer value.
|
||||||
/// \param microsec time value in microseconds.
|
/// \param microsec time value in microseconds.
|
||||||
/// \return time value normalized to the \ref osKernelSysTickFrequency
|
/// \return time value normalized to the \ref osKernelSysTickFrequency
|
||||||
|
|
@ -413,23 +421,23 @@ uint32_t osKernelSysTick (void);
|
||||||
#else
|
#else
|
||||||
#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * osKernelGetSysTimerFreq()) / 1000000)
|
#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * osKernelGetSysTimerFreq()) / 1000000)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // System Timer available
|
#endif // System Timer available
|
||||||
|
|
||||||
|
|
||||||
// ==== Thread Management Functions ====
|
// ==== Thread Management Functions ====
|
||||||
|
|
||||||
/// Create a Thread Definition with function, priority, and stack requirements.
|
/// Create a Thread Definition with function, priority, and stack requirements.
|
||||||
/// \param name name of the thread function.
|
/// \param name name of the thread function.
|
||||||
/// \param priority initial priority of the thread function.
|
/// \param priority initial priority of the thread function.
|
||||||
/// \param instances number of possible thread instances (used to statically allocate memory).
|
/// \param instances number of possible thread instances.
|
||||||
/// \param stacksz stack size (in bytes) requirements for the thread function.
|
/// \param stacksz stack size (in bytes) requirements for the thread function.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osThreadDef(name, priority, instances, stacksz) \
|
#define osThreadDef(name, priority, instances, stacksz) \
|
||||||
extern const osThreadDef_t os_thread_def_##name
|
extern const osThreadDef_t os_thread_def_##name
|
||||||
#else // define the object
|
#else // define the object
|
||||||
#define osThreadDef(name, priority, instances, stacksz) \
|
#define osThreadDef(name, priority, instances, stacksz) \
|
||||||
static uint32_t os_thread_stack##name[(stacksz)?(((stacksz+3)/4)):1]; \
|
static uint64_t os_thread_stack##name[(stacksz)?(((stacksz+7)/8)):1]; \
|
||||||
static StaticTask_t os_thread_cb_##name; \
|
static StaticTask_t os_thread_cb_##name; \
|
||||||
const osThreadDef_t os_thread_def_##name = \
|
const osThreadDef_t os_thread_def_##name = \
|
||||||
{ (name), \
|
{ (name), \
|
||||||
|
|
@ -437,27 +445,27 @@ const osThreadDef_t os_thread_def_##name = \
|
||||||
(instances == 1) ? (&os_thread_cb_##name) : NULL,\
|
(instances == 1) ? (&os_thread_cb_##name) : NULL,\
|
||||||
(instances == 1) ? sizeof(StaticTask_t) : 0U, \
|
(instances == 1) ? sizeof(StaticTask_t) : 0U, \
|
||||||
((stacksz) && (instances == 1)) ? (&os_thread_stack##name) : NULL, \
|
((stacksz) && (instances == 1)) ? (&os_thread_stack##name) : NULL, \
|
||||||
4*((stacksz+3)/4), \
|
8*((stacksz+7)/8), \
|
||||||
(priority), 0U, 0U } }
|
(priority), 0U, 0U } }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Access a Thread definition.
|
/// Access a Thread definition.
|
||||||
/// \param name name of the thread definition object.
|
/// \param name name of the thread definition object.
|
||||||
#define osThread(name) \
|
#define osThread(name) \
|
||||||
&os_thread_def_##name
|
&os_thread_def_##name
|
||||||
|
|
||||||
/// Create a thread and add it to Active Threads and set it to state READY.
|
/// Create a thread and add it to Active Threads and set it to state READY.
|
||||||
/// \param[in] thread_def thread definition referenced with \ref osThread.
|
/// \param[in] thread_def thread definition referenced with \ref osThread.
|
||||||
/// \param[in] argument pointer that is passed to the thread function as start argument.
|
/// \param[in] argument pointer that is passed to the thread function as start argument.
|
||||||
/// \return thread ID for reference by other functions or NULL in case of error.
|
/// \return thread ID for reference by other functions or NULL in case of error.
|
||||||
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument);
|
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument);
|
||||||
|
|
||||||
/// Return the thread ID of the current running thread.
|
/// Return the thread ID of the current running thread.
|
||||||
/// \return thread ID for reference by other functions or NULL in case of error.
|
/// \return thread ID for reference by other functions or NULL in case of error.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osThreadId osThreadGetId (void);
|
osThreadId osThreadGetId (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Change priority of a thread.
|
/// Change priority of a thread.
|
||||||
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
||||||
/// \param[in] priority new priority value for the thread function.
|
/// \param[in] priority new priority value for the thread function.
|
||||||
|
|
@ -465,70 +473,70 @@ osThreadId osThreadGetId (void);
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority);
|
osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Get current priority of a thread.
|
/// Get current priority of a thread.
|
||||||
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
||||||
/// \return current priority value of the specified thread.
|
/// \return current priority value of the specified thread.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osPriority osThreadGetPriority (osThreadId thread_id);
|
osPriority osThreadGetPriority (osThreadId thread_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Pass control to next thread that is in state \b READY.
|
/// Pass control to next thread that is in state \b READY.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osThreadYield (void);
|
osStatus osThreadYield (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Terminate execution of a thread.
|
/// Terminate execution of a thread.
|
||||||
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osThreadTerminate (osThreadId thread_id);
|
osStatus osThreadTerminate (osThreadId thread_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ==== Signal Management ====
|
// ==== Signal Management ====
|
||||||
|
|
||||||
/// Set the specified Signal Flags of an active thread.
|
/// Set the specified Signal Flags of an active thread.
|
||||||
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
||||||
/// \param[in] signals specifies the signal flags of the thread that should be set.
|
/// \param[in] signals specifies the signal flags of the thread that should be set.
|
||||||
/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters.
|
/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters.
|
||||||
int32_t osSignalSet (osThreadId thread_id, int32_t signals);
|
int32_t osSignalSet (osThreadId thread_id, int32_t signals);
|
||||||
|
|
||||||
/// Clear the specified Signal Flags of an active thread.
|
/// Clear the specified Signal Flags of an active thread.
|
||||||
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
||||||
/// \param[in] signals specifies the signal flags of the thread that shall be cleared.
|
/// \param[in] signals specifies the signal flags of the thread that shall be cleared.
|
||||||
/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters or call from ISR.
|
/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters or call from ISR.
|
||||||
int32_t osSignalClear (osThreadId thread_id, int32_t signals);
|
int32_t osSignalClear (osThreadId thread_id, int32_t signals);
|
||||||
|
|
||||||
/// Wait for one or more Signal Flags to become signaled for the current \b RUNNING thread.
|
/// Wait for one or more Signal Flags to become signaled for the current \b RUNNING thread.
|
||||||
/// \param[in] signals wait until all specified signal flags set or 0 for any single signal flag.
|
/// \param[in] signals wait until all specified signal flags set or 0 for any single signal flag.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
||||||
/// \return event flag information or error code.
|
/// \return event flag information or error code.
|
||||||
os_InRegs osEvent osSignalWait (int32_t signals, uint32_t millisec);
|
os_InRegs osEvent osSignalWait (int32_t signals, uint32_t millisec);
|
||||||
|
|
||||||
|
|
||||||
// ==== Generic Wait Functions ====
|
// ==== Generic Wait Functions ====
|
||||||
|
|
||||||
/// Wait for Timeout (Time Delay).
|
/// Wait for Timeout (Time Delay).
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osDelay (uint32_t millisec);
|
osStatus osDelay (uint32_t millisec);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined (osFeature_Wait) && (osFeature_Wait != 0)) // Generic Wait available
|
#if (defined (osFeature_Wait) && (osFeature_Wait != 0)) // Generic Wait available
|
||||||
|
|
||||||
/// Wait for Signal, Message, Mail, or Timeout.
|
/// Wait for Signal, Message, Mail, or Timeout.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out
|
||||||
/// \return event that contains signal, message, or mail information or error code.
|
/// \return event that contains signal, message, or mail information or error code.
|
||||||
os_InRegs osEvent osWait (uint32_t millisec);
|
os_InRegs osEvent osWait (uint32_t millisec);
|
||||||
|
|
||||||
#endif // Generic Wait available
|
#endif // Generic Wait available
|
||||||
|
|
||||||
|
|
||||||
// ==== Timer Management Functions ====
|
// ==== Timer Management Functions ====
|
||||||
|
|
||||||
/// Define a Timer object.
|
/// Define a Timer object.
|
||||||
/// \param name name of the timer object.
|
/// \param name name of the timer object.
|
||||||
/// \param function name of the timer call back function.
|
/// \param function name of the timer call back function.
|
||||||
|
|
@ -541,19 +549,19 @@ static StaticTimer_t os_timer_cb_##name; \
|
||||||
const osTimerDef_t os_timer_def_##name = \
|
const osTimerDef_t os_timer_def_##name = \
|
||||||
{ (function), { NULL, 0U, (&os_timer_cb_##name), sizeof(StaticTimer_t) } }
|
{ (function), { NULL, 0U, (&os_timer_cb_##name), sizeof(StaticTimer_t) } }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Access a Timer definition.
|
/// Access a Timer definition.
|
||||||
/// \param name name of the timer object.
|
/// \param name name of the timer object.
|
||||||
#define osTimer(name) \
|
#define osTimer(name) \
|
||||||
&os_timer_def_##name
|
&os_timer_def_##name
|
||||||
|
|
||||||
/// Create and Initialize a timer.
|
/// Create and Initialize a timer.
|
||||||
/// \param[in] timer_def timer object referenced with \ref osTimer.
|
/// \param[in] timer_def timer object referenced with \ref osTimer.
|
||||||
/// \param[in] type osTimerOnce for one-shot or osTimerPeriodic for periodic behavior.
|
/// \param[in] type osTimerOnce for one-shot or osTimerPeriodic for periodic behavior.
|
||||||
/// \param[in] argument argument to the timer call back function.
|
/// \param[in] argument argument to the timer call back function.
|
||||||
/// \return timer ID for reference by other functions or NULL in case of error.
|
/// \return timer ID for reference by other functions or NULL in case of error.
|
||||||
osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument);
|
osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument);
|
||||||
|
|
||||||
/// Start or restart a timer.
|
/// Start or restart a timer.
|
||||||
/// \param[in] timer_id timer ID obtained by \ref osTimerCreate.
|
/// \param[in] timer_id timer ID obtained by \ref osTimerCreate.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value of the timer.
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value of the timer.
|
||||||
|
|
@ -561,24 +569,24 @@ osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osTimerStart (osTimerId timer_id, uint32_t millisec);
|
osStatus osTimerStart (osTimerId timer_id, uint32_t millisec);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Stop a timer.
|
/// Stop a timer.
|
||||||
/// \param[in] timer_id timer ID obtained by \ref osTimerCreate.
|
/// \param[in] timer_id timer ID obtained by \ref osTimerCreate.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osTimerStop (osTimerId timer_id);
|
osStatus osTimerStop (osTimerId timer_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Delete a timer.
|
/// Delete a timer.
|
||||||
/// \param[in] timer_id timer ID obtained by \ref osTimerCreate.
|
/// \param[in] timer_id timer ID obtained by \ref osTimerCreate.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osTimerDelete (osTimerId timer_id);
|
osStatus osTimerDelete (osTimerId timer_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ==== Mutex Management Functions ====
|
// ==== Mutex Management Functions ====
|
||||||
|
|
||||||
/// Define a Mutex.
|
/// Define a Mutex.
|
||||||
/// \param name name of the mutex object.
|
/// \param name name of the mutex object.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
|
|
@ -590,17 +598,17 @@ static StaticSemaphore_t os_mutex_cb_##name; \
|
||||||
const osMutexDef_t os_mutex_def_##name = \
|
const osMutexDef_t os_mutex_def_##name = \
|
||||||
{ NULL, osMutexRecursive | osMutexPrioInherit, (&os_mutex_cb_##name), sizeof(StaticSemaphore_t) }
|
{ NULL, osMutexRecursive | osMutexPrioInherit, (&os_mutex_cb_##name), sizeof(StaticSemaphore_t) }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Access a Mutex definition.
|
/// Access a Mutex definition.
|
||||||
/// \param name name of the mutex object.
|
/// \param name name of the mutex object.
|
||||||
#define osMutex(name) \
|
#define osMutex(name) \
|
||||||
&os_mutex_def_##name
|
&os_mutex_def_##name
|
||||||
|
|
||||||
/// Create and Initialize a Mutex object.
|
/// Create and Initialize a Mutex object.
|
||||||
/// \param[in] mutex_def mutex definition referenced with \ref osMutex.
|
/// \param[in] mutex_def mutex definition referenced with \ref osMutex.
|
||||||
/// \return mutex ID for reference by other functions or NULL in case of error.
|
/// \return mutex ID for reference by other functions or NULL in case of error.
|
||||||
osMutexId osMutexCreate (const osMutexDef_t *mutex_def);
|
osMutexId osMutexCreate (const osMutexDef_t *mutex_def);
|
||||||
|
|
||||||
/// Wait until a Mutex becomes available.
|
/// Wait until a Mutex becomes available.
|
||||||
/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate.
|
/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
||||||
|
|
@ -610,26 +618,26 @@ osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec);
|
||||||
#else
|
#else
|
||||||
#define osMutexWait osMutexAcquire
|
#define osMutexWait osMutexAcquire
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Release a Mutex that was obtained by \ref osMutexWait.
|
/// Release a Mutex that was obtained by \ref osMutexWait.
|
||||||
/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate.
|
/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osMutexRelease (osMutexId mutex_id);
|
osStatus osMutexRelease (osMutexId mutex_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Delete a Mutex object.
|
/// Delete a Mutex object.
|
||||||
/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate.
|
/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osMutexDelete (osMutexId mutex_id);
|
osStatus osMutexDelete (osMutexId mutex_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ==== Semaphore Management Functions ====
|
// ==== Semaphore Management Functions ====
|
||||||
|
|
||||||
#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0U)) // Semaphore available
|
#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0U)) // Semaphore available
|
||||||
|
|
||||||
/// Define a Semaphore object.
|
/// Define a Semaphore object.
|
||||||
/// \param name name of the semaphore object.
|
/// \param name name of the semaphore object.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
|
|
@ -641,45 +649,45 @@ static StaticSemaphore_t os_semaphore_cb_##name; \
|
||||||
const osSemaphoreDef_t os_semaphore_def_##name = \
|
const osSemaphoreDef_t os_semaphore_def_##name = \
|
||||||
{ NULL, 0U, (&os_semaphore_cb_##name), sizeof(StaticSemaphore_t) }
|
{ NULL, 0U, (&os_semaphore_cb_##name), sizeof(StaticSemaphore_t) }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Access a Semaphore definition.
|
/// Access a Semaphore definition.
|
||||||
/// \param name name of the semaphore object.
|
/// \param name name of the semaphore object.
|
||||||
#define osSemaphore(name) \
|
#define osSemaphore(name) \
|
||||||
&os_semaphore_def_##name
|
&os_semaphore_def_##name
|
||||||
|
|
||||||
/// Create and Initialize a Semaphore object.
|
/// Create and Initialize a Semaphore object.
|
||||||
/// \param[in] semaphore_def semaphore definition referenced with \ref osSemaphore.
|
/// \param[in] semaphore_def semaphore definition referenced with \ref osSemaphore.
|
||||||
/// \param[in] count maximum and initial number of available tokens.
|
/// \param[in] count maximum and initial number of available tokens.
|
||||||
/// \return semaphore ID for reference by other functions or NULL in case of error.
|
/// \return semaphore ID for reference by other functions or NULL in case of error.
|
||||||
osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count);
|
osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count);
|
||||||
|
|
||||||
/// Wait until a Semaphore token becomes available.
|
/// Wait until a Semaphore token becomes available.
|
||||||
/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate.
|
/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
||||||
/// \return number of available tokens, or -1 in case of incorrect parameters.
|
/// \return number of available tokens, or -1 in case of incorrect parameters.
|
||||||
int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec);
|
int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec);
|
||||||
|
|
||||||
/// Release a Semaphore token.
|
/// Release a Semaphore token.
|
||||||
/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate.
|
/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osSemaphoreRelease (osSemaphoreId semaphore_id);
|
osStatus osSemaphoreRelease (osSemaphoreId semaphore_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Delete a Semaphore object.
|
/// Delete a Semaphore object.
|
||||||
/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate.
|
/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
#if (osCMSIS < 0x20000U)
|
#if (osCMSIS < 0x20000U)
|
||||||
osStatus osSemaphoreDelete (osSemaphoreId semaphore_id);
|
osStatus osSemaphoreDelete (osSemaphoreId semaphore_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // Semaphore available
|
#endif // Semaphore available
|
||||||
|
|
||||||
|
|
||||||
// ==== Memory Pool Management Functions ====
|
// ==== Memory Pool Management Functions ====
|
||||||
|
|
||||||
#if (defined(osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool available
|
#if (defined(osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool available
|
||||||
|
|
||||||
/// \brief Define a Memory Pool.
|
/// \brief Define a Memory Pool.
|
||||||
/// \param name name of the memory pool.
|
/// \param name name of the memory pool.
|
||||||
/// \param no maximum number of blocks (objects) in the memory pool.
|
/// \param no maximum number of blocks (objects) in the memory pool.
|
||||||
|
|
@ -690,42 +698,42 @@ extern const osPoolDef_t os_pool_def_##name
|
||||||
#else // define the object
|
#else // define the object
|
||||||
#define osPoolDef(name, no, type) \
|
#define osPoolDef(name, no, type) \
|
||||||
const osPoolDef_t os_pool_def_##name = \
|
const osPoolDef_t os_pool_def_##name = \
|
||||||
{ (no), sizeof(type), NULL }
|
{ (no), sizeof(type), {NULL} }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// \brief Access a Memory Pool definition.
|
/// \brief Access a Memory Pool definition.
|
||||||
/// \param name name of the memory pool
|
/// \param name name of the memory pool
|
||||||
#define osPool(name) \
|
#define osPool(name) \
|
||||||
&os_pool_def_##name
|
&os_pool_def_##name
|
||||||
|
|
||||||
/// Create and Initialize a Memory Pool object.
|
/// Create and Initialize a Memory Pool object.
|
||||||
/// \param[in] pool_def memory pool definition referenced with \ref osPool.
|
/// \param[in] pool_def memory pool definition referenced with \ref osPool.
|
||||||
/// \return memory pool ID for reference by other functions or NULL in case of error.
|
/// \return memory pool ID for reference by other functions or NULL in case of error.
|
||||||
osPoolId osPoolCreate (const osPoolDef_t *pool_def);
|
osPoolId osPoolCreate (const osPoolDef_t *pool_def);
|
||||||
|
|
||||||
/// Allocate a memory block from a Memory Pool.
|
/// Allocate a memory block from a Memory Pool.
|
||||||
/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate.
|
/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate.
|
||||||
/// \return address of the allocated memory block or NULL in case of no memory available.
|
/// \return address of the allocated memory block or NULL in case of no memory available.
|
||||||
void *osPoolAlloc (osPoolId pool_id);
|
void *osPoolAlloc (osPoolId pool_id);
|
||||||
|
|
||||||
/// Allocate a memory block from a Memory Pool and set memory block to zero.
|
/// Allocate a memory block from a Memory Pool and set memory block to zero.
|
||||||
/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate.
|
/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate.
|
||||||
/// \return address of the allocated memory block or NULL in case of no memory available.
|
/// \return address of the allocated memory block or NULL in case of no memory available.
|
||||||
void *osPoolCAlloc (osPoolId pool_id);
|
void *osPoolCAlloc (osPoolId pool_id);
|
||||||
|
|
||||||
/// Return an allocated memory block back to a Memory Pool.
|
/// Return an allocated memory block back to a Memory Pool.
|
||||||
/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate.
|
/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate.
|
||||||
/// \param[in] block address of the allocated memory block to be returned to the memory pool.
|
/// \param[in] block address of the allocated memory block to be returned to the memory pool.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
osStatus osPoolFree (osPoolId pool_id, void *block);
|
osStatus osPoolFree (osPoolId pool_id, void *block);
|
||||||
|
|
||||||
#endif // Memory Pool available
|
#endif // Memory Pool available
|
||||||
|
|
||||||
|
|
||||||
// ==== Message Queue Management Functions ====
|
// ==== Message Queue Management Functions ====
|
||||||
|
|
||||||
#if (defined(osFeature_MessageQ) && (osFeature_MessageQ != 0)) // Message Queue available
|
#if (defined(osFeature_MessageQ) && (osFeature_MessageQ != 0)) // Message Queue available
|
||||||
|
|
||||||
/// \brief Create a Message Queue Definition.
|
/// \brief Create a Message Queue Definition.
|
||||||
/// \param name name of the queue.
|
/// \param name name of the queue.
|
||||||
/// \param queue_sz maximum number of messages in the queue.
|
/// \param queue_sz maximum number of messages in the queue.
|
||||||
|
|
@ -742,38 +750,38 @@ const osMessageQDef_t os_messageQ_def_##name = \
|
||||||
{ NULL, 0U, (&os_mq_cb_##name), sizeof(StaticQueue_t), \
|
{ NULL, 0U, (&os_mq_cb_##name), sizeof(StaticQueue_t), \
|
||||||
(&os_mq_data_##name), sizeof(os_mq_data_##name) } }
|
(&os_mq_data_##name), sizeof(os_mq_data_##name) } }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// \brief Access a Message Queue Definition.
|
/// \brief Access a Message Queue Definition.
|
||||||
/// \param name name of the queue
|
/// \param name name of the queue
|
||||||
#define osMessageQ(name) \
|
#define osMessageQ(name) \
|
||||||
&os_messageQ_def_##name
|
&os_messageQ_def_##name
|
||||||
|
|
||||||
/// Create and Initialize a Message Queue object.
|
/// Create and Initialize a Message Queue object.
|
||||||
/// \param[in] queue_def message queue definition referenced with \ref osMessageQ.
|
/// \param[in] queue_def message queue definition referenced with \ref osMessageQ.
|
||||||
/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL.
|
/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL.
|
||||||
/// \return message queue ID for reference by other functions or NULL in case of error.
|
/// \return message queue ID for reference by other functions or NULL in case of error.
|
||||||
osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id);
|
osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id);
|
||||||
|
|
||||||
/// Put a Message to a Queue.
|
/// Put a Message to a Queue.
|
||||||
/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate.
|
/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate.
|
||||||
/// \param[in] info message information.
|
/// \param[in] info message information.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);
|
osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);
|
||||||
|
|
||||||
/// Get a Message from a Queue or timeout if Queue is empty.
|
/// Get a Message from a Queue or timeout if Queue is empty.
|
||||||
/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate.
|
/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
||||||
/// \return event information that includes status code.
|
/// \return event information that includes status code.
|
||||||
os_InRegs osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec);
|
os_InRegs osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec);
|
||||||
|
|
||||||
#endif // Message Queue available
|
#endif // Message Queue available
|
||||||
|
|
||||||
|
|
||||||
// ==== Mail Queue Management Functions ====
|
// ==== Mail Queue Management Functions ====
|
||||||
|
|
||||||
#if (defined(osFeature_MailQ) && (osFeature_MailQ != 0)) // Mail Queue available
|
#if (defined(osFeature_MailQ) && (osFeature_MailQ != 0)) // Mail Queue available
|
||||||
|
|
||||||
/// \brief Create a Mail Queue Definition.
|
/// \brief Create a Mail Queue Definition.
|
||||||
/// \param name name of the queue.
|
/// \param name name of the queue.
|
||||||
/// \param queue_sz maximum number of mails in the queue.
|
/// \param queue_sz maximum number of mails in the queue.
|
||||||
|
|
@ -786,52 +794,53 @@ extern const osMailQDef_t os_mailQ_def_##name
|
||||||
const osMailQDef_t os_mailQ_def_##name = \
|
const osMailQDef_t os_mailQ_def_##name = \
|
||||||
{ (queue_sz), sizeof(type), NULL }
|
{ (queue_sz), sizeof(type), NULL }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// \brief Access a Mail Queue Definition.
|
/// \brief Access a Mail Queue Definition.
|
||||||
/// \param name name of the queue
|
/// \param name name of the queue
|
||||||
#define osMailQ(name) \
|
#define osMailQ(name) \
|
||||||
&os_mailQ_def_##name
|
&os_mailQ_def_##name
|
||||||
|
|
||||||
/// Create and Initialize a Mail Queue object.
|
/// Create and Initialize a Mail Queue object.
|
||||||
/// \param[in] queue_def mail queue definition referenced with \ref osMailQ.
|
/// \param[in] queue_def mail queue definition referenced with \ref osMailQ.
|
||||||
/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL.
|
/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL.
|
||||||
/// \return mail queue ID for reference by other functions or NULL in case of error.
|
/// \return mail queue ID for reference by other functions or NULL in case of error.
|
||||||
osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id);
|
osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id);
|
||||||
|
|
||||||
/// Allocate a memory block for mail from a mail memory pool.
|
/// Allocate a memory block for mail from a mail memory pool.
|
||||||
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out
|
||||||
/// \return pointer to memory block that can be filled with mail or NULL in case of error.
|
/// \return pointer to memory block that can be filled with mail or NULL in case of error.
|
||||||
void *osMailAlloc (osMailQId queue_id, uint32_t millisec);
|
void *osMailAlloc (osMailQId queue_id, uint32_t millisec);
|
||||||
|
|
||||||
/// Allocate a memory block for mail from a mail memory pool and set memory block to zero.
|
/// Allocate a memory block for mail from a mail memory pool and set memory block to zero.
|
||||||
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out
|
||||||
/// \return pointer to memory block that can be filled with mail or NULL in case of error.
|
/// \return pointer to memory block that can be filled with mail or NULL in case of error.
|
||||||
void *osMailCAlloc (osMailQId queue_id, uint32_t millisec);
|
void *osMailCAlloc (osMailQId queue_id, uint32_t millisec);
|
||||||
|
|
||||||
/// Put a Mail into a Queue.
|
/// Put a Mail into a Queue.
|
||||||
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
||||||
/// \param[in] mail pointer to memory with mail to put into a queue.
|
/// \param[in] mail pointer to memory with mail to put into a queue.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
osStatus osMailPut (osMailQId queue_id, const void *mail);
|
osStatus osMailPut (osMailQId queue_id, const void *mail);
|
||||||
|
|
||||||
/// Get a Mail from a Queue or timeout if Queue is empty.
|
/// Get a Mail from a Queue or timeout if Queue is empty.
|
||||||
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
||||||
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
|
||||||
/// \return event information that includes status code.
|
/// \return event information that includes status code.
|
||||||
os_InRegs osEvent osMailGet (osMailQId queue_id, uint32_t millisec);
|
os_InRegs osEvent osMailGet (osMailQId queue_id, uint32_t millisec);
|
||||||
|
|
||||||
/// Free a memory block by returning it to a mail memory pool.
|
/// Free a memory block by returning it to a mail memory pool.
|
||||||
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate.
|
||||||
/// \param[in] mail pointer to memory block that was obtained with \ref osMailGet.
|
/// \param[in] mail pointer to memory block that was obtained with \ref osMailGet.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
osStatus osMailFree (osMailQId queue_id, void *mail);
|
osStatus osMailFree (osMailQId queue_id, void *mail);
|
||||||
|
|
||||||
#endif // Mail Queue available
|
#endif // Mail Queue available
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // CMSIS_OS_H_
|
#endif // CMSIS_OS_H_
|
||||||
|
|
|
||||||
|
|
@ -1,368 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------
|
|
||||||
* Portions Copyright (c) 2013-2017 ARM Limited. All rights reserved.
|
|
||||||
* Portions Copyright © 2017 STMicroelectronics International N.V. All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the License); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* Project: CMSIS-RTOS API V1
|
|
||||||
* Title: cmsis_os1.c V1 module file
|
|
||||||
*
|
|
||||||
*----------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "cmsis_os.h"
|
|
||||||
|
|
||||||
#if (osCMSIS >= 0x20000U) && !defined(os1_Disable)
|
|
||||||
|
|
||||||
|
|
||||||
// Thread
|
|
||||||
#if !defined(os1_Disable_Thread)
|
|
||||||
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) {
|
|
||||||
|
|
||||||
if (thread_def == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return osThreadNew((osThreadFunc_t)thread_def->pthread, argument, &thread_def->attr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Signals
|
|
||||||
|
|
||||||
#if !defined(os1_Disable_Signal)
|
|
||||||
|
|
||||||
#define SignalMask ((1U<<osFeature_Signals)-1U)
|
|
||||||
|
|
||||||
int32_t osSignalSet (osThreadId thread_id, int32_t signals) {
|
|
||||||
uint32_t flags;
|
|
||||||
|
|
||||||
flags = osThreadFlagsSet(thread_id, (uint32_t)signals);
|
|
||||||
if ((flags & 0x80000000U) != 0U) {
|
|
||||||
return ((int32_t)0x80000000U);
|
|
||||||
}
|
|
||||||
return ((int32_t)(flags & ~((uint32_t)signals)));
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t osSignalClear (osThreadId thread_id, int32_t signals) {
|
|
||||||
uint32_t flags;
|
|
||||||
|
|
||||||
if (thread_id != osThreadGetId()) {
|
|
||||||
return ((int32_t)0x80000000U);
|
|
||||||
}
|
|
||||||
flags = osThreadFlagsClear((uint32_t)signals);
|
|
||||||
if ((flags & 0x80000000U) != 0U) {
|
|
||||||
return ((int32_t)0x80000000U);
|
|
||||||
}
|
|
||||||
return ((int32_t)flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
os_InRegs osEvent osSignalWait (int32_t signals, uint32_t millisec) {
|
|
||||||
osEvent event;
|
|
||||||
uint32_t flags;
|
|
||||||
|
|
||||||
if (signals != 0) {
|
|
||||||
flags = osThreadFlagsWait((uint32_t)signals, osFlagsWaitAll, millisec);
|
|
||||||
} else {
|
|
||||||
flags = osThreadFlagsWait(SignalMask, osFlagsWaitAny, millisec);
|
|
||||||
}
|
|
||||||
if ((flags > 0U) && (flags < 0x80000000U)) {
|
|
||||||
event.status = osEventSignal;
|
|
||||||
event.value.signals = (int32_t)flags;
|
|
||||||
} else {
|
|
||||||
switch ((int32_t)flags) {
|
|
||||||
case osErrorResource:
|
|
||||||
event.status = osOK;
|
|
||||||
break;
|
|
||||||
case osErrorTimeout:
|
|
||||||
event.status = osEventTimeout;
|
|
||||||
break;
|
|
||||||
case osErrorParameter:
|
|
||||||
event.status = osErrorValue;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
event.status = (osStatus)flags;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // Signal
|
|
||||||
|
|
||||||
|
|
||||||
// Timer
|
|
||||||
#if !defined(os1_Disable_Timer)
|
|
||||||
osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument) {
|
|
||||||
|
|
||||||
if (timer_def == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return osTimerNew((osTimerFunc_t)timer_def->ptimer, type, argument, &timer_def->attr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Mutex
|
|
||||||
#if !defined(os1_Disable_Mutex)
|
|
||||||
osMutexId osMutexCreate (const osMutexDef_t *mutex_def) {
|
|
||||||
|
|
||||||
if (mutex_def == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return osMutexNew(mutex_def);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Semaphore
|
|
||||||
|
|
||||||
#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0U)) && !defined(os1_Disable_Semaphore)
|
|
||||||
|
|
||||||
osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count) {
|
|
||||||
|
|
||||||
if (semaphore_def == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return osSemaphoreNew((uint32_t)count, (uint32_t)count, semaphore_def);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec) {
|
|
||||||
osStatus_t status;
|
|
||||||
uint32_t count;
|
|
||||||
|
|
||||||
status = osSemaphoreAcquire(semaphore_id, millisec);
|
|
||||||
switch (status) {
|
|
||||||
case osOK:
|
|
||||||
count = osSemaphoreGetCount(semaphore_id);
|
|
||||||
return ((int32_t)count + 1);
|
|
||||||
case osErrorResource:
|
|
||||||
case osErrorTimeout:
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // Semaphore
|
|
||||||
|
|
||||||
|
|
||||||
// Memory Pool
|
|
||||||
|
|
||||||
#if (defined(osFeature_Pool) && (osFeature_Pool != 0))&& !defined(os1_Disable_Pool)
|
|
||||||
|
|
||||||
osPoolId osPoolCreate (const osPoolDef_t *pool_def) {
|
|
||||||
|
|
||||||
if (pool_def == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return osMemoryPoolNew(pool_def->pool_sz, pool_def->item_sz, &pool_def->attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *osPoolAlloc (osPoolId pool_id) {
|
|
||||||
return osMemoryPoolAlloc(pool_id, 0U);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *osPoolCAlloc (osPoolId pool_id) {
|
|
||||||
void *block;
|
|
||||||
uint32_t block_size;
|
|
||||||
|
|
||||||
block_size = osMemoryPoolGetBlockSize((osMemoryPoolId_t)pool_id);
|
|
||||||
if (block_size == 0U) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
block = osMemoryPoolAlloc(pool_id, 0U);
|
|
||||||
if (block != NULL) {
|
|
||||||
memset(block, 0, block_size);
|
|
||||||
}
|
|
||||||
return block;
|
|
||||||
}
|
|
||||||
|
|
||||||
osStatus osPoolFree (osPoolId pool_id, void *block) {
|
|
||||||
return osMemoryPoolFree(pool_id, block);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // Memory Pool
|
|
||||||
|
|
||||||
|
|
||||||
// Message Queue
|
|
||||||
|
|
||||||
#if (defined(osFeature_MessageQ) && (osFeature_MessageQ != 0)) && !defined(os1_Disable_MessageQ)
|
|
||||||
|
|
||||||
osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id) {
|
|
||||||
(void)thread_id;
|
|
||||||
|
|
||||||
if (queue_def == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return osMessageQueueNew(queue_def->queue_sz, sizeof(uint32_t), &queue_def->attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec) {
|
|
||||||
return osMessageQueuePut(queue_id, &info, 0U, millisec);
|
|
||||||
}
|
|
||||||
|
|
||||||
os_InRegs osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec) {
|
|
||||||
osStatus_t status;
|
|
||||||
osEvent event;
|
|
||||||
uint32_t message;
|
|
||||||
|
|
||||||
status = osMessageQueueGet(queue_id, &message, NULL, millisec);
|
|
||||||
switch (status) {
|
|
||||||
case osOK:
|
|
||||||
event.status = osEventMessage;
|
|
||||||
event.value.v = message;
|
|
||||||
break;
|
|
||||||
case osErrorResource:
|
|
||||||
event.status = osOK;
|
|
||||||
break;
|
|
||||||
case osErrorTimeout:
|
|
||||||
event.status = osEventTimeout;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
event.status = status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // Message Queue
|
|
||||||
|
|
||||||
|
|
||||||
// Mail Queue
|
|
||||||
|
|
||||||
#if (defined(osFeature_MailQ) && (osFeature_MailQ != 0)) && !defined(os1_Disable_MailQ)
|
|
||||||
|
|
||||||
typedef struct os_mail_queue_s {
|
|
||||||
osMemoryPoolId_t mp_id;
|
|
||||||
osMessageQueueId_t mq_id;
|
|
||||||
} os_mail_queue_t;
|
|
||||||
|
|
||||||
osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id) {
|
|
||||||
os_mail_queue_t *ptr;
|
|
||||||
(void)thread_id;
|
|
||||||
|
|
||||||
if (queue_def == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = queue_def->mail;
|
|
||||||
if (ptr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr->mp_id = osMemoryPoolNew (queue_def->queue_sz, queue_def->item_sz, &queue_def->mp_attr);
|
|
||||||
ptr->mq_id = osMessageQueueNew(queue_def->queue_sz, sizeof(void *), &queue_def->mq_attr);
|
|
||||||
if ((ptr->mp_id == NULL) || (ptr->mq_id == NULL)) {
|
|
||||||
if (ptr->mp_id != NULL) {
|
|
||||||
osMemoryPoolDelete(ptr->mp_id);
|
|
||||||
}
|
|
||||||
if (ptr->mq_id != NULL) {
|
|
||||||
osMessageQueueDelete(ptr->mq_id);
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *osMailAlloc (osMailQId queue_id, uint32_t millisec) {
|
|
||||||
os_mail_queue_t *ptr = (os_mail_queue_t *)queue_id;
|
|
||||||
|
|
||||||
if (ptr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return osMemoryPoolAlloc(ptr->mp_id, millisec);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *osMailCAlloc (osMailQId queue_id, uint32_t millisec) {
|
|
||||||
os_mail_queue_t *ptr = (os_mail_queue_t *)queue_id;
|
|
||||||
void *block;
|
|
||||||
uint32_t block_size;
|
|
||||||
|
|
||||||
if (ptr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
block_size = osMemoryPoolGetBlockSize(ptr->mp_id);
|
|
||||||
if (block_size == 0U) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
block = osMemoryPoolAlloc(ptr->mp_id, millisec);
|
|
||||||
if (block != NULL) {
|
|
||||||
memset(block, 0, block_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return block;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
osStatus osMailPut (osMailQId queue_id, const void *mail) {
|
|
||||||
os_mail_queue_t *ptr = (os_mail_queue_t *)queue_id;
|
|
||||||
|
|
||||||
if (ptr == NULL) {
|
|
||||||
return osErrorParameter;
|
|
||||||
}
|
|
||||||
if (mail == NULL) {
|
|
||||||
return osErrorValue;
|
|
||||||
}
|
|
||||||
return osMessageQueuePut(ptr->mq_id, &mail, 0U, 0U);
|
|
||||||
}
|
|
||||||
|
|
||||||
os_InRegs osEvent osMailGet (osMailQId queue_id, uint32_t millisec) {
|
|
||||||
os_mail_queue_t *ptr = (os_mail_queue_t *)queue_id;
|
|
||||||
osStatus_t status;
|
|
||||||
osEvent event;
|
|
||||||
void *mail;
|
|
||||||
|
|
||||||
if (ptr == NULL) {
|
|
||||||
event.status = osErrorParameter;
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = osMessageQueueGet(ptr->mq_id, &mail, NULL, millisec);
|
|
||||||
switch (status) {
|
|
||||||
case osOK:
|
|
||||||
event.status = osEventMail;
|
|
||||||
event.value.p = mail;
|
|
||||||
break;
|
|
||||||
case osErrorResource:
|
|
||||||
event.status = osOK;
|
|
||||||
break;
|
|
||||||
case osErrorTimeout:
|
|
||||||
event.status = osEventTimeout;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
event.status = status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
osStatus osMailFree (osMailQId queue_id, void *mail) {
|
|
||||||
os_mail_queue_t *ptr = (os_mail_queue_t *)queue_id;
|
|
||||||
|
|
||||||
if (ptr == NULL) {
|
|
||||||
return osErrorParameter;
|
|
||||||
}
|
|
||||||
if (mail == NULL) {
|
|
||||||
return osErrorValue;
|
|
||||||
}
|
|
||||||
return osMemoryPoolFree(ptr->mp_id, mail);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // Mail Queue
|
|
||||||
|
|
||||||
|
|
||||||
#endif // osCMSIS
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,63 @@
|
||||||
|
/* --------------------------------------------------------------------------
|
||||||
|
* Copyright (c) 2013-2020 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Name: freertos_mpool.h
|
||||||
|
* Purpose: CMSIS RTOS2 wrapper for FreeRTOS
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef FREERTOS_MPOOL_H_
|
||||||
|
#define FREERTOS_MPOOL_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "semphr.h"
|
||||||
|
|
||||||
|
/* Memory Pool implementation definitions */
|
||||||
|
#define MPOOL_STATUS 0x5EED0000U
|
||||||
|
|
||||||
|
/* Memory Block header */
|
||||||
|
typedef struct {
|
||||||
|
void *next; /* Pointer to next block */
|
||||||
|
} MemPoolBlock_t;
|
||||||
|
|
||||||
|
/* Memory Pool control block */
|
||||||
|
typedef struct MemPoolDef_t {
|
||||||
|
MemPoolBlock_t *head; /* Pointer to head block */
|
||||||
|
SemaphoreHandle_t sem; /* Pool semaphore handle */
|
||||||
|
uint8_t *mem_arr; /* Pool memory array */
|
||||||
|
uint32_t mem_sz; /* Pool memory array size */
|
||||||
|
const char *name; /* Pointer to name string */
|
||||||
|
uint32_t bl_sz; /* Size of a single block */
|
||||||
|
uint32_t bl_cnt; /* Number of blocks */
|
||||||
|
uint32_t n; /* Block allocation index */
|
||||||
|
volatile uint32_t status; /* Object status flags */
|
||||||
|
#if (configSUPPORT_STATIC_ALLOCATION == 1)
|
||||||
|
StaticSemaphore_t mem_sem; /* Semaphore object memory */
|
||||||
|
#endif
|
||||||
|
} MemPool_t;
|
||||||
|
|
||||||
|
/* No need to hide static object type, just align to coding style */
|
||||||
|
#define StaticMemPool_t MemPool_t
|
||||||
|
|
||||||
|
/* Define memory pool control block size */
|
||||||
|
#define MEMPOOL_CB_SIZE (sizeof(StaticMemPool_t))
|
||||||
|
|
||||||
|
/* Define size of the byte array required to create count of blocks of given size */
|
||||||
|
#define MEMPOOL_ARR_SIZE(bl_count, bl_size) (((((bl_size) + (4 - 1)) / 4) * 4)*(bl_count))
|
||||||
|
|
||||||
|
#endif /* FREERTOS_MPOOL_H_ */
|
||||||
|
|
@ -0,0 +1,310 @@
|
||||||
|
/* --------------------------------------------------------------------------
|
||||||
|
* Copyright (c) 2013-2020 Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* Name: freertos_os2.h
|
||||||
|
* Purpose: CMSIS RTOS2 wrapper for FreeRTOS
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef FREERTOS_OS2_H_
|
||||||
|
#define FREERTOS_OS2_H_
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "FreeRTOS.h" // ARM.FreeRTOS::RTOS:Core
|
||||||
|
|
||||||
|
#include CMSIS_device_header
|
||||||
|
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 FreeRTOS image size optimization definitions.
|
||||||
|
|
||||||
|
Note: Definitions configUSE_OS2 can be used to optimize FreeRTOS image size when
|
||||||
|
certain functionality is not required when using CMSIS-RTOS2 API.
|
||||||
|
In general optimization decisions are left to the tool chain but in cases
|
||||||
|
when coding style prevents it to optimize the code following optional
|
||||||
|
definitions can be used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 functions osThreadSuspend and osThreadResume from
|
||||||
|
the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_THREAD_SUSPEND_RESUME
|
||||||
|
#define configUSE_OS2_THREAD_SUSPEND_RESUME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 function osThreadEnumerate from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_THREAD_ENUMERATE
|
||||||
|
#define configUSE_OS2_THREAD_ENUMERATE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to disable CMSIS-RTOS2 function osEventFlagsSet and osEventFlagsClear
|
||||||
|
operation from ISR.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_EVENTFLAGS_FROM_ISR
|
||||||
|
#define configUSE_OS2_EVENTFLAGS_FROM_ISR 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 Thread Flags API functions from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_THREAD_FLAGS
|
||||||
|
#define configUSE_OS2_THREAD_FLAGS configUSE_TASK_NOTIFICATIONS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 Timer API functions from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_TIMER
|
||||||
|
#define configUSE_OS2_TIMER configUSE_TIMERS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Option to exclude CMSIS-RTOS2 Mutex API functions from the application image.
|
||||||
|
*/
|
||||||
|
#ifndef configUSE_OS2_MUTEX
|
||||||
|
#define configUSE_OS2_MUTEX configUSE_MUTEXES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 FreeRTOS configuration check (FreeRTOSConfig.h).
|
||||||
|
|
||||||
|
Note: CMSIS-RTOS API requires functions included by using following definitions.
|
||||||
|
In case if certain API function is not used compiler will optimize it away.
|
||||||
|
*/
|
||||||
|
#if (INCLUDE_xSemaphoreGetMutexHolder == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osMutexGetOwner uses FreeRTOS function xSemaphoreGetMutexHolder. In case if
|
||||||
|
osMutexGetOwner is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_xSemaphoreGetMutexHolder 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_xSemaphoreGetMutexHolder must equal 1 to implement Mutex Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskDelay == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osDelay uses FreeRTOS function vTaskDelay. In case if
|
||||||
|
osDelay is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_vTaskDelay 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskDelay must equal 1 to implement Generic Wait Functions API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskDelayUntil == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osDelayUntil uses FreeRTOS function vTaskDelayUntil. In case if
|
||||||
|
osDelayUntil is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_vTaskDelayUntil 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskDelayUntil must equal 1 to implement Generic Wait Functions API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskDelete == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadTerminate and osThreadExit uses FreeRTOS function
|
||||||
|
vTaskDelete. In case if they are not used in the application image, compiler
|
||||||
|
will optimize them away.
|
||||||
|
Set #define INCLUDE_vTaskDelete 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskDelete must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_xTaskGetCurrentTaskHandle == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS function xTaskGetCurrentTaskHandle to implement
|
||||||
|
functions osThreadGetId, osThreadFlagsClear and osThreadFlagsGet. In case if these
|
||||||
|
functions are not used in the application image, compiler will optimize them away.
|
||||||
|
Set #define INCLUDE_xTaskGetCurrentTaskHandle 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_xTaskGetCurrentTaskHandle must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_xTaskGetSchedulerState == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS function xTaskGetSchedulerState to implement Kernel
|
||||||
|
tick handling and therefore it is vital that xTaskGetSchedulerState is included into
|
||||||
|
the application image.
|
||||||
|
Set #define INCLUDE_xTaskGetSchedulerState 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_xTaskGetSchedulerState must equal 1 to implement Kernel Information and Control API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_uxTaskGetStackHighWaterMark == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadGetStackSpace uses FreeRTOS function uxTaskGetStackHighWaterMark.
|
||||||
|
In case if osThreadGetStackSpace is not used in the application image, compiler will
|
||||||
|
optimize it away.
|
||||||
|
Set #define INCLUDE_uxTaskGetStackHighWaterMark 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_uxTaskGetStackHighWaterMark must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_uxTaskPriorityGet == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadGetPriority uses FreeRTOS function uxTaskPriorityGet. In case if
|
||||||
|
osThreadGetPriority is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_uxTaskPriorityGet 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_uxTaskPriorityGet must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskPrioritySet == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadSetPriority uses FreeRTOS function vTaskPrioritySet. In case if
|
||||||
|
osThreadSetPriority is not used in the application image, compiler will optimize it away.
|
||||||
|
Set #define INCLUDE_vTaskPrioritySet 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_vTaskPrioritySet must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_eTaskGetState == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS function vTaskDelayUntil to implement functions osThreadGetState
|
||||||
|
and osThreadTerminate. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define INCLUDE_eTaskGetState 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition INCLUDE_eTaskGetState must equal 1 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_vTaskSuspend == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 API uses FreeRTOS functions vTaskSuspend and vTaskResume to implement
|
||||||
|
functions osThreadSuspend and osThreadResume. In case if these functions are not
|
||||||
|
used in the application image, compiler will optimize them away.
|
||||||
|
Set #define INCLUDE_vTaskSuspend 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use osThreadSuspend and
|
||||||
|
osThreadResume they can be excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_THREAD_SUSPEND_RESUME 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_THREAD_SUSPEND_RESUME == 1)
|
||||||
|
#error "Definition INCLUDE_vTaskSuspend must equal 1 to implement Kernel Information and Control API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if (INCLUDE_xTimerPendFunctionCall == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osEventFlagsSet and osEventFlagsClear, when called from
|
||||||
|
the ISR, call FreeRTOS functions xEventGroupSetBitsFromISR and
|
||||||
|
xEventGroupClearBitsFromISR which are only enabled if timers are operational and
|
||||||
|
xTimerPendFunctionCall in enabled.
|
||||||
|
Set #define INCLUDE_xTimerPendFunctionCall 1 and #define configUSE_TIMERS 1
|
||||||
|
to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use osEventFlagsSet and osEventFlagsClear
|
||||||
|
from the ISR their operation from ISR can be restricted by setting:
|
||||||
|
#define configUSE_OS2_EVENTFLAGS_FROM_ISR 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 1)
|
||||||
|
#error "Definition INCLUDE_xTimerPendFunctionCall must equal 1 to implement Event Flags API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_TIMERS == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Timer Management API functions use FreeRTOS timer functions to implement
|
||||||
|
timer management. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_TIMERS 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use timer functions they can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_TIMER 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_TIMER == 1)
|
||||||
|
#error "Definition configUSE_TIMERS must equal 1 to implement Timer Management API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_MUTEXES == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Mutex Management API functions use FreeRTOS mutex functions to implement
|
||||||
|
mutex management. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_MUTEXES 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use mutex functions they can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_MUTEX 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_MUTEX == 1)
|
||||||
|
#error "Definition configUSE_MUTEXES must equal 1 to implement Mutex Management API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_COUNTING_SEMAPHORES == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Memory Pool functions use FreeRTOS function xSemaphoreCreateCounting
|
||||||
|
to implement memory pools. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_COUNTING_SEMAPHORES 1 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configUSE_COUNTING_SEMAPHORES must equal 1 to implement Memory Pool API."
|
||||||
|
#endif
|
||||||
|
#if (configUSE_TASK_NOTIFICATIONS == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 Thread Flags API functions use FreeRTOS Task Notification functions to implement
|
||||||
|
thread flag management. In case if these functions are not used in the application image,
|
||||||
|
compiler will optimize them away.
|
||||||
|
Set #define configUSE_TASK_NOTIFICATIONS 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use thread flags functions they can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_THREAD_FLAGS 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_THREAD_FLAGS == 1)
|
||||||
|
#error "Definition configUSE_TASK_NOTIFICATIONS must equal 1 to implement Thread Flags API."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_TRACE_FACILITY == 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 function osThreadEnumerate requires FreeRTOS function uxTaskGetSystemState
|
||||||
|
which is only enabled if configUSE_TRACE_FACILITY == 1.
|
||||||
|
Set #define configUSE_TRACE_FACILITY 1 to fix this error.
|
||||||
|
|
||||||
|
Alternatively, if the application does not use osThreadEnumerate it can be
|
||||||
|
excluded from the image code by setting:
|
||||||
|
#define configUSE_OS2_THREAD_ENUMERATE 0 (in FreeRTOSConfig.h)
|
||||||
|
*/
|
||||||
|
#if (configUSE_OS2_THREAD_ENUMERATE == 1)
|
||||||
|
#error "Definition configUSE_TRACE_FACILITY must equal 1 to implement osThreadEnumerate."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configUSE_16_BIT_TICKS == 1)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 wrapper for FreeRTOS relies on 32-bit tick timer which is also optimal on
|
||||||
|
a 32-bit CPU architectures.
|
||||||
|
Set #define configUSE_16_BIT_TICKS 0 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configUSE_16_BIT_TICKS must be zero to implement CMSIS-RTOS2 API."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (configMAX_PRIORITIES != 56)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 defines 56 different priorities (see osPriority_t) and portable CMSIS-RTOS2
|
||||||
|
implementation should implement the same number of priorities.
|
||||||
|
Set #define configMAX_PRIORITIES 56 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configMAX_PRIORITIES must equal 56 to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
#if (configUSE_PORT_OPTIMISED_TASK_SELECTION != 0)
|
||||||
|
/*
|
||||||
|
CMSIS-RTOS2 requires handling of 56 different priorities (see osPriority_t) while FreeRTOS port
|
||||||
|
optimised selection for Cortex core only handles 32 different priorities.
|
||||||
|
Set #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 to fix this error.
|
||||||
|
*/
|
||||||
|
#error "Definition configUSE_PORT_OPTIMISED_TASK_SELECTION must be zero to implement Thread Management API."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* FREERTOS_OS2_H_ */
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,18 @@
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
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).
|
||||||
|
|
||||||
|
### 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).
|
||||||
|
|
||||||
|
## Cloning this repository
|
||||||
|
|
||||||
|
To clone using HTTPS:
|
||||||
|
```
|
||||||
|
git clone https://github.com/FreeRTOS/FreeRTOS-Kernel.git
|
||||||
|
```
|
||||||
|
Using SSH:
|
||||||
|
```
|
||||||
|
git clone git@github.com:FreeRTOS/FreeRTOS-Kernel.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Repository structure
|
||||||
|
- The root of this repository contains the three files that are common to
|
||||||
|
every port - list.c, queue.c and tasks.c. The kernel is contained within these
|
||||||
|
three files. croutine.c implements the optional co-routine functionality - which
|
||||||
|
is normally only used on very memory limited systems.
|
||||||
|
|
||||||
|
- The ```./portable``` directory contains the files that are specific to a particular microcontroller and/or compiler.
|
||||||
|
See the readme file in the ```./portable``` directory for more information.
|
||||||
|
|
||||||
|
- The ```./include``` directory contains the real time kernel header files.
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -260,7 +260,7 @@ CRCB_t *pxCRCB;
|
||||||
( 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? */
|
||||||
if( pxCRCB->xEventListItem.pvContainer )
|
if( pxCRCB->xEventListItem.pxContainer )
|
||||||
{
|
{
|
||||||
( void ) uxListRemove( &( pxCRCB->xEventListItem ) );
|
( void ) uxListRemove( &( pxCRCB->xEventListItem ) );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -39,11 +39,11 @@ task.h is included from an application file. */
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
#include "event_groups.h"
|
#include "event_groups.h"
|
||||||
|
|
||||||
/* Lint e961 and e750 are suppressed as a MISRA exception justified because the
|
/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified
|
||||||
MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the
|
because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined
|
||||||
header files above, but not in this file, in order to generate the correct
|
for the header files above, but not in this file, in order to generate the
|
||||||
privileged Vs unprivileged linkage and placement. */
|
correct privileged Vs unprivileged linkage and placement. */
|
||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */
|
#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
|
||||||
|
|
@ -60,7 +60,7 @@ taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
|
||||||
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
|
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct xEventGroupDefinition
|
typedef struct EventGroupDef_t
|
||||||
{
|
{
|
||||||
EventBits_t uxEventBits;
|
EventBits_t uxEventBits;
|
||||||
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
|
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
|
||||||
|
|
@ -104,11 +104,11 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
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. */
|
||||||
#endif /* configASSERT_DEFINED */
|
#endif /* configASSERT_DEFINED */
|
||||||
|
|
||||||
/* The user has provided a statically allocated event group - use it. */
|
/* The user has provided a statically allocated event group - use it. */
|
||||||
pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 EventGroup_t and StaticEventGroup_t are guaranteed to have the same size and alignment requirement - checked by configASSERT(). */
|
pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */
|
||||||
|
|
||||||
if( pxEventBits != NULL )
|
if( pxEventBits != NULL )
|
||||||
{
|
{
|
||||||
|
|
@ -128,10 +128,13 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* xEventGroupCreateStatic should only ever be called with
|
||||||
|
pxEventGroupBuffer pointing to a pre-allocated (compile time
|
||||||
|
allocated) StaticEventGroup_t variable. */
|
||||||
traceEVENT_GROUP_CREATE_FAILED();
|
traceEVENT_GROUP_CREATE_FAILED();
|
||||||
}
|
}
|
||||||
|
|
||||||
return ( EventGroupHandle_t ) pxEventBits;
|
return pxEventBits;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||||
|
|
@ -143,8 +146,20 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
{
|
{
|
||||||
EventGroup_t *pxEventBits;
|
EventGroup_t *pxEventBits;
|
||||||
|
|
||||||
/* Allocate the event group. */
|
/* Allocate the event group. Justification for MISRA deviation as
|
||||||
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );
|
follows: pvPortMalloc() always ensures returned memory blocks are
|
||||||
|
aligned per the requirements of the MCU stack. In this case
|
||||||
|
pvPortMalloc() must return a pointer that is guaranteed to meet the
|
||||||
|
alignment requirements of the EventGroup_t structure - which (if you
|
||||||
|
follow it through) is the alignment requirements of the TickType_t type
|
||||||
|
(EventBits_t being of TickType_t itself). Therefore, whenever the
|
||||||
|
stack alignment requirements are greater than or equal to the
|
||||||
|
TickType_t alignment requirements the cast is safe. In other cases,
|
||||||
|
where the natural word size of the architecture is less than
|
||||||
|
sizeof( TickType_t ), the TickType_t variables will be accessed in two
|
||||||
|
or more reads operations, and the alignment requirements is only that
|
||||||
|
of each individual read. */
|
||||||
|
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */
|
||||||
|
|
||||||
if( pxEventBits != NULL )
|
if( pxEventBits != NULL )
|
||||||
{
|
{
|
||||||
|
|
@ -164,10 +179,10 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
traceEVENT_GROUP_CREATE_FAILED();
|
traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */
|
||||||
}
|
}
|
||||||
|
|
||||||
return ( EventGroupHandle_t ) pxEventBits;
|
return pxEventBits;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
||||||
|
|
@ -176,7 +191,7 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
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 = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = xEventGroup;
|
||||||
BaseType_t xAlreadyYielded;
|
BaseType_t xAlreadyYielded;
|
||||||
BaseType_t xTimeoutOccurred = pdFALSE;
|
BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
|
|
||||||
|
|
@ -295,7 +310,7 @@ 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 = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = xEventGroup;
|
||||||
EventBits_t uxReturn, uxControlBits = 0;
|
EventBits_t uxReturn, uxControlBits = 0;
|
||||||
BaseType_t xWaitConditionMet, xAlreadyYielded;
|
BaseType_t xWaitConditionMet, xAlreadyYielded;
|
||||||
BaseType_t xTimeoutOccurred = pdFALSE;
|
BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
|
|
@ -445,7 +460,7 @@ 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 = ( EventGroup_t * ) 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
|
||||||
|
|
@ -477,7 +492,7 @@ EventBits_t uxReturn;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear );
|
traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear );
|
||||||
xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL );
|
xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
|
@ -488,7 +503,7 @@ EventBits_t uxReturn;
|
||||||
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
|
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
|
||||||
{
|
{
|
||||||
UBaseType_t uxSavedInterruptStatus;
|
UBaseType_t uxSavedInterruptStatus;
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t const * const pxEventBits = xEventGroup;
|
||||||
EventBits_t uxReturn;
|
EventBits_t uxReturn;
|
||||||
|
|
||||||
uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
|
uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||||
|
|
@ -498,16 +513,16 @@ EventBits_t uxReturn;
|
||||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
|
portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
|
||||||
|
|
||||||
return uxReturn;
|
return uxReturn;
|
||||||
}
|
} /*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;
|
||||||
List_t *pxList;
|
List_t const * pxList;
|
||||||
EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits;
|
EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits;
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
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
|
||||||
|
|
@ -516,7 +531,7 @@ BaseType_t xMatchFound = pdFALSE;
|
||||||
configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
||||||
|
|
||||||
pxList = &( pxEventBits->xTasksWaitingForBits );
|
pxList = &( pxEventBits->xTasksWaitingForBits );
|
||||||
pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
vTaskSuspendAll();
|
vTaskSuspendAll();
|
||||||
{
|
{
|
||||||
traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );
|
traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );
|
||||||
|
|
@ -597,7 +612,7 @@ BaseType_t xMatchFound = pdFALSE;
|
||||||
|
|
||||||
void vEventGroupDelete( EventGroupHandle_t xEventGroup )
|
void vEventGroupDelete( EventGroupHandle_t xEventGroup )
|
||||||
{
|
{
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = xEventGroup;
|
||||||
const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
||||||
|
|
||||||
vTaskSuspendAll();
|
vTaskSuspendAll();
|
||||||
|
|
@ -641,7 +656,7 @@ const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
||||||
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 );
|
( 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. */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -649,7 +664,7 @@ void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet
|
||||||
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 );
|
( 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. */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -695,7 +710,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );
|
traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );
|
||||||
xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken );
|
xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
|
@ -708,7 +723,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
UBaseType_t uxEventGroupGetNumber( void* xEventGroup )
|
UBaseType_t uxEventGroupGetNumber( void* xEventGroup )
|
||||||
{
|
{
|
||||||
UBaseType_t xReturn;
|
UBaseType_t xReturn;
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t const *pxEventBits = ( EventGroup_t * ) xEventGroup; /*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. */
|
||||||
|
|
||||||
if( xEventGroup == NULL )
|
if( xEventGroup == NULL )
|
||||||
{
|
{
|
||||||
|
|
@ -729,7 +744,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
|
|
||||||
void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber )
|
void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber )
|
||||||
{
|
{
|
||||||
( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = 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. */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configUSE_TRACE_FACILITY */
|
#endif /* configUSE_TRACE_FACILITY */
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -156,6 +156,10 @@ extern "C" {
|
||||||
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef INCLUDE_uxTaskGetStackHighWaterMark2
|
||||||
|
#define INCLUDE_uxTaskGetStackHighWaterMark2 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef INCLUDE_eTaskGetState
|
#ifndef INCLUDE_eTaskGetState
|
||||||
#define INCLUDE_eTaskGetState 0
|
#define INCLUDE_eTaskGetState 0
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -237,6 +241,26 @@ extern "C" {
|
||||||
#define configASSERT_DEFINED 1
|
#define configASSERT_DEFINED 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* configPRECONDITION should be defined as configASSERT.
|
||||||
|
The CBMC proofs need a way to track assumptions and assertions.
|
||||||
|
A configPRECONDITION statement should express an implicit invariant or
|
||||||
|
assumption made. A configASSERT statement should express an invariant that must
|
||||||
|
hold explicit before calling the code. */
|
||||||
|
#ifndef configPRECONDITION
|
||||||
|
#define configPRECONDITION( X ) configASSERT(X)
|
||||||
|
#define configPRECONDITION_DEFINED 0
|
||||||
|
#else
|
||||||
|
#define configPRECONDITION_DEFINED 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef portMEMORY_BARRIER
|
||||||
|
#define portMEMORY_BARRIER()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef portSOFTWARE_BARRIER
|
||||||
|
#define portSOFTWARE_BARRIER()
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The timers module relies on xTaskGetSchedulerState(). */
|
/* The timers module relies on xTaskGetSchedulerState(). */
|
||||||
#if configUSE_TIMERS == 1
|
#if configUSE_TIMERS == 1
|
||||||
|
|
||||||
|
|
@ -758,8 +782,12 @@ extern "C" {
|
||||||
#define portTASK_USES_FLOATING_POINT()
|
#define portTASK_USES_FLOATING_POINT()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef portTASK_CALLS_SECURE_FUNCTIONS
|
#ifndef portALLOCATE_SECURE_CONTEXT
|
||||||
#define portTASK_CALLS_SECURE_FUNCTIONS()
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef portDONT_DISCARD
|
||||||
|
#define portDONT_DISCARD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configUSE_TIME_SLICING
|
#ifndef configUSE_TIME_SLICING
|
||||||
|
|
@ -806,6 +834,10 @@ extern "C" {
|
||||||
#define configUSE_TASK_NOTIFICATIONS 1
|
#define configUSE_TASK_NOTIFICATIONS 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef configUSE_POSIX_ERRNO
|
||||||
|
#define configUSE_POSIX_ERRNO 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef portTICK_TYPE_IS_ATOMIC
|
#ifndef portTICK_TYPE_IS_ATOMIC
|
||||||
#define portTICK_TYPE_IS_ATOMIC 0
|
#define portTICK_TYPE_IS_ATOMIC 0
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -826,6 +858,13 @@ extern "C" {
|
||||||
#define configSTACK_DEPTH_TYPE uint16_t
|
#define configSTACK_DEPTH_TYPE uint16_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef configMESSAGE_BUFFER_LENGTH_TYPE
|
||||||
|
/* 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 a size_t. */
|
||||||
|
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Sanity check the configuration. */
|
/* Sanity check the configuration. */
|
||||||
#if( configUSE_TICKLESS_IDLE != 0 )
|
#if( configUSE_TICKLESS_IDLE != 0 )
|
||||||
#if( INCLUDE_vTaskSuspend != 1 )
|
#if( INCLUDE_vTaskSuspend != 1 )
|
||||||
|
|
@ -914,6 +953,7 @@ V8 if desired. */
|
||||||
#define pcTimerGetTimerName pcTimerGetName
|
#define pcTimerGetTimerName pcTimerGetName
|
||||||
#define pcQueueGetQueueName pcQueueGetName
|
#define pcQueueGetQueueName pcQueueGetName
|
||||||
#define vTaskGetTaskInfo vTaskGetInfo
|
#define vTaskGetTaskInfo vTaskGetInfo
|
||||||
|
#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. */
|
||||||
|
|
@ -921,6 +961,10 @@ V8 if desired. */
|
||||||
#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
|
||||||
|
members directly (which is not supposed to be done). */
|
||||||
|
#define pxContainer pvContainer
|
||||||
#endif /* configENABLE_BACKWARD_COMPATIBILITY */
|
#endif /* configENABLE_BACKWARD_COMPATIBILITY */
|
||||||
|
|
||||||
#if( configUSE_ALTERNATIVE_API != 0 )
|
#if( configUSE_ALTERNATIVE_API != 0 )
|
||||||
|
|
@ -935,6 +979,75 @@ point 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
|
||||||
|
currently used in ARMv8M ports. */
|
||||||
|
#ifndef configENABLE_MPU
|
||||||
|
#define configENABLE_MPU 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is
|
||||||
|
currently used in ARMv8M ports. */
|
||||||
|
#ifndef configENABLE_FPU
|
||||||
|
#define configENABLE_FPU 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it.
|
||||||
|
This is currently used in ARMv8M ports. */
|
||||||
|
#ifndef configENABLE_TRUSTZONE
|
||||||
|
#define configENABLE_TRUSTZONE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on
|
||||||
|
the Secure Side only. */
|
||||||
|
#ifndef configRUN_FREERTOS_SECURE_ONLY
|
||||||
|
#define configRUN_FREERTOS_SECURE_ONLY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using
|
||||||
|
* dynamically allocated RAM, in which case when any task is deleted it is known
|
||||||
|
* that both the task's stack and TCB need to be freed. Sometimes the
|
||||||
|
* FreeRTOSConfig.h settings only allow a task to be created using statically
|
||||||
|
* allocated RAM, in which case when any task is deleted it is known that neither
|
||||||
|
* the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h
|
||||||
|
* settings allow a task to be created using either statically or dynamically
|
||||||
|
* allocated RAM, in which case a member of the TCB is used to record whether the
|
||||||
|
* stack and/or TCB were allocated statically or dynamically, so when a task is
|
||||||
|
* deleted the RAM that was allocated dynamically is freed again and no attempt is
|
||||||
|
* made to free the RAM that was allocated statically.
|
||||||
|
* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a
|
||||||
|
* task to be created using either statically or dynamically allocated RAM. Note
|
||||||
|
* that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with
|
||||||
|
* a statically allocated stack and a dynamically allocated TCB.
|
||||||
|
*
|
||||||
|
* The following table lists various combinations of portUSING_MPU_WRAPPERS,
|
||||||
|
* configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and
|
||||||
|
* when it is possible to have both static and dynamic allocation:
|
||||||
|
* +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
|
||||||
|
* | MPU | Dynamic | Static | Available Functions | Possible Allocations | Both Dynamic and | Need Free |
|
||||||
|
* | | | | | | Static Possible | |
|
||||||
|
* +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
|
||||||
|
* | 0 | 0 | 1 | xTaskCreateStatic | TCB - Static, Stack - Static | No | No |
|
||||||
|
* +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
|
||||||
|
* | 0 | 1 | 0 | xTaskCreate | TCB - Dynamic, Stack - Dynamic | No | Yes |
|
||||||
|
* +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
|
||||||
|
* | 0 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes |
|
||||||
|
* | | | | xTaskCreateStatic | 2. TCB - Static, Stack - Static | | |
|
||||||
|
* +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
|
||||||
|
* | 1 | 0 | 1 | xTaskCreateStatic, | TCB - Static, Stack - Static | No | No |
|
||||||
|
* | | | | xTaskCreateRestrictedStatic | | | |
|
||||||
|
* +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
|
||||||
|
* | 1 | 1 | 0 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes |
|
||||||
|
* | | | | xTaskCreateRestricted | 2. TCB - Dynamic, Stack - Static | | |
|
||||||
|
* +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|
|
||||||
|
* | 1 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes |
|
||||||
|
* | | | | xTaskCreateStatic, | 2. TCB - Dynamic, Stack - Static | | |
|
||||||
|
* | | | | xTaskCreateRestricted, | 3. TCB - Static, Stack - Static | | |
|
||||||
|
* | | | | xTaskCreateRestrictedStatic | | | |
|
||||||
|
* +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+
|
||||||
|
*/
|
||||||
|
#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 ) ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In line with software engineering best practice, FreeRTOS implements a strict
|
* In line with software engineering best practice, FreeRTOS implements a strict
|
||||||
* data hiding policy, so the real structures used by FreeRTOS to maintain the
|
* data hiding policy, so the real structures used by FreeRTOS to maintain the
|
||||||
|
|
@ -947,25 +1060,40 @@ point support. */
|
||||||
*/
|
*/
|
||||||
struct xSTATIC_LIST_ITEM
|
struct xSTATIC_LIST_ITEM
|
||||||
{
|
{
|
||||||
TickType_t xDummy1;
|
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
|
||||||
void *pvDummy2[ 4 ];
|
TickType_t xDummy1;
|
||||||
|
#endif
|
||||||
|
TickType_t xDummy2;
|
||||||
|
void *pvDummy3[ 4 ];
|
||||||
|
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
|
||||||
|
TickType_t xDummy4;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
typedef struct xSTATIC_LIST_ITEM StaticListItem_t;
|
typedef struct xSTATIC_LIST_ITEM StaticListItem_t;
|
||||||
|
|
||||||
/* See the comments above the struct xSTATIC_LIST_ITEM definition. */
|
/* See the comments above the struct xSTATIC_LIST_ITEM definition. */
|
||||||
struct xSTATIC_MINI_LIST_ITEM
|
struct xSTATIC_MINI_LIST_ITEM
|
||||||
{
|
{
|
||||||
TickType_t xDummy1;
|
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
|
||||||
void *pvDummy2[ 2 ];
|
TickType_t xDummy1;
|
||||||
|
#endif
|
||||||
|
TickType_t xDummy2;
|
||||||
|
void *pvDummy3[ 2 ];
|
||||||
};
|
};
|
||||||
typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t;
|
typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t;
|
||||||
|
|
||||||
/* See the comments above the struct xSTATIC_LIST_ITEM definition. */
|
/* See the comments above the struct xSTATIC_LIST_ITEM definition. */
|
||||||
typedef struct xSTATIC_LIST
|
typedef struct xSTATIC_LIST
|
||||||
{
|
{
|
||||||
UBaseType_t uxDummy1;
|
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
|
||||||
void *pvDummy2;
|
TickType_t xDummy1;
|
||||||
StaticMiniListItem_t xDummy3;
|
#endif
|
||||||
|
UBaseType_t uxDummy2;
|
||||||
|
void *pvDummy3;
|
||||||
|
StaticMiniListItem_t xDummy4;
|
||||||
|
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
|
||||||
|
TickType_t xDummy5;
|
||||||
|
#endif
|
||||||
} StaticList_t;
|
} StaticList_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1019,14 +1147,16 @@ typedef struct xSTATIC_TCB
|
||||||
uint32_t ulDummy18;
|
uint32_t ulDummy18;
|
||||||
uint8_t ucDummy19;
|
uint8_t ucDummy19;
|
||||||
#endif
|
#endif
|
||||||
#if( ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) || ( portUSING_MPU_WRAPPERS == 1 ) )
|
#if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
|
||||||
uint8_t uxDummy20;
|
uint8_t uxDummy20;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( INCLUDE_xTaskAbortDelay == 1 )
|
#if( INCLUDE_xTaskAbortDelay == 1 )
|
||||||
uint8_t ucDummy21;
|
uint8_t ucDummy21;
|
||||||
#endif
|
#endif
|
||||||
|
#if ( configUSE_POSIX_ERRNO == 1 )
|
||||||
|
int iDummy22;
|
||||||
|
#endif
|
||||||
} StaticTask_t;
|
} StaticTask_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1121,15 +1251,12 @@ typedef struct xSTATIC_TIMER
|
||||||
void *pvDummy1;
|
void *pvDummy1;
|
||||||
StaticListItem_t xDummy2;
|
StaticListItem_t xDummy2;
|
||||||
TickType_t xDummy3;
|
TickType_t xDummy3;
|
||||||
UBaseType_t uxDummy4;
|
void *pvDummy5;
|
||||||
void *pvDummy5[ 2 ];
|
TaskFunction_t pvDummy6;
|
||||||
#if( configUSE_TRACE_FACILITY == 1 )
|
#if( configUSE_TRACE_FACILITY == 1 )
|
||||||
UBaseType_t uxDummy6;
|
UBaseType_t uxDummy7;
|
||||||
#endif
|
|
||||||
|
|
||||||
#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
|
||||||
uint8_t ucDummy7;
|
|
||||||
#endif
|
#endif
|
||||||
|
uint8_t ucDummy8;
|
||||||
|
|
||||||
} StaticTimer_t;
|
} StaticTimer_t;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.2.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,414 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file atomic.h
|
||||||
|
* @brief FreeRTOS atomic operation support.
|
||||||
|
*
|
||||||
|
* This file implements atomic functions by disabling interrupts globally.
|
||||||
|
* Implementations with architecture specific atomic instructions can be
|
||||||
|
* provided under each compiler directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ATOMIC_H
|
||||||
|
#define ATOMIC_H
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOS_H
|
||||||
|
#error "include FreeRTOS.h must appear in source files before include atomic.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Port specific definitions -- entering/exiting critical section.
|
||||||
|
* Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h
|
||||||
|
*
|
||||||
|
* Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with
|
||||||
|
* ATOMIC_ENTER_CRITICAL().
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#if defined( portSET_INTERRUPT_MASK_FROM_ISR )
|
||||||
|
|
||||||
|
/* Nested interrupt scheme is supported in this port. */
|
||||||
|
#define ATOMIC_ENTER_CRITICAL() \
|
||||||
|
UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR()
|
||||||
|
|
||||||
|
#define ATOMIC_EXIT_CRITICAL() \
|
||||||
|
portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType )
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Nested interrupt scheme is NOT supported in this port. */
|
||||||
|
#define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL()
|
||||||
|
#define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL()
|
||||||
|
|
||||||
|
#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Port specific definition -- "always inline".
|
||||||
|
* Inline is compiler specific, and may not always get inlined depending on your
|
||||||
|
* optimization level. Also, inline is considered as performance optimization
|
||||||
|
* for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h,
|
||||||
|
* instead of resulting error, simply define it away.
|
||||||
|
*/
|
||||||
|
#ifndef portFORCE_INLINE
|
||||||
|
#define portFORCE_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */
|
||||||
|
#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */
|
||||||
|
|
||||||
|
/*----------------------------- Swap && CAS ------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic compare-and-swap
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic compare-and-swap operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param[in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and checked.
|
||||||
|
* @param[in] ulExchange If condition meets, write this value to memory.
|
||||||
|
* @param[in] ulComparand Swap condition.
|
||||||
|
*
|
||||||
|
* @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.
|
||||||
|
*
|
||||||
|
* @note This function only swaps *pulDestination with ulExchange, if previous
|
||||||
|
* *pulDestination value equals ulComparand.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulExchange,
|
||||||
|
uint32_t ulComparand )
|
||||||
|
{
|
||||||
|
uint32_t ulReturnValue;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
if( *pulDestination == ulComparand )
|
||||||
|
{
|
||||||
|
*pulDestination = ulExchange;
|
||||||
|
ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulReturnValue;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic swap (pointers)
|
||||||
|
*
|
||||||
|
* @brief Atomically sets the address pointed to by *ppvDestination to the value
|
||||||
|
* of *pvExchange.
|
||||||
|
*
|
||||||
|
* @param[in, out] ppvDestination Pointer to memory location from where a pointer
|
||||||
|
* value is to be loaded and written back to.
|
||||||
|
* @param[in] pvExchange Pointer value to be written to *ppvDestination.
|
||||||
|
*
|
||||||
|
* @return The initial value of *ppvDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination,
|
||||||
|
void * pvExchange )
|
||||||
|
{
|
||||||
|
void * pReturnValue;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
pReturnValue = *ppvDestination;
|
||||||
|
*ppvDestination = pvExchange;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return pReturnValue;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic compare-and-swap (pointers)
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic compare-and-swap operation on the specified pointer
|
||||||
|
* values.
|
||||||
|
*
|
||||||
|
* @param[in, out] ppvDestination Pointer to memory location from where a pointer
|
||||||
|
* value is to be loaded and checked.
|
||||||
|
* @param[in] pvExchange If condition meets, write this value to memory.
|
||||||
|
* @param[in] pvComparand Swap condition.
|
||||||
|
*
|
||||||
|
* @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.
|
||||||
|
*
|
||||||
|
* @note This function only swaps *ppvDestination with pvExchange, if previous
|
||||||
|
* *ppvDestination value equals pvComparand.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination,
|
||||||
|
void * pvExchange,
|
||||||
|
void * pvComparand )
|
||||||
|
{
|
||||||
|
uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
if( *ppvDestination == pvComparand )
|
||||||
|
{
|
||||||
|
*ppvDestination = pvExchange;
|
||||||
|
ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulReturnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------- Arithmetic ------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic add
|
||||||
|
*
|
||||||
|
* @brief Atomically adds count to the value of the specified pointer points to.
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
* @param[in] ulCount Value to be added to *pulAddend.
|
||||||
|
*
|
||||||
|
* @return previous *pulAddend value.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend,
|
||||||
|
uint32_t ulCount )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend += ulCount;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic subtract
|
||||||
|
*
|
||||||
|
* @brief Atomically subtracts count from the value of the specified pointer
|
||||||
|
* pointers to.
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
* @param[in] ulCount Value to be subtract from *pulAddend.
|
||||||
|
*
|
||||||
|
* @return previous *pulAddend value.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend,
|
||||||
|
uint32_t ulCount )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend -= ulCount;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic increment
|
||||||
|
*
|
||||||
|
* @brief Atomically increments the value of the specified pointer points to.
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
*
|
||||||
|
* @return *pulAddend value before increment.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend += 1;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic decrement
|
||||||
|
*
|
||||||
|
* @brief Atomically decrements the value of the specified pointer points to
|
||||||
|
*
|
||||||
|
* @param[in,out] pulAddend Pointer to memory location from where value is to be
|
||||||
|
* loaded and written back to.
|
||||||
|
*
|
||||||
|
* @return *pulAddend value before decrement.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulAddend;
|
||||||
|
*pulAddend -= 1;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------- Bitwise Logical ------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic OR
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic OR operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be ORed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination |= ulValue;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic AND
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic AND operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be ANDed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination &= ulValue;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic NAND
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic NAND operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be NANDed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination = ~( ulCurrent & ulValue );
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Atomic XOR
|
||||||
|
*
|
||||||
|
* @brief Performs an atomic XOR operation on the specified values.
|
||||||
|
*
|
||||||
|
* @param [in, out] pulDestination Pointer to memory location from where value is
|
||||||
|
* to be loaded and written back to.
|
||||||
|
* @param [in] ulValue Value to be XORed with *pulDestination.
|
||||||
|
*
|
||||||
|
* @return The original value of *pulDestination.
|
||||||
|
*/
|
||||||
|
static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination,
|
||||||
|
uint32_t ulValue )
|
||||||
|
{
|
||||||
|
uint32_t ulCurrent;
|
||||||
|
|
||||||
|
ATOMIC_ENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
ulCurrent = *pulDestination;
|
||||||
|
*pulDestination ^= ulValue;
|
||||||
|
}
|
||||||
|
ATOMIC_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ulCurrent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ATOMIC_H */
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -157,7 +157,7 @@ BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPri
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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 vCoRoutineScheduler() within an
|
// execute, the idle task hook can call vCoRoutineSchedule() within an
|
||||||
// infinite loop.
|
// infinite loop.
|
||||||
void vApplicationIdleHook( void )
|
void vApplicationIdleHook( void )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -78,7 +78,8 @@ extern "C" {
|
||||||
* \defgroup EventGroupHandle_t EventGroupHandle_t
|
* \defgroup EventGroupHandle_t EventGroupHandle_t
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
typedef void * EventGroupHandle_t;
|
struct EventGroupDef_t;
|
||||||
|
typedef struct EventGroupDef_t * EventGroupHandle_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The type that holds event bits always matches TickType_t - therefore the
|
* The type that holds event bits always matches TickType_t - therefore the
|
||||||
|
|
@ -404,7 +405,7 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
#if( configUSE_TRACE_FACILITY == 1 )
|
#if( configUSE_TRACE_FACILITY == 1 )
|
||||||
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) 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
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -136,6 +136,7 @@ use of FreeRTOS.*/
|
||||||
/*
|
/*
|
||||||
* Definition of the only type of object that a list can contain.
|
* Definition of the only type of object that a list can contain.
|
||||||
*/
|
*/
|
||||||
|
struct xLIST;
|
||||||
struct xLIST_ITEM
|
struct xLIST_ITEM
|
||||||
{
|
{
|
||||||
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
||||||
|
|
@ -143,7 +144,7 @@ struct xLIST_ITEM
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */
|
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */
|
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */
|
||||||
void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */
|
void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */
|
||||||
void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */
|
struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */
|
||||||
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
||||||
};
|
};
|
||||||
typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */
|
typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */
|
||||||
|
|
@ -182,7 +183,7 @@ typedef struct xLIST
|
||||||
* Access macro to get the owner of a list item. The owner of a list item
|
* Access macro to get the owner of a list item. The owner of a list item
|
||||||
* is the object (usually a TCB) that contains the list item.
|
* is the object (usually a TCB) that contains the list item.
|
||||||
*
|
*
|
||||||
* \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER
|
* \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
*/
|
*/
|
||||||
#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner )
|
#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner )
|
||||||
|
|
@ -224,7 +225,7 @@ typedef struct xLIST
|
||||||
#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext )
|
#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the list item at the head of the list.
|
* Return the next list item.
|
||||||
*
|
*
|
||||||
* \page listGET_NEXT listGET_NEXT
|
* \page listGET_NEXT listGET_NEXT
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
|
|
@ -246,7 +247,7 @@ typedef struct xLIST
|
||||||
* \page listLIST_IS_EMPTY listLIST_IS_EMPTY
|
* \page listLIST_IS_EMPTY listLIST_IS_EMPTY
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
*/
|
*/
|
||||||
#define listLIST_IS_EMPTY( pxList ) ( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) )
|
#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Access macro to return the number of items in the list.
|
* Access macro to return the number of items in the list.
|
||||||
|
|
@ -314,7 +315,7 @@ List_t * const pxConstList = ( pxList ); \
|
||||||
* @param pxListItem The list item we want to know if is in the list.
|
* @param pxListItem The list item we want to know if is in the list.
|
||||||
* @return pdTRUE if the list item is in the list, otherwise pdFALSE.
|
* @return pdTRUE if the list item is in the list, otherwise pdFALSE.
|
||||||
*/
|
*/
|
||||||
#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( BaseType_t ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) )
|
#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the list a list item is contained within (referenced from).
|
* Return the list a list item is contained within (referenced from).
|
||||||
|
|
@ -322,7 +323,7 @@ List_t * const pxConstList = ( pxList ); \
|
||||||
* @param pxListItem The list item being queried.
|
* @param pxListItem The list item being queried.
|
||||||
* @return A pointer to the List_t object that references the pxListItem
|
* @return A pointer to the List_t object that references the pxListItem
|
||||||
*/
|
*/
|
||||||
#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pvContainer )
|
#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This provides a crude means of knowing if a list has been initialised, as
|
* This provides a crude means of knowing if a list has been initialised, as
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -62,6 +62,10 @@
|
||||||
#ifndef FREERTOS_MESSAGE_BUFFER_H
|
#ifndef FREERTOS_MESSAGE_BUFFER_H
|
||||||
#define FREERTOS_MESSAGE_BUFFER_H
|
#define FREERTOS_MESSAGE_BUFFER_H
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOS_H
|
||||||
|
#error "include FreeRTOS.h must appear in source files before include message_buffer.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Message buffers are built onto of stream buffers. */
|
/* Message buffers are built onto of stream buffers. */
|
||||||
#include "stream_buffer.h"
|
#include "stream_buffer.h"
|
||||||
|
|
||||||
|
|
@ -395,10 +399,10 @@ BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
// 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 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.
|
||||||
taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
* \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR
|
* \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR
|
||||||
|
|
@ -584,10 +588,10 @@ BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
|
||||||
// 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 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.
|
||||||
taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
* \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR
|
* \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR
|
||||||
|
|
@ -692,6 +696,26 @@ size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
* \ingroup MessageBufferManagement
|
* \ingroup MessageBufferManagement
|
||||||
*/
|
*/
|
||||||
#define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer )
|
#define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer )
|
||||||
|
#define xMessageBufferSpacesAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* message_buffer.h
|
||||||
|
<pre>
|
||||||
|
size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) );
|
||||||
|
</pre>
|
||||||
|
* Returns the length (in bytes) of the next message in a message buffer.
|
||||||
|
* Useful if xMessageBufferReceive() returned 0 because the size of the buffer
|
||||||
|
* passed into xMessageBufferReceive() was too small to hold the next message.
|
||||||
|
*
|
||||||
|
* @param xMessageBuffer The handle of the message buffer being queried.
|
||||||
|
*
|
||||||
|
* @return The length (in bytes) of the next message in the message buffer, or 0
|
||||||
|
* if the message buffer is empty.
|
||||||
|
*
|
||||||
|
* \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes
|
||||||
|
* \ingroup MessageBufferManagement
|
||||||
|
*/
|
||||||
|
#define xMessageBufferNextLengthBytes( xMessageBuffer ) xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* message_buffer.h
|
* message_buffer.h
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -38,116 +38,121 @@
|
||||||
#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 );
|
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;
|
||||||
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 );
|
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 );
|
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 );
|
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 );
|
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskDelete( TaskHandle_t xTaskToDelete );
|
void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskDelay( const TickType_t xTicksToDelay );
|
void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );
|
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask );
|
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t xTask );
|
UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
eTaskState MPU_eTaskGetState( TaskHandle_t xTask );
|
eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
|
void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
|
void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend );
|
void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskResume( TaskHandle_t xTaskToResume );
|
void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskStartScheduler( void );
|
void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSuspendAll( void );
|
void MPU_vTaskSuspendAll( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskResumeAll( void );
|
BaseType_t MPU_xTaskResumeAll( void ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTaskGetTickCount( void );
|
TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskGetNumberOfTasks( void );
|
UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL;
|
||||||
char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery );
|
char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery );
|
TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
|
UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
|
configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask );
|
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue );
|
TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex );
|
void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
|
void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void );
|
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime );
|
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskList( char * pcWriteBuffer );
|
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer );
|
uint32_t MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue );
|
void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );
|
void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
|
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask );
|
BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskIncrementTick( void );
|
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void );
|
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut );
|
uint32_t MPU_ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait );
|
BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTaskMissedYield( void );
|
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTaskGetSchedulerState( void );
|
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;
|
||||||
|
void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL;
|
||||||
|
BaseType_t MPU_xTaskGetSchedulerState( void ) 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 );
|
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait );
|
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 );
|
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 );
|
BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue );
|
UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue );
|
UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueDelete( QueueHandle_t xQueue );
|
void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType );
|
QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue );
|
QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount );
|
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 );
|
QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
void* MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore );
|
TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait );
|
BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex );
|
BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName );
|
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue );
|
void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
const char * MPU_pcQueueGetName( QueueHandle_t xQueue );
|
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 );
|
QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, 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 );
|
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 );
|
QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet );
|
BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet );
|
BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;
|
||||||
QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait );
|
QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue );
|
BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber );
|
void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue );
|
UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;
|
||||||
uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue );
|
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 );
|
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_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer );
|
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 );
|
void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID );
|
void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer );
|
BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void );
|
TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait );
|
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 );
|
const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer );
|
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;
|
||||||
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer );
|
UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xTimerCreateTimerTask( void );
|
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) 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 );
|
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) 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;
|
||||||
|
|
||||||
/* MPU versions of event_group.h API functions. */
|
/* MPU versions of event_group.h API functions. */
|
||||||
EventGroupHandle_t MPU_xEventGroupCreate( void );
|
EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL;
|
||||||
EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer );
|
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 );
|
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_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
|
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 );
|
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 );
|
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 );
|
void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL;
|
||||||
UBaseType_t MPU_uxEventGroupGetNumber( void* xEventGroup );
|
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 );
|
size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;
|
||||||
size_t MPU_xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, BaseType_t * const pxHigherPriorityTaskWoken );
|
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 );
|
size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
size_t MPU_xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, BaseType_t * const pxHigherPriorityTaskWoken );
|
void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );
|
BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );
|
BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );
|
BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );
|
size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );
|
size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;
|
||||||
size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );
|
BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL;
|
||||||
BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );
|
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 );
|
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 );
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -67,6 +67,7 @@ only for ports that are using the MPU. */
|
||||||
#define pcTaskGetName MPU_pcTaskGetName
|
#define pcTaskGetName MPU_pcTaskGetName
|
||||||
#define xTaskGetHandle MPU_xTaskGetHandle
|
#define xTaskGetHandle MPU_xTaskGetHandle
|
||||||
#define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark
|
#define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark
|
||||||
|
#define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2
|
||||||
#define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag
|
#define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag
|
||||||
#define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag
|
#define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag
|
||||||
#define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer
|
#define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer
|
||||||
|
|
@ -76,10 +77,13 @@ only for ports that are using the MPU. */
|
||||||
#define uxTaskGetSystemState MPU_uxTaskGetSystemState
|
#define uxTaskGetSystemState MPU_uxTaskGetSystemState
|
||||||
#define vTaskList MPU_vTaskList
|
#define vTaskList MPU_vTaskList
|
||||||
#define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
|
#define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
|
||||||
|
#define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter
|
||||||
#define xTaskGenericNotify MPU_xTaskGenericNotify
|
#define xTaskGenericNotify MPU_xTaskGenericNotify
|
||||||
#define xTaskNotifyWait MPU_xTaskNotifyWait
|
#define xTaskNotifyWait MPU_xTaskNotifyWait
|
||||||
#define ulTaskNotifyTake MPU_ulTaskNotifyTake
|
#define ulTaskNotifyTake MPU_ulTaskNotifyTake
|
||||||
#define xTaskNotifyStateClear MPU_xTaskNotifyStateClear
|
#define xTaskNotifyStateClear MPU_xTaskNotifyStateClear
|
||||||
|
#define ulTaskNotifyValueClear MPU_ulTaskNotifyValueClear
|
||||||
|
#define xTaskCatchUpTicks MPU_xTaskCatchUpTicks
|
||||||
|
|
||||||
#define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
|
#define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
|
||||||
#define vTaskSetTimeOutState MPU_vTaskSetTimeOutState
|
#define vTaskSetTimeOutState MPU_vTaskSetTimeOutState
|
||||||
|
|
@ -124,6 +128,8 @@ only for ports that are using the MPU. */
|
||||||
#define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle
|
#define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle
|
||||||
#define xTimerPendFunctionCall MPU_xTimerPendFunctionCall
|
#define xTimerPendFunctionCall MPU_xTimerPendFunctionCall
|
||||||
#define pcTimerGetName MPU_pcTimerGetName
|
#define pcTimerGetName MPU_pcTimerGetName
|
||||||
|
#define vTimerSetReloadMode MPU_vTimerSetReloadMode
|
||||||
|
#define uxTimerGetReloadMode MPU_uxTimerGetReloadMode
|
||||||
#define xTimerGetPeriod MPU_xTimerGetPeriod
|
#define xTimerGetPeriod MPU_xTimerGetPeriod
|
||||||
#define xTimerGetExpiryTime MPU_xTimerGetExpiryTime
|
#define xTimerGetExpiryTime MPU_xTimerGetExpiryTime
|
||||||
#define xTimerGenericCommand MPU_xTimerGenericCommand
|
#define xTimerGenericCommand MPU_xTimerGenericCommand
|
||||||
|
|
@ -140,9 +146,8 @@ only for ports that are using the MPU. */
|
||||||
/* 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 xStreamBufferSendFromISR MPU_xStreamBufferSendFromISR
|
|
||||||
#define xStreamBufferReceive MPU_xStreamBufferReceive
|
#define xStreamBufferReceive MPU_xStreamBufferReceive
|
||||||
#define xStreamBufferReceiveFromISR MPU_xStreamBufferReceiveFromISR
|
#define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes
|
||||||
#define vStreamBufferDelete MPU_vStreamBufferDelete
|
#define vStreamBufferDelete MPU_vStreamBufferDelete
|
||||||
#define xStreamBufferIsFull MPU_xStreamBufferIsFull
|
#define xStreamBufferIsFull MPU_xStreamBufferIsFull
|
||||||
#define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty
|
#define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty
|
||||||
|
|
@ -159,12 +164,14 @@ only for ports that are using the MPU. */
|
||||||
(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
|
||||||
|
|
||||||
#else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
|
#else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
|
||||||
|
|
||||||
/* Ensure API functions go in the privileged execution section. */
|
/* Ensure API functions go in the privileged execution section. */
|
||||||
#define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions")))
|
#define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions")))
|
||||||
#define PRIVILEGED_DATA __attribute__((section("privileged_data")))
|
#define PRIVILEGED_DATA __attribute__((section("privileged_data")))
|
||||||
|
#define FREERTOS_SYSTEM_CALL __attribute__((section( "freertos_system_calls")))
|
||||||
|
|
||||||
#endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
|
#endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */
|
||||||
|
|
||||||
|
|
@ -172,6 +179,7 @@ only for ports that are using the MPU. */
|
||||||
|
|
||||||
#define PRIVILEGED_FUNCTION
|
#define PRIVILEGED_FUNCTION
|
||||||
#define PRIVILEGED_DATA
|
#define PRIVILEGED_DATA
|
||||||
|
#define FREERTOS_SYSTEM_CALL
|
||||||
#define portUSING_MPU_WRAPPERS 0
|
#define portUSING_MPU_WRAPPERS 0
|
||||||
|
|
||||||
#endif /* portUSING_MPU_WRAPPERS */
|
#endif /* portUSING_MPU_WRAPPERS */
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -84,6 +84,14 @@ must be set in the compiler's include path. */
|
||||||
#define portNUM_CONFIGURABLE_REGIONS 1
|
#define portNUM_CONFIGURABLE_REGIONS 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef portHAS_STACK_OVERFLOW_CHECKING
|
||||||
|
#define portHAS_STACK_OVERFLOW_CHECKING 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef portARCH_NAME
|
||||||
|
#define portARCH_NAME NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -97,18 +105,39 @@ extern "C" {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#if( portUSING_MPU_WRAPPERS == 1 )
|
#if( portUSING_MPU_WRAPPERS == 1 )
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
#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;
|
||||||
|
#else
|
||||||
|
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
#if( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
||||||
|
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
||||||
|
#else
|
||||||
|
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Used by heap_5.c. */
|
/* Used by heap_5.c to define the start address and size of each memory region
|
||||||
|
that together comprise the total FreeRTOS heap space. */
|
||||||
typedef struct HeapRegion
|
typedef struct HeapRegion
|
||||||
{
|
{
|
||||||
uint8_t *pucStartAddress;
|
uint8_t *pucStartAddress;
|
||||||
size_t xSizeInBytes;
|
size_t xSizeInBytes;
|
||||||
} HeapRegion_t;
|
} HeapRegion_t;
|
||||||
|
|
||||||
|
/* Used to pass information about the heap out of vPortGetHeapStats(). */
|
||||||
|
typedef struct xHeapStats
|
||||||
|
{
|
||||||
|
size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */
|
||||||
|
size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
|
||||||
|
size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
|
||||||
|
size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */
|
||||||
|
size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */
|
||||||
|
size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */
|
||||||
|
size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */
|
||||||
|
} HeapStats_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Used to define multiple heap regions for use by heap_5.c. This function
|
* Used to define multiple heap regions for use by heap_5.c. This function
|
||||||
* must be called before any calls to pvPortMalloc() - not creating a task,
|
* must be called before any calls to pvPortMalloc() - not creating a task,
|
||||||
|
|
@ -122,6 +151,11 @@ typedef struct HeapRegion
|
||||||
*/
|
*/
|
||||||
void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION;
|
void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns a HeapStats_t structure filled with information about the current
|
||||||
|
* heap state.
|
||||||
|
*/
|
||||||
|
void vPortGetHeapStats( HeapStats_t *pxHeapStats );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map to the memory management routines required for the port.
|
* Map to the memory management routines required for the port.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -37,27 +37,29 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type by which queues are referenced. For example, a call to xQueueCreate()
|
* Type by which queues are referenced. For example, a call to xQueueCreate()
|
||||||
* returns an QueueHandle_t variable that can then be used as a parameter to
|
* returns an QueueHandle_t variable that can then be used as a parameter to
|
||||||
* xQueueSend(), xQueueReceive(), etc.
|
* xQueueSend(), xQueueReceive(), etc.
|
||||||
*/
|
*/
|
||||||
typedef void * QueueHandle_t;
|
struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */
|
||||||
|
typedef struct QueueDefinition * QueueHandle_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type by which queue sets are referenced. For example, a call to
|
* Type by which queue sets are referenced. For example, a call to
|
||||||
* xQueueCreateSet() returns an xQueueSet variable that can then be used as a
|
* xQueueCreateSet() returns an xQueueSet variable that can then be used as a
|
||||||
* parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc.
|
* parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc.
|
||||||
*/
|
*/
|
||||||
typedef void * QueueSetHandle_t;
|
typedef struct QueueDefinition * QueueSetHandle_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queue sets can contain both queues and semaphores, so the
|
* Queue sets can contain both queues and semaphores, so the
|
||||||
* QueueSetMemberHandle_t is defined as a type to be used where a parameter or
|
* QueueSetMemberHandle_t is defined as a type to be used where a parameter or
|
||||||
* return value can be either an QueueHandle_t or an SemaphoreHandle_t.
|
* return value can be either an QueueHandle_t or an SemaphoreHandle_t.
|
||||||
*/
|
*/
|
||||||
typedef void * QueueSetMemberHandle_t;
|
typedef struct QueueDefinition * QueueSetMemberHandle_t;
|
||||||
|
|
||||||
/* For internal use only. */
|
/* For internal use only. */
|
||||||
#define queueSEND_TO_BACK ( ( BaseType_t ) 0 )
|
#define queueSEND_TO_BACK ( ( BaseType_t ) 0 )
|
||||||
|
|
@ -1282,7 +1284,7 @@ uint32_t ulVarToSend, ulValReceived;
|
||||||
// name of the yield function required is port specific.
|
// name of the yield function required is port specific.
|
||||||
if( xHigherPriorityTaskWokenByPost )
|
if( xHigherPriorityTaskWokenByPost )
|
||||||
{
|
{
|
||||||
taskYIELD_YIELD_FROM_ISR();
|
portYIELD_FROM_ISR();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
@ -1414,15 +1416,15 @@ QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t
|
||||||
QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;
|
QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;
|
||||||
QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION;
|
QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION;
|
||||||
BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
|
TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
|
||||||
void* xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
|
TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For internal use only. Use xSemaphoreTakeMutexRecursive() or
|
* For internal use only. Use xSemaphoreTakeMutexRecursive() or
|
||||||
* xSemaphoreGiveMutexRecursive() instead of calling these functions directly.
|
* xSemaphoreGiveMutexRecursive() instead of calling these functions directly.
|
||||||
*/
|
*/
|
||||||
BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION;
|
BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset a queue back to its original empty state. The return value is now
|
* Reset a queue back to its original empty state. The return value is now
|
||||||
|
|
@ -1453,7 +1455,7 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION
|
||||||
* preferably in ROM/Flash), not on the stack.
|
* preferably in ROM/Flash), not on the stack.
|
||||||
*/
|
*/
|
||||||
#if( configQUEUE_REGISTRY_SIZE > 0 )
|
#if( configQUEUE_REGISTRY_SIZE > 0 )
|
||||||
void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -82,10 +82,10 @@
|
||||||
const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \
|
const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \
|
||||||
const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \
|
const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \
|
||||||
\
|
\
|
||||||
if( ( pulStack[ 0 ] != ulCheckValue ) || \
|
if( ( pulStack[ 0 ] != ulCheckValue ) || \
|
||||||
( pulStack[ 1 ] != ulCheckValue ) || \
|
( pulStack[ 1 ] != ulCheckValue ) || \
|
||||||
( pulStack[ 2 ] != ulCheckValue ) || \
|
( pulStack[ 2 ] != ulCheckValue ) || \
|
||||||
( pulStack[ 3 ] != ulCheckValue ) ) \
|
( pulStack[ 3 ] != ulCheckValue ) ) \
|
||||||
{ \
|
{ \
|
||||||
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \
|
||||||
} \
|
} \
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -43,7 +43,7 @@
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section section and set the
|
* (such as xStreamBufferReceive()) inside a critical section section and set the
|
||||||
* receive block time to 0.
|
* receive block time to 0.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
@ -51,6 +51,10 @@
|
||||||
#ifndef STREAM_BUFFER_H
|
#ifndef STREAM_BUFFER_H
|
||||||
#define STREAM_BUFFER_H
|
#define STREAM_BUFFER_H
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOS_H
|
||||||
|
#error "include FreeRTOS.h must appear in source files before include stream_buffer.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined( __cplusplus )
|
#if defined( __cplusplus )
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -61,7 +65,8 @@ extern "C" {
|
||||||
* then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(),
|
* then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(),
|
||||||
* etc.
|
* etc.
|
||||||
*/
|
*/
|
||||||
typedef void * StreamBufferHandle_t;
|
struct StreamBufferDef_t;
|
||||||
|
typedef struct StreamBufferDef_t * StreamBufferHandle_t;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -220,7 +225,7 @@ 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.
|
||||||
*
|
*
|
||||||
|
|
@ -236,7 +241,7 @@ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section and set the receive
|
* (such as xStreamBufferReceive()) inside a critical section and set the receive
|
||||||
* block time to 0.
|
* block time to 0.
|
||||||
*
|
*
|
||||||
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
||||||
|
|
@ -317,7 +322,7 @@ 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.
|
||||||
|
|
@ -334,7 +339,7 @@ size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section and set the receive
|
* (such as xStreamBufferReceive()) inside a critical section and set the receive
|
||||||
* block time to 0.
|
* block time to 0.
|
||||||
*
|
*
|
||||||
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
* Use xStreamBufferSend() to write to a stream buffer from a task. Use
|
||||||
|
|
@ -434,7 +439,7 @@ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||||
* (such as xStreamBufferSend()) inside a critical section and set the send
|
* (such as xStreamBufferSend()) inside a critical section and set the send
|
||||||
* block time to 0. Likewise, if there are to be multiple different readers
|
* block time to 0. Likewise, if there are to be multiple different readers
|
||||||
* then the application writer must place each call to a reading API function
|
* then the application writer must place each call to a reading API function
|
||||||
* (such as xStreamBufferRead()) inside a critical section and set the receive
|
* (such as xStreamBufferReceive()) inside a critical section and set the receive
|
||||||
* block time to 0.
|
* block time to 0.
|
||||||
*
|
*
|
||||||
* Use xStreamBufferReceive() to read from a stream buffer from a task. Use
|
* Use xStreamBufferReceive() to read from a stream buffer from a task. Use
|
||||||
|
|
@ -839,6 +844,8 @@ StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,
|
||||||
uint8_t * const pucStreamBufferStorageArea,
|
uint8_t * const pucStreamBufferStorageArea,
|
||||||
StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION;
|
StaticStreamBuffer_t * const pxStaticStreamBuffer ) 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;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -43,11 +43,19 @@ extern "C" {
|
||||||
* MACROS AND DEFINITIONS
|
* MACROS AND DEFINITIONS
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
#define tskKERNEL_VERSION_NUMBER "V10.0.1"
|
#define tskKERNEL_VERSION_NUMBER "V10.3.1"
|
||||||
#define tskKERNEL_VERSION_MAJOR 10
|
#define tskKERNEL_VERSION_MAJOR 10
|
||||||
#define tskKERNEL_VERSION_MINOR 0
|
#define tskKERNEL_VERSION_MINOR 3
|
||||||
#define tskKERNEL_VERSION_BUILD 1
|
#define tskKERNEL_VERSION_BUILD 1
|
||||||
|
|
||||||
|
/* MPU region parameters passed in ulParameters
|
||||||
|
* of MemoryRegion_t struct. */
|
||||||
|
#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL )
|
||||||
|
#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL )
|
||||||
|
#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL )
|
||||||
|
#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL )
|
||||||
|
#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
*
|
*
|
||||||
|
|
@ -58,7 +66,8 @@ extern "C" {
|
||||||
* \defgroup TaskHandle_t TaskHandle_t
|
* \defgroup TaskHandle_t TaskHandle_t
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
typedef void * TaskHandle_t;
|
struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */
|
||||||
|
typedef struct tskTaskControlBlock* TaskHandle_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defines the prototype to which the application task hook function must
|
* Defines the prototype to which the application task hook function must
|
||||||
|
|
@ -74,7 +83,7 @@ typedef enum
|
||||||
eBlocked, /* The task being queried is in the Blocked state. */
|
eBlocked, /* The task being queried is in the Blocked state. */
|
||||||
eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */
|
eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */
|
||||||
eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */
|
eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */
|
||||||
eInvalid /* Used as an 'invalid state' value. */
|
eInvalid /* Used as an 'invalid state' value. */
|
||||||
} eTaskState;
|
} eTaskState;
|
||||||
|
|
||||||
/* Actions that can be performed when vTaskNotify() is called. */
|
/* Actions that can be performed when vTaskNotify() is called. */
|
||||||
|
|
@ -113,7 +122,7 @@ typedef struct xTASK_PARAMETERS
|
||||||
{
|
{
|
||||||
TaskFunction_t pvTaskCode;
|
TaskFunction_t pvTaskCode;
|
||||||
const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
||||||
uint16_t usStackDepth;
|
configSTACK_DEPTH_TYPE usStackDepth;
|
||||||
void *pvParameters;
|
void *pvParameters;
|
||||||
UBaseType_t uxPriority;
|
UBaseType_t uxPriority;
|
||||||
StackType_t *puxStackBuffer;
|
StackType_t *puxStackBuffer;
|
||||||
|
|
@ -135,7 +144,7 @@ typedef struct xTASK_STATUS
|
||||||
UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */
|
UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */
|
||||||
uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */
|
uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */
|
||||||
StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */
|
StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */
|
||||||
uint16_t usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */
|
configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */
|
||||||
} TaskStatus_t;
|
} TaskStatus_t;
|
||||||
|
|
||||||
/* Possible return values for eTaskConfirmSleepModeStatus(). */
|
/* Possible return values for eTaskConfirmSleepModeStatus(). */
|
||||||
|
|
@ -305,13 +314,13 @@ is used in assert() statements. */
|
||||||
// an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
|
// an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
|
||||||
// the new task attempts to access it.
|
// the new task attempts to access it.
|
||||||
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
|
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
|
||||||
configASSERT( xHandle );
|
configASSERT( xHandle );
|
||||||
|
|
||||||
// Use the handle to delete the task.
|
// Use the handle to delete the task.
|
||||||
if( xHandle != NULL )
|
if( xHandle != NULL )
|
||||||
{
|
{
|
||||||
vTaskDelete( xHandle );
|
vTaskDelete( xHandle );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
* \defgroup xTaskCreate xTaskCreate
|
* \defgroup xTaskCreate xTaskCreate
|
||||||
|
|
@ -375,9 +384,9 @@ is used in assert() statements. */
|
||||||
* memory to be allocated dynamically.
|
* memory to be allocated dynamically.
|
||||||
*
|
*
|
||||||
* @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will
|
* @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will
|
||||||
* be created and pdPASS is returned. If either pxStackBuffer or pxTaskBuffer
|
* be created and a handle to the created task is returned. If either
|
||||||
* are NULL then the task will not be created and
|
* pxStackBuffer or pxTaskBuffer are NULL then the task will not be created and
|
||||||
* errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY is returned.
|
* NULL is returned.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
<pre>
|
<pre>
|
||||||
|
|
@ -489,9 +498,9 @@ static const TaskParameters_t xCheckTaskParameters =
|
||||||
// for full information.
|
// for full information.
|
||||||
{
|
{
|
||||||
// Base address Length Parameters
|
// Base address Length Parameters
|
||||||
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
||||||
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
||||||
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -575,9 +584,9 @@ static const TaskParameters_t xCheckTaskParameters =
|
||||||
// for full information.
|
// for full information.
|
||||||
{
|
{
|
||||||
// Base address Length Parameters
|
// Base address Length Parameters
|
||||||
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
{ cReadWriteArray, 32, portMPU_REGION_READ_WRITE },
|
||||||
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
{ cReadOnlyArray, 32, portMPU_REGION_READ_ONLY },
|
||||||
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
{ cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE }
|
||||||
}
|
}
|
||||||
|
|
||||||
&xTaskBuffer; // Holds the task's data structure.
|
&xTaskBuffer; // Holds the task's data structure.
|
||||||
|
|
@ -822,6 +831,11 @@ void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xT
|
||||||
* task will leave the Blocked state, and return from whichever function call
|
* task will leave the Blocked state, and return from whichever function call
|
||||||
* placed the task into the Blocked state.
|
* placed the task into the Blocked state.
|
||||||
*
|
*
|
||||||
|
* There is no 'FromISR' version of this function as an interrupt would need to
|
||||||
|
* know which object a task was blocked on in order to know which actions to
|
||||||
|
* take. For example, if the task was blocked on a queue the interrupt handler
|
||||||
|
* would then need to know if the queue was locked.
|
||||||
|
*
|
||||||
* @param xTask The handle of the task to remove from the Blocked state.
|
* @param xTask The handle of the task to remove from the Blocked state.
|
||||||
*
|
*
|
||||||
* @return If the task referenced by xTask was not in the Blocked state then
|
* @return If the task referenced by xTask was not in the Blocked state then
|
||||||
|
|
@ -834,7 +848,7 @@ BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
* <pre>UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );</pre>
|
* <pre>UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );</pre>
|
||||||
*
|
*
|
||||||
* INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available.
|
* INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available.
|
||||||
* See the configuration section for more information.
|
* See the configuration section for more information.
|
||||||
|
|
@ -877,15 +891,15 @@ BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
* \defgroup uxTaskPriorityGet uxTaskPriorityGet
|
* \defgroup uxTaskPriorityGet uxTaskPriorityGet
|
||||||
* \ingroup TaskCtrl
|
* \ingroup TaskCtrl
|
||||||
*/
|
*/
|
||||||
UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
* <pre>UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask );</pre>
|
* <pre>UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );</pre>
|
||||||
*
|
*
|
||||||
* A version of uxTaskPriorityGet() that can be used from an ISR.
|
* A version of uxTaskPriorityGet() that can be used from an ISR.
|
||||||
*/
|
*/
|
||||||
UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
|
|
@ -1412,6 +1426,12 @@ TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*
|
||||||
* a value of 1 means 4 bytes) since the task started. The smaller the returned
|
* a value of 1 means 4 bytes) since the task started. The smaller the returned
|
||||||
* number the closer the task has come to overflowing its stack.
|
* number the closer the task has come to overflowing its stack.
|
||||||
*
|
*
|
||||||
|
* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the
|
||||||
|
* same except for their return type. Using configSTACK_DEPTH_TYPE allows the
|
||||||
|
* user to determine the return type. It gets around the problem of the value
|
||||||
|
* overflowing on 8-bit types without breaking backward compatibility for
|
||||||
|
* applications that expect an 8-bit return type.
|
||||||
|
*
|
||||||
* @param xTask Handle of the task associated with the stack to be checked.
|
* @param xTask Handle of the task associated with the stack to be checked.
|
||||||
* Set xTask to NULL to check the stack of the calling task.
|
* Set xTask to NULL to check the stack of the calling task.
|
||||||
*
|
*
|
||||||
|
|
@ -1421,6 +1441,33 @@ TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*
|
||||||
*/
|
*/
|
||||||
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task.h
|
||||||
|
* <PRE>configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask );</PRE>
|
||||||
|
*
|
||||||
|
* INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for
|
||||||
|
* this function to be available.
|
||||||
|
*
|
||||||
|
* Returns the high water mark of the stack associated with xTask. That is,
|
||||||
|
* the minimum free stack space there has been (in words, so on a 32 bit machine
|
||||||
|
* a value of 1 means 4 bytes) since the task started. The smaller the returned
|
||||||
|
* number the closer the task has come to overflowing its stack.
|
||||||
|
*
|
||||||
|
* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the
|
||||||
|
* same except for their return type. Using configSTACK_DEPTH_TYPE allows the
|
||||||
|
* user to determine the return type. It gets around the problem of the value
|
||||||
|
* overflowing on 8-bit types without breaking backward compatibility for
|
||||||
|
* applications that expect an 8-bit return type.
|
||||||
|
*
|
||||||
|
* @param xTask Handle of the task associated with the stack to be checked.
|
||||||
|
* Set xTask to NULL to check the stack of the calling task.
|
||||||
|
*
|
||||||
|
* @return The smallest amount of free stack space there has been (in words, so
|
||||||
|
* actual spaces on the stack rather than bytes) since the task referenced by
|
||||||
|
* xTask was created.
|
||||||
|
*/
|
||||||
|
configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/* When using trace macros it is sometimes necessary to include task.h before
|
/* When using trace macros it is sometimes necessary to include task.h before
|
||||||
FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined,
|
FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined,
|
||||||
so the following two prototypes will cause a compilation error. This can be
|
so the following two prototypes will cause a compilation error. This can be
|
||||||
|
|
@ -1443,9 +1490,20 @@ constant. */
|
||||||
* task.h
|
* task.h
|
||||||
* <pre>void xTaskGetApplicationTaskTag( TaskHandle_t xTask );</pre>
|
* <pre>void xTaskGetApplicationTaskTag( TaskHandle_t xTask );</pre>
|
||||||
*
|
*
|
||||||
* Returns the pxHookFunction value assigned to the task xTask.
|
* Returns the pxHookFunction value assigned to the task xTask. Do not
|
||||||
|
* call from an interrupt service routine - call
|
||||||
|
* xTaskGetApplicationTaskTagFromISR() instead.
|
||||||
*/
|
*/
|
||||||
TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task.h
|
||||||
|
* <pre>void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );</pre>
|
||||||
|
*
|
||||||
|
* Returns the pxHookFunction value assigned to the task xTask. Can
|
||||||
|
* be called from an interrupt service routine.
|
||||||
|
*/
|
||||||
|
TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configUSE_APPLICATION_TASK_TAG ==1 */
|
#endif /* configUSE_APPLICATION_TASK_TAG ==1 */
|
||||||
#endif /* ifdef configUSE_APPLICATION_TASK_TAG */
|
#endif /* ifdef configUSE_APPLICATION_TASK_TAG */
|
||||||
|
|
||||||
|
|
@ -1683,6 +1741,36 @@ void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unquali
|
||||||
*/
|
*/
|
||||||
void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task. h
|
||||||
|
* <PRE>uint32_t ulTaskGetIdleRunTimeCounter( void );</PRE>
|
||||||
|
*
|
||||||
|
* configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS
|
||||||
|
* must both be defined as 1 for this function to be available. The application
|
||||||
|
* must also then provide definitions for
|
||||||
|
* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE()
|
||||||
|
* to configure a peripheral timer/counter and return the timers current count
|
||||||
|
* value respectively. The counter should be at least 10 times the frequency of
|
||||||
|
* the tick count.
|
||||||
|
*
|
||||||
|
* Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total
|
||||||
|
* accumulated execution time being stored for each task. The resolution
|
||||||
|
* of the accumulated time value depends on the frequency of the timer
|
||||||
|
* configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.
|
||||||
|
* While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total
|
||||||
|
* execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter()
|
||||||
|
* returns the total execution time of just the idle task.
|
||||||
|
*
|
||||||
|
* @return The total run time of the idle task. This is the amount of time the
|
||||||
|
* idle task has actually been executing. The unit of time is dependent on the
|
||||||
|
* frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and
|
||||||
|
* portGET_RUN_TIME_COUNTER_VALUE() macros.
|
||||||
|
*
|
||||||
|
* \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter
|
||||||
|
* \ingroup TaskUtils
|
||||||
|
*/
|
||||||
|
uint32_t ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
* <PRE>BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );</PRE>
|
* <PRE>BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );</PRE>
|
||||||
|
|
@ -2118,6 +2206,121 @@ uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait
|
||||||
*/
|
*/
|
||||||
BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
|
BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task. h
|
||||||
|
* <PRE>uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear );</pre>
|
||||||
|
*
|
||||||
|
* Clears the bits specified by the ulBitsToClear bit mask in the notification
|
||||||
|
* value of the task referenced by xTask.
|
||||||
|
*
|
||||||
|
* Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear
|
||||||
|
* the notification value to 0. Set ulBitsToClear to 0 to query the task's
|
||||||
|
* notification value without clearing any bits.
|
||||||
|
*
|
||||||
|
* @return The value of the target task's notification value before the bits
|
||||||
|
* specified by ulBitsToClear were cleared.
|
||||||
|
* \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear
|
||||||
|
* \ingroup TaskNotifications
|
||||||
|
*/
|
||||||
|
uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task.h
|
||||||
|
* <pre>void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )</pre>
|
||||||
|
*
|
||||||
|
* Capture the current time for future use with xTaskCheckForTimeOut().
|
||||||
|
*
|
||||||
|
* @param pxTimeOut Pointer to a timeout object into which the current time
|
||||||
|
* is to be captured. The captured time includes the tick count and the number
|
||||||
|
* of times the tick count has overflowed since the system first booted.
|
||||||
|
* \defgroup vTaskSetTimeOutState vTaskSetTimeOutState
|
||||||
|
* \ingroup TaskCtrl
|
||||||
|
*/
|
||||||
|
void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task.h
|
||||||
|
* <pre>BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait );</pre>
|
||||||
|
*
|
||||||
|
* Determines if pxTicksToWait ticks has passed since a time was captured
|
||||||
|
* using a call to vTaskSetTimeOutState(). The captured time includes the tick
|
||||||
|
* count and the number of times the tick count has overflowed.
|
||||||
|
*
|
||||||
|
* @param pxTimeOut The time status as captured previously using
|
||||||
|
* vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated
|
||||||
|
* to reflect the current time status.
|
||||||
|
* @param pxTicksToWait The number of ticks to check for timeout i.e. if
|
||||||
|
* pxTicksToWait ticks have passed since pxTimeOut was last updated (either by
|
||||||
|
* vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred.
|
||||||
|
* If the timeout has not occurred, pxTIcksToWait is updated to reflect the
|
||||||
|
* number of remaining ticks.
|
||||||
|
*
|
||||||
|
* @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is
|
||||||
|
* returned and pxTicksToWait is updated to reflect the number of remaining
|
||||||
|
* ticks.
|
||||||
|
*
|
||||||
|
* @see https://www.freertos.org/xTaskCheckForTimeOut.html
|
||||||
|
*
|
||||||
|
* Example Usage:
|
||||||
|
* <pre>
|
||||||
|
// Driver library function used to receive uxWantedBytes from an Rx buffer
|
||||||
|
// that is filled by a UART interrupt. If there are not enough bytes in the
|
||||||
|
// Rx buffer then the task enters the Blocked state until it is notified that
|
||||||
|
// more data has been placed into the buffer. If there is still not enough
|
||||||
|
// data then the task re-enters the Blocked state, and xTaskCheckForTimeOut()
|
||||||
|
// is used to re-calculate the Block time to ensure the total amount of time
|
||||||
|
// spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This
|
||||||
|
// continues until either the buffer contains at least uxWantedBytes bytes,
|
||||||
|
// or the total amount of time spent in the Blocked state reaches
|
||||||
|
// MAX_TIME_TO_WAIT – at which point the task reads however many bytes are
|
||||||
|
// available up to a maximum of uxWantedBytes.
|
||||||
|
|
||||||
|
size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes )
|
||||||
|
{
|
||||||
|
size_t uxReceived = 0;
|
||||||
|
TickType_t xTicksToWait = MAX_TIME_TO_WAIT;
|
||||||
|
TimeOut_t xTimeOut;
|
||||||
|
|
||||||
|
// Initialize xTimeOut. This records the time at which this function
|
||||||
|
// was entered.
|
||||||
|
vTaskSetTimeOutState( &xTimeOut );
|
||||||
|
|
||||||
|
// Loop until the buffer contains the wanted number of bytes, or a
|
||||||
|
// timeout occurs.
|
||||||
|
while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes )
|
||||||
|
{
|
||||||
|
// The buffer didn't contain enough data so this task is going to
|
||||||
|
// enter the Blocked state. Adjusting xTicksToWait to account for
|
||||||
|
// any time that has been spent in the Blocked state within this
|
||||||
|
// function so far to ensure the total amount of time spent in the
|
||||||
|
// Blocked state does not exceed MAX_TIME_TO_WAIT.
|
||||||
|
if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE )
|
||||||
|
{
|
||||||
|
//Timed out before the wanted number of bytes were available,
|
||||||
|
// exit the loop.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for a maximum of xTicksToWait ticks to be notified that the
|
||||||
|
// receive interrupt has placed more data into the buffer.
|
||||||
|
ulTaskNotifyTake( pdTRUE, xTicksToWait );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to read uxWantedBytes from the receive buffer into pucBuffer.
|
||||||
|
// The actual number of bytes read (which might be less than
|
||||||
|
// uxWantedBytes) is returned.
|
||||||
|
uxReceived = UART_read_from_receive_buffer( pxUARTInstance,
|
||||||
|
pucBuffer,
|
||||||
|
uxWantedBytes );
|
||||||
|
|
||||||
|
return uxReceived;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
* \defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut
|
||||||
|
* \ingroup TaskCtrl
|
||||||
|
*/
|
||||||
|
BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES
|
* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
|
@ -2221,7 +2424,7 @@ void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const Tick
|
||||||
* Sets the pointer to the current TCB to the TCB of the highest priority task
|
* Sets the pointer to the current TCB to the TCB of the highest priority task
|
||||||
* that is ready to run.
|
* that is ready to run.
|
||||||
*/
|
*/
|
||||||
void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION;
|
portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY
|
* THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY
|
||||||
|
|
@ -2234,17 +2437,6 @@ TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION;
|
||||||
*/
|
*/
|
||||||
TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION;
|
TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
|
||||||
* Capture the current time status for future reference.
|
|
||||||
*/
|
|
||||||
void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compare the time status now with that previously captured to see if the
|
|
||||||
* timeout has expired.
|
|
||||||
*/
|
|
||||||
BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shortcut used by the queue implementation to prevent unnecessary call to
|
* Shortcut used by the queue implementation to prevent unnecessary call to
|
||||||
* taskYIELD();
|
* taskYIELD();
|
||||||
|
|
@ -2300,8 +2492,21 @@ void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVIL
|
||||||
*/
|
*/
|
||||||
void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION;
|
void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/* Correct the tick count value after the application code has held
|
||||||
|
interrupts disabled for an extended period. xTicksToCatchUp is the number
|
||||||
|
of tick interrupts that have been missed due to interrupts being disabled.
|
||||||
|
Its value is not computed automatically, so must be computed by the
|
||||||
|
application writer.
|
||||||
|
|
||||||
|
This function is similar to vTaskStepTick(), however, unlike
|
||||||
|
vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a
|
||||||
|
time at which a task should be removed from the blocked state. That means
|
||||||
|
tasks may have to be removed from the blocked state as the tick count is
|
||||||
|
moved. */
|
||||||
|
BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only avilable when configUSE_TICKLESS_IDLE is set to 1.
|
* Only available when configUSE_TICKLESS_IDLE is set to 1.
|
||||||
* Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port
|
* Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port
|
||||||
* specific sleep function to determine if it is ok to proceed with the sleep,
|
* specific sleep function to determine if it is ok to proceed with the sleep,
|
||||||
* and if it is ok to proceed, if it is ok to sleep indefinitely.
|
* and if it is ok to proceed, if it is ok to sleep indefinitely.
|
||||||
|
|
@ -2320,7 +2525,7 @@ eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION;
|
||||||
* For internal use only. Increment the mutex held count when a mutex is
|
* For internal use only. Increment the mutex held count when a mutex is
|
||||||
* taken and return the handle of the task that has taken the mutex.
|
* taken and return the handle of the task that has taken the mutex.
|
||||||
*/
|
*/
|
||||||
void *pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION;
|
TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For internal use only. Same as vTaskSetTimeOutState(), but without a critial
|
* For internal use only. Same as vTaskSetTimeOutState(), but without a critial
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -73,7 +73,8 @@ or interrupt version of the queue send function should be used. */
|
||||||
* reference the subject timer in calls to other software timer API functions
|
* reference the subject timer in calls to other software timer API functions
|
||||||
* (for example, xTimerStart(), xTimerReset(), etc.).
|
* (for example, xTimerStart(), xTimerReset(), etc.).
|
||||||
*/
|
*/
|
||||||
typedef void * TimerHandle_t;
|
struct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */
|
||||||
|
typedef struct tmrTimerControl * TimerHandle_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defines the prototype to which timer callback functions must conform.
|
* Defines the prototype to which timer callback functions must conform.
|
||||||
|
|
@ -120,7 +121,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
||||||
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
||||||
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
||||||
* equal to 1000.
|
* equal to 1000. Time timer period must be greater than 0.
|
||||||
*
|
*
|
||||||
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
||||||
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
||||||
|
|
@ -137,9 +138,9 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* which is "void vCallbackFunction( TimerHandle_t xTimer );".
|
* which is "void vCallbackFunction( TimerHandle_t xTimer );".
|
||||||
*
|
*
|
||||||
* @return If the timer is successfully created then a handle to the newly
|
* @return If the timer is successfully created then a handle to the newly
|
||||||
* created timer is returned. If the timer cannot be created (because either
|
* created timer is returned. If the timer cannot be created because there is
|
||||||
* there is insufficient FreeRTOS heap remaining to allocate the timer
|
* insufficient FreeRTOS heap remaining to allocate the timer
|
||||||
* structures, or the timer period was set to 0) then NULL is returned.
|
* structures then NULL is returned.
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
* @verbatim
|
* @verbatim
|
||||||
|
|
@ -266,7 +267,7 @@ typedef void (*PendedFunction_t)( void *, uint32_t );
|
||||||
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
* after 100 ticks, then xTimerPeriodInTicks should be set to 100.
|
||||||
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
* Alternatively, if the timer must expire after 500ms, then xPeriod can be set
|
||||||
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
* to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or
|
||||||
* equal to 1000.
|
* equal to 1000. The timer period must be greater than 0.
|
||||||
*
|
*
|
||||||
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
||||||
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
* expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.
|
||||||
|
|
@ -1230,6 +1231,37 @@ BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvPar
|
||||||
*/
|
*/
|
||||||
const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload );
|
||||||
|
*
|
||||||
|
* Updates a timer to be either an auto-reload timer, in which case the timer
|
||||||
|
* automatically resets itself each time it expires, or a one-shot timer, in
|
||||||
|
* which case the timer will only expire once unless it is manually restarted.
|
||||||
|
*
|
||||||
|
* @param xTimer The handle of the timer being updated.
|
||||||
|
*
|
||||||
|
* @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will
|
||||||
|
* expire repeatedly with a frequency set by the timer's period (see the
|
||||||
|
* xTimerPeriodInTicks parameter of the xTimerCreate() API function). If
|
||||||
|
* uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and
|
||||||
|
* enter the dormant state after it expires.
|
||||||
|
*/
|
||||||
|
void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer );
|
||||||
|
*
|
||||||
|
* Queries a timer to determine if it is an auto-reload timer, in which case the timer
|
||||||
|
* automatically resets itself each time it expires, or a one-shot timer, in
|
||||||
|
* which case the timer will only expire once unless it is manually restarted.
|
||||||
|
*
|
||||||
|
* @param xTimer The handle of the timer being queried.
|
||||||
|
*
|
||||||
|
* @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise
|
||||||
|
* pdFALSE is returned.
|
||||||
|
*/
|
||||||
|
UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TickType_t xTimerGetPeriod( TimerHandle_t xTimer );
|
* TickType_t xTimerGetPeriod( TimerHandle_t xTimer );
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -39,7 +39,7 @@ 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 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. */
|
||||||
|
|
@ -47,8 +47,8 @@ void vListInitialise( List_t * const pxList )
|
||||||
|
|
||||||
/* 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 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 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;
|
||||||
|
|
||||||
|
|
@ -62,7 +62,7 @@ void vListInitialise( List_t * const pxList )
|
||||||
void vListInitialiseItem( ListItem_t * const pxItem )
|
void vListInitialiseItem( ListItem_t * const pxItem )
|
||||||
{
|
{
|
||||||
/* Make sure the list item is not recorded as being on a list. */
|
/* Make sure the list item is not recorded as being on a list. */
|
||||||
pxItem->pvContainer = 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. */
|
||||||
|
|
@ -94,7 +94,7 @@ ListItem_t * const pxIndex = pxList->pxIndex;
|
||||||
pxIndex->pxPrevious = pxNewListItem;
|
pxIndex->pxPrevious = pxNewListItem;
|
||||||
|
|
||||||
/* Remember which list the item is in. */
|
/* Remember which list the item is in. */
|
||||||
pxNewListItem->pvContainer = ( void * ) pxList;
|
pxNewListItem->pxContainer = pxList;
|
||||||
|
|
||||||
( pxList->uxNumberOfItems )++;
|
( pxList->uxNumberOfItems )++;
|
||||||
}
|
}
|
||||||
|
|
@ -114,7 +114,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
/* 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 TCB's 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
|
||||||
|
|
@ -127,18 +127,18 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
{
|
{
|
||||||
/* *** 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 http://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!
|
||||||
http://www.freertos.org/a00110.html#configASSERT
|
https://www.freertos.org/a00110.html#configASSERT
|
||||||
|
|
||||||
1) Stack overflow -
|
1) Stack overflow -
|
||||||
see http://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
|
||||||
http://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
|
||||||
http://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.
|
||||||
|
|
@ -147,7 +147,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
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 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
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. */
|
||||||
|
|
@ -161,7 +161,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
|
|
||||||
/* 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->pvContainer = ( void * ) pxList;
|
pxNewListItem->pxContainer = pxList;
|
||||||
|
|
||||||
( pxList->uxNumberOfItems )++;
|
( pxList->uxNumberOfItems )++;
|
||||||
}
|
}
|
||||||
|
|
@ -171,7 +171,7 @@ 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 = ( List_t * ) pxItemToRemove->pvContainer;
|
List_t * const pxList = pxItemToRemove->pxContainer;
|
||||||
|
|
||||||
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
|
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
|
||||||
pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
|
pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
|
||||||
|
|
@ -189,7 +189,7 @@ List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
|
|
||||||
pxItemToRemove->pvContainer = NULL;
|
pxItemToRemove->pxContainer = NULL;
|
||||||
( pxList->uxNumberOfItems )--;
|
( pxList->uxNumberOfItems )--;
|
||||||
|
|
||||||
return pxList->uxNumberOfItems;
|
return pxList->uxNumberOfItems;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -46,17 +46,48 @@ task.h is included from an application file. */
|
||||||
|
|
||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Checks to see if being called from the context of an unprivileged task, and
|
* @brief Calls the port specific code to raise the privilege.
|
||||||
* if so raises the privilege level and returns false - otherwise does nothing
|
*
|
||||||
* other than return true.
|
* @return pdFALSE if privilege was raised, pdTRUE otherwise.
|
||||||
*/
|
*/
|
||||||
extern BaseType_t xPortRaisePrivilege( void );
|
BaseType_t xPortRaisePrivilege( void ) FREERTOS_SYSTEM_CALL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief If xRunningPrivileged is not pdTRUE, calls the port specific
|
||||||
|
* code to reset the privilege, otherwise does nothing.
|
||||||
|
*/
|
||||||
|
void vPortResetPrivilege( BaseType_t xRunningPrivileged );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xPortRaisePrivilege( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
{
|
||||||
|
BaseType_t xRunningPrivileged;
|
||||||
|
|
||||||
|
/* Check whether the processor is already privileged. */
|
||||||
|
xRunningPrivileged = portIS_PRIVILEGED();
|
||||||
|
|
||||||
|
/* If the processor is not already privileged, raise privilege. */
|
||||||
|
if( xRunningPrivileged != pdTRUE )
|
||||||
|
{
|
||||||
|
portRAISE_PRIVILEGE();
|
||||||
|
}
|
||||||
|
|
||||||
|
return xRunningPrivileged;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
||||||
|
{
|
||||||
|
if( xRunningPrivileged != pdTRUE )
|
||||||
|
{
|
||||||
|
portRESET_PRIVILEGE();
|
||||||
|
}
|
||||||
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )
|
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();
|
||||||
|
|
@ -69,7 +100,7 @@ extern BaseType_t xPortRaisePrivilege( void );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )
|
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();
|
||||||
|
|
@ -82,7 +113,7 @@ extern BaseType_t xPortRaisePrivilege( void );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -95,7 +126,7 @@ extern BaseType_t xPortRaisePrivilege( void );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -107,7 +138,7 @@ extern BaseType_t xPortRaisePrivilege( void );
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions )
|
void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const xRegions ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -117,7 +148,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskDelete == 1 )
|
#if ( INCLUDE_vTaskDelete == 1 )
|
||||||
void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete )
|
void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -128,7 +159,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskDelayUntil == 1 )
|
#if ( INCLUDE_vTaskDelayUntil == 1 )
|
||||||
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, TickType_t xTimeIncrement )
|
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, TickType_t xTimeIncrement ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -139,7 +170,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_xTaskAbortDelay == 1 )
|
#if ( INCLUDE_xTaskAbortDelay == 1 )
|
||||||
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask )
|
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -152,7 +183,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskDelay == 1 )
|
#if ( INCLUDE_vTaskDelay == 1 )
|
||||||
void MPU_vTaskDelay( TickType_t xTicksToDelay )
|
void MPU_vTaskDelay( TickType_t xTicksToDelay ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -163,7 +194,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
||||||
UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t pxTask )
|
UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t pxTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -176,7 +207,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskPrioritySet == 1 )
|
#if ( INCLUDE_vTaskPrioritySet == 1 )
|
||||||
void MPU_vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority )
|
void MPU_vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -187,7 +218,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_eTaskGetState == 1 )
|
#if ( INCLUDE_eTaskGetState == 1 )
|
||||||
eTaskState MPU_eTaskGetState( TaskHandle_t pxTask )
|
eTaskState MPU_eTaskGetState( TaskHandle_t pxTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
eTaskState eReturn;
|
eTaskState eReturn;
|
||||||
|
|
@ -200,7 +231,7 @@ 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 )
|
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();
|
||||||
|
|
||||||
|
|
@ -211,7 +242,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
|
#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
|
||||||
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void )
|
TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TaskHandle_t xReturn;
|
TaskHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -224,7 +255,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskSuspend == 1 )
|
#if ( INCLUDE_vTaskSuspend == 1 )
|
||||||
void MPU_vTaskSuspend( TaskHandle_t pxTaskToSuspend )
|
void MPU_vTaskSuspend( TaskHandle_t pxTaskToSuspend ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -235,7 +266,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_vTaskSuspend == 1 )
|
#if ( INCLUDE_vTaskSuspend == 1 )
|
||||||
void MPU_vTaskResume( TaskHandle_t pxTaskToResume )
|
void MPU_vTaskResume( TaskHandle_t pxTaskToResume ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -245,7 +276,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void MPU_vTaskSuspendAll( void )
|
void MPU_vTaskSuspendAll( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -254,7 +285,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xTaskResumeAll( void )
|
BaseType_t MPU_xTaskResumeAll( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -265,7 +296,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
TickType_t MPU_xTaskGetTickCount( void )
|
TickType_t MPU_xTaskGetTickCount( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TickType_t xReturn;
|
TickType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -276,7 +307,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
UBaseType_t MPU_uxTaskGetNumberOfTasks( void )
|
UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -287,7 +318,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery )
|
char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
char *pcReturn;
|
char *pcReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -299,7 +330,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_xTaskGetHandle == 1 )
|
#if ( INCLUDE_xTaskGetHandle == 1 )
|
||||||
TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery )
|
TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TaskHandle_t xReturn;
|
TaskHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -312,7 +343,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
||||||
void MPU_vTaskList( char *pcWriteBuffer )
|
void MPU_vTaskList( char *pcWriteBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -323,7 +354,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
||||||
void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer )
|
void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -333,8 +364,21 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )
|
||||||
|
uint32_t MPU_ulTaskGetIdleRunTimeCounter( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
{
|
||||||
|
uint32_t xReturn;
|
||||||
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
xReturn = ulTaskGetIdleRunTimeCounter();
|
||||||
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
||||||
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxTagValue )
|
void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxTagValue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -345,7 +389,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
||||||
TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask )
|
TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TaskHookFunction_t xReturn;
|
TaskHookFunction_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -358,7 +402,7 @@ 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 )
|
void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -369,7 +413,7 @@ 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 )
|
void *MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
void *pvReturn;
|
void *pvReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -382,7 +426,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
|
||||||
BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter )
|
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();
|
||||||
|
|
@ -395,7 +439,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t *pxTaskStatusArray, UBaseType_t uxArraySize, uint32_t *pulTotalRunTime )
|
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();
|
||||||
|
|
@ -407,8 +451,19 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
{
|
||||||
|
BaseType_t xReturn;
|
||||||
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
xReturn = xTaskCatchUpTicks( xTicksToCatchUp );
|
||||||
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )
|
#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )
|
||||||
UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask )
|
UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -420,8 +475,21 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 )
|
||||||
|
configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
{
|
||||||
|
configSTACK_DEPTH_TYPE uxReturn;
|
||||||
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
uxReturn = uxTaskGetStackHighWaterMark2( xTask );
|
||||||
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
|
return uxReturn;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_xTaskGetCurrentTaskHandle == 1 )
|
#if ( INCLUDE_xTaskGetCurrentTaskHandle == 1 )
|
||||||
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void )
|
TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TaskHandle_t xReturn;
|
TaskHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -434,7 +502,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_xTaskGetSchedulerState == 1 )
|
#if ( INCLUDE_xTaskGetSchedulerState == 1 )
|
||||||
BaseType_t MPU_xTaskGetSchedulerState( void )
|
BaseType_t MPU_xTaskGetSchedulerState( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -446,7 +514,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
|
void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -455,7 +523,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait )
|
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();
|
||||||
|
|
@ -467,7 +535,7 @@ 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 )
|
BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, 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();
|
||||||
|
|
@ -480,7 +548,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
BaseType_t MPU_xTaskNotifyWait( 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();
|
||||||
|
|
@ -493,7 +561,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait )
|
uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
uint32_t ulReturn;
|
uint32_t ulReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -506,7 +574,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask )
|
BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -518,8 +586,21 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configUSE_TASK_NOTIFICATIONS == 1 )
|
||||||
|
uint32_t MPU_ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
{
|
||||||
|
uint32_t ulReturn;
|
||||||
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
ulReturn = ulTaskNotifyValueClear( xTask, ulBitsToClear );
|
||||||
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
|
return ulReturn;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize, uint8_t ucQueueType )
|
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();
|
||||||
|
|
@ -532,7 +613,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -544,7 +625,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueGenericReset( QueueHandle_t pxQueue, BaseType_t xNewQueue )
|
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();
|
||||||
|
|
@ -555,7 +636,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition )
|
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();
|
||||||
|
|
@ -566,7 +647,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t pxQueue )
|
UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t pxQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
|
|
@ -577,7 +658,7 @@ UBaseType_t uxReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue )
|
UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
|
|
@ -588,7 +669,7 @@ UBaseType_t uxReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueReceive( QueueHandle_t pxQueue, void * const pvBuffer, TickType_t xTicksToWait )
|
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;
|
||||||
|
|
@ -599,7 +680,7 @@ BaseType_t xReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait )
|
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;
|
||||||
|
|
@ -610,7 +691,7 @@ BaseType_t xReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait )
|
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;
|
||||||
|
|
@ -621,30 +702,21 @@ BaseType_t xReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xQueuePeekFromISR( QueueHandle_t pxQueue, void * const pvBuffer )
|
#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )
|
||||||
{
|
TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) /* FREERTOS_SYSTEM_CALL */
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
void * xReturn;
|
||||||
|
|
||||||
xReturn = xQueuePeekFromISR( pxQueue, pvBuffer );
|
xReturn = xQueueGetMutexHolder( xSemaphore );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
#endif
|
||||||
|
|
||||||
void* MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore )
|
|
||||||
{
|
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
|
||||||
void * xReturn;
|
|
||||||
|
|
||||||
xReturn = ( void * ) xQueueGetMutexHolder( xSemaphore );
|
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
||||||
QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType )
|
QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueHandle_t xReturn;
|
QueueHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -657,7 +729,7 @@ void * 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 )
|
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();
|
||||||
|
|
@ -670,7 +742,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -684,7 +756,7 @@ void * xReturn;
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -697,7 +769,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
||||||
BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xBlockTime )
|
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();
|
||||||
|
|
@ -710,7 +782,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
||||||
BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t xMutex )
|
BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t xMutex ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -723,7 +795,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
#if( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
|
||||||
QueueSetHandle_t MPU_xQueueCreateSet( UBaseType_t uxEventQueueLength )
|
QueueSetHandle_t MPU_xQueueCreateSet( UBaseType_t uxEventQueueLength ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
QueueSetHandle_t xReturn;
|
QueueSetHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -736,7 +808,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t xBlockTimeTicks )
|
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();
|
||||||
|
|
@ -749,7 +821,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet )
|
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();
|
||||||
|
|
@ -762,7 +834,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configUSE_QUEUE_SETS == 1 )
|
#if ( configUSE_QUEUE_SETS == 1 )
|
||||||
BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet )
|
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();
|
||||||
|
|
@ -775,7 +847,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configQUEUE_REGISTRY_SIZE > 0
|
#if configQUEUE_REGISTRY_SIZE > 0
|
||||||
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName )
|
void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -787,7 +859,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configQUEUE_REGISTRY_SIZE > 0
|
#if configQUEUE_REGISTRY_SIZE > 0
|
||||||
void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue )
|
void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -799,7 +871,7 @@ void * xReturn;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configQUEUE_REGISTRY_SIZE > 0
|
#if configQUEUE_REGISTRY_SIZE > 0
|
||||||
const char *MPU_pcQueueGetName( QueueHandle_t xQueue )
|
const char *MPU_pcQueueGetName( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
const char *pcReturn;
|
const char *pcReturn;
|
||||||
|
|
@ -812,7 +884,7 @@ void * xReturn;
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void MPU_vQueueDelete( QueueHandle_t xQueue )
|
void MPU_vQueueDelete( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -823,7 +895,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
void *MPU_pvPortMalloc( size_t xSize )
|
void *MPU_pvPortMalloc( size_t xSize ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
void *pvReturn;
|
void *pvReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -838,7 +910,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
void MPU_vPortFree( void *pv )
|
void MPU_vPortFree( void *pv ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -850,7 +922,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
void MPU_vPortInitialiseBlocks( void )
|
void MPU_vPortInitialiseBlocks( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -862,7 +934,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
size_t MPU_xPortGetFreeHeapSize( void )
|
size_t MPU_xPortGetFreeHeapSize( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
size_t xReturn;
|
size_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -877,7 +949,7 @@ 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 )
|
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();
|
||||||
|
|
@ -891,7 +963,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -905,7 +977,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TIMERS == 1 )
|
#if( configUSE_TIMERS == 1 )
|
||||||
void *MPU_pvTimerGetTimerID( const TimerHandle_t xTimer )
|
void *MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
void * pvReturn;
|
void * pvReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -919,7 +991,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TIMERS == 1 )
|
#if( configUSE_TIMERS == 1 )
|
||||||
void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID )
|
void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -930,7 +1002,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TIMERS == 1 )
|
#if( configUSE_TIMERS == 1 )
|
||||||
BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer )
|
BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -944,7 +1016,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TIMERS == 1 )
|
#if( configUSE_TIMERS == 1 )
|
||||||
TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void )
|
TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TaskHandle_t xReturn;
|
TaskHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -958,7 +1030,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -972,7 +1044,31 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TIMERS == 1 )
|
#if( configUSE_TIMERS == 1 )
|
||||||
const char * MPU_pcTimerGetName( TimerHandle_t xTimer )
|
void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) /* FREERTOS_SYSTEM_CALL */
|
||||||
|
{
|
||||||
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
vTimerSetReloadMode( xTimer, uxAutoReload );
|
||||||
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configUSE_TIMERS == 1 )
|
||||||
|
UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer )
|
||||||
|
{
|
||||||
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
UBaseType_t uxReturn;
|
||||||
|
|
||||||
|
uxReturn = uxTimerGetReloadMode( xTimer );
|
||||||
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
|
return uxReturn;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configUSE_TIMERS == 1 )
|
||||||
|
const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
const char * pcReturn;
|
const char * pcReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -986,7 +1082,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TIMERS == 1 )
|
#if( configUSE_TIMERS == 1 )
|
||||||
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer )
|
TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TickType_t xReturn;
|
TickType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1000,7 +1096,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TIMERS == 1 )
|
#if( configUSE_TIMERS == 1 )
|
||||||
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer )
|
TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
TickType_t xReturn;
|
TickType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1014,7 +1110,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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 )
|
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();
|
||||||
|
|
@ -1028,7 +1124,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
||||||
EventGroupHandle_t MPU_xEventGroupCreate( void )
|
EventGroupHandle_t MPU_xEventGroupCreate( void ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
EventGroupHandle_t xReturn;
|
EventGroupHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1042,7 +1138,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer )
|
EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
EventGroupHandle_t xReturn;
|
EventGroupHandle_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1055,7 +1151,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )
|
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();
|
||||||
|
|
@ -1067,7 +1163,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
|
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();
|
||||||
|
|
@ -1079,7 +1175,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
|
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();
|
||||||
|
|
@ -1091,7 +1187,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )
|
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();
|
||||||
|
|
@ -1103,7 +1199,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup )
|
void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -1112,7 +1208,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait )
|
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();
|
||||||
|
|
@ -1124,19 +1220,19 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, BaseType_t * const pxHigherPriorityTaskWoken )
|
size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
size_t xReturn;
|
size_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
xReturn = xStreamBufferSendFromISR( xStreamBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken );
|
xReturn = xStreamBufferNextMessageLengthBytes( xStreamBuffer );
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
vPortResetPrivilege( xRunningPrivileged );
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait )
|
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();
|
||||||
|
|
@ -1148,19 +1244,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, BaseType_t * const pxHigherPriorityTaskWoken )
|
void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
|
||||||
size_t xReturn;
|
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
|
||||||
|
|
||||||
xReturn = xStreamBufferReceiveFromISR( xStreamBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken );
|
|
||||||
vPortResetPrivilege( xRunningPrivileged );
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer )
|
|
||||||
{
|
{
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
||||||
|
|
@ -1169,7 +1253,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer )
|
BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1181,7 +1265,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer )
|
BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1193,7 +1277,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer )
|
BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1205,7 +1289,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer )
|
size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
size_t xReturn;
|
size_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1217,7 +1301,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer )
|
size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */
|
||||||
{
|
{
|
||||||
size_t xReturn;
|
size_t xReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
@ -1229,7 +1313,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel )
|
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();
|
||||||
|
|
@ -1242,7 +1326,7 @@ 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 )
|
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();
|
||||||
|
|
@ -1256,7 +1340,7 @@ 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 )
|
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();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -33,21 +33,17 @@
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
#ifndef configSYSTICK_CLOCK_HZ
|
|
||||||
#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Constants required to manipulate the NVIC. */
|
/* Constants required to manipulate the NVIC. */
|
||||||
#define portNVIC_SYSTICK_CTRL (* ( ( volatile uint32_t *) 0xe000e010 ) )
|
#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) )
|
||||||
#define portNVIC_SYSTICK_LOAD (* ( ( volatile uint32_t *) 0xe000e014 ) )
|
#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) )
|
||||||
#define portNVIC_SYSTICK_CURRENT_VALUE (* ( ( volatile uint32_t * ) 0xe000e018 ))
|
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) )
|
||||||
#define portNVIC_INT_CTRL ( ( volatile uint32_t *) 0xe000ed04 )
|
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
#define portNVIC_SYSPRI2 ( ( volatile uint32_t *) 0xe000ed20 )
|
#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
|
||||||
#define portNVIC_SYSTICK_CLK 0x00000004
|
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
||||||
#define portNVIC_SYSTICK_INT 0x00000002
|
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
||||||
#define portNVIC_SYSTICK_ENABLE 0x00000001
|
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
||||||
#define portNVIC_SYSTICK_COUNT_FLAG ( 1UL << 16UL )
|
#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL )
|
||||||
#define portNVIC_PENDSVSET 0x10000000
|
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||||
#define portMIN_INTERRUPT_PRIORITY ( 255UL )
|
#define portMIN_INTERRUPT_PRIORITY ( 255UL )
|
||||||
#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL )
|
#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL )
|
||||||
#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL )
|
#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL )
|
||||||
|
|
@ -61,7 +57,9 @@
|
||||||
/* 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 )
|
#ifndef portMISSED_COUNTS_FACTOR
|
||||||
|
#define portMISSED_COUNTS_FACTOR ( 45UL )
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Let the user override the pre-loading of the initial LR with the address of
|
/* Let the user override the pre-loading of the initial LR with the address of
|
||||||
prvTaskExitError() in case it messes up unwinding of the stack in the
|
prvTaskExitError() in case it messes up unwinding of the stack in the
|
||||||
|
|
@ -73,9 +71,11 @@ debugger. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the timer to generate the tick interrupts.
|
* Setup the timer to generate the tick interrupts. The implementation in this
|
||||||
|
* file is weak to allow application writers to change the timer used to
|
||||||
|
* generate the tick interrupt.
|
||||||
*/
|
*/
|
||||||
static void prvSetupTimerInterrupt( void );
|
void vPortSetupTimerInterrupt( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exception handlers.
|
* Exception handlers.
|
||||||
|
|
@ -103,26 +103,26 @@ static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The number of SysTick increments that make up one tick period.
|
* The number of SysTick increments that make up one tick period.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
static unsigned long ulTimerCountsForOneTick = 0;
|
static uint32_t ulTimerCountsForOneTick = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The maximum number of tick periods that can be suppressed is limited by the
|
* The maximum number of tick periods that can be suppressed is limited by the
|
||||||
* 24 bit resolution of the SysTick timer.
|
* 24 bit resolution of the SysTick timer.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
static unsigned long xMaximumPossibleSuppressedTicks = 0;
|
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compensate for the CPU cycles that pass while the SysTick is stopped (low
|
* Compensate for the CPU cycles that pass while the SysTick is stopped (low
|
||||||
* power functionality only.
|
* power functionality only.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
static unsigned long ulStoppedTimerCompensation = 0;
|
static uint32_t ulStoppedTimerCompensation = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
@ -213,13 +213,13 @@ void vPortStartFirstTask( void )
|
||||||
*/
|
*/
|
||||||
BaseType_t xPortStartScheduler( void )
|
BaseType_t xPortStartScheduler( void )
|
||||||
{
|
{
|
||||||
/* Make PendSV, CallSV and SysTick the same priroity as the kernel. */
|
/* Make PendSV, CallSV and SysTick the same priority as the kernel. */
|
||||||
*(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI;
|
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
||||||
*(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI;
|
portNVIC_SYSPRI2_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. */
|
||||||
prvSetupTimerInterrupt();
|
vPortSetupTimerInterrupt();
|
||||||
|
|
||||||
/* Initialise the critical nesting count ready for the first task. */
|
/* Initialise the critical nesting count ready for the first task. */
|
||||||
uxCriticalNesting = 0;
|
uxCriticalNesting = 0;
|
||||||
|
|
@ -252,7 +252,7 @@ void vPortEndScheduler( void )
|
||||||
void vPortYield( void )
|
void vPortYield( void )
|
||||||
{
|
{
|
||||||
/* Set a PendSV to request a context switch. */
|
/* Set a PendSV to request a context switch. */
|
||||||
*( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET;
|
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||||
|
|
||||||
/* Barriers are normally not required but do ensure the code is completely
|
/* Barriers are normally not required but do ensure the code is completely
|
||||||
within the specified behaviour for the architecture. */
|
within the specified behaviour for the architecture. */
|
||||||
|
|
@ -263,8 +263,8 @@ void vPortYield( void )
|
||||||
|
|
||||||
void vPortEnterCritical( void )
|
void vPortEnterCritical( void )
|
||||||
{
|
{
|
||||||
portDISABLE_INTERRUPTS();
|
portDISABLE_INTERRUPTS();
|
||||||
uxCriticalNesting++;
|
uxCriticalNesting++;
|
||||||
__asm volatile( "dsb" ::: "memory" );
|
__asm volatile( "dsb" ::: "memory" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile( "isb" );
|
||||||
}
|
}
|
||||||
|
|
@ -273,11 +273,11 @@ void vPortEnterCritical( void )
|
||||||
void vPortExitCritical( void )
|
void vPortExitCritical( void )
|
||||||
{
|
{
|
||||||
configASSERT( uxCriticalNesting );
|
configASSERT( uxCriticalNesting );
|
||||||
uxCriticalNesting--;
|
uxCriticalNesting--;
|
||||||
if( uxCriticalNesting == 0 )
|
if( uxCriticalNesting == 0 )
|
||||||
{
|
{
|
||||||
portENABLE_INTERRUPTS();
|
portENABLE_INTERRUPTS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -289,13 +289,6 @@ uint32_t ulSetInterruptMaskFromISR( void )
|
||||||
" bx lr "
|
" bx lr "
|
||||||
::: "memory"
|
::: "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
#if !defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
|
||||||
/* To avoid compiler warnings. The return statement will nevere be reached,
|
|
||||||
but some compilers warn if it is not included, while others won't compile if
|
|
||||||
it is. */
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -306,13 +299,6 @@ void vClearInterruptMaskFromISR( __attribute__( ( unused ) ) uint32_t ulMask )
|
||||||
" bx lr "
|
" bx lr "
|
||||||
::: "memory"
|
::: "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
#if !defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
|
||||||
/* Just to avoid compiler warning. ulMask is used from the asm code but
|
|
||||||
the compiler can't see that. Some compilers generate warnings without the
|
|
||||||
following line, while others generate warnings if the line is included. */
|
|
||||||
( void ) ulMask;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -375,18 +361,43 @@ uint32_t ulPreviousMask;
|
||||||
if( xTaskIncrementTick() != pdFALSE )
|
if( xTaskIncrementTick() != pdFALSE )
|
||||||
{
|
{
|
||||||
/* Pend a context switch. */
|
/* Pend a context switch. */
|
||||||
*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
|
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
|
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
/*
|
||||||
|
* Setup the systick timer to generate the tick interrupts at the required
|
||||||
|
* frequency.
|
||||||
|
*/
|
||||||
|
__attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
||||||
|
{
|
||||||
|
/* Calculate the constants required to configure the tick interrupt. */
|
||||||
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
|
{
|
||||||
|
ulTimerCountsForOneTick = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );
|
||||||
|
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
|
||||||
|
ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR;
|
||||||
|
}
|
||||||
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
|
/* Stop and reset the SysTick. */
|
||||||
|
portNVIC_SYSTICK_CTRL_REG = 0UL;
|
||||||
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
|
||||||
|
/* Configure SysTick to interrupt at the requested rate. */
|
||||||
|
portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
||||||
|
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
|
|
||||||
__attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
__attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
||||||
{
|
{
|
||||||
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL;
|
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements;
|
||||||
TickType_t xModifiableIdleTime;
|
TickType_t xModifiableIdleTime;
|
||||||
|
|
||||||
/* Make sure the SysTick reload value does not overflow the counter. */
|
/* Make sure the SysTick reload value does not overflow the counter. */
|
||||||
|
|
@ -399,12 +410,12 @@ uint32_t ulPreviousMask;
|
||||||
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 &= ~portNVIC_SYSTICK_ENABLE;
|
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 + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
||||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
if( ulReloadValue > ulStoppedTimerCompensation )
|
||||||
{
|
{
|
||||||
ulReloadValue -= ulStoppedTimerCompensation;
|
ulReloadValue -= ulStoppedTimerCompensation;
|
||||||
|
|
@ -412,7 +423,9 @@ uint32_t ulPreviousMask;
|
||||||
|
|
||||||
/* 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 volatile( "cpsid i" );
|
__asm volatile( "cpsid i" ::: "memory" );
|
||||||
|
__asm volatile( "dsb" );
|
||||||
|
__asm volatile( "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. */
|
||||||
|
|
@ -420,30 +433,30 @@ uint32_t ulPreviousMask;
|
||||||
{
|
{
|
||||||
/* 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 = portNVIC_SYSTICK_CURRENT_VALUE;
|
portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
||||||
|
|
||||||
/* Restart SysTick. */
|
/* Restart SysTick. */
|
||||||
portNVIC_SYSTICK_CTRL |= portNVIC_SYSTICK_ENABLE;
|
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 = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
/* Re-enable interrupts - see comments above the cpsid instruction()
|
||||||
above. */
|
above. */
|
||||||
__asm volatile( "cpsie i" );
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Set the new reload value. */
|
/* Set the new reload value. */
|
||||||
portNVIC_SYSTICK_LOAD = 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 = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
|
||||||
/* Restart SysTick. */
|
/* Restart SysTick. */
|
||||||
portNVIC_SYSTICK_CTRL |= portNVIC_SYSTICK_ENABLE;
|
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
|
||||||
|
|
@ -451,35 +464,53 @@ uint32_t ulPreviousMask;
|
||||||
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 volatile( "dsb" );
|
__asm volatile( "dsb" ::: "memory" );
|
||||||
__asm volatile( "wfi" );
|
__asm volatile( "wfi" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile( "isb" );
|
||||||
}
|
}
|
||||||
configPOST_SLEEP_PROCESSING( &xExpectedIdleTime );
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
/* Stop SysTick. Again, the time the SysTick is stopped for is
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
accounted for as best it can be, but using the tickless mode will
|
out of sleep mode to execute immediately. see comments above
|
||||||
inevitably result in some tiny drift of the time maintained by the
|
__disable_interrupt() call above. */
|
||||||
kernel with respect to calendar time. */
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
ulSysTickCTRL = portNVIC_SYSTICK_CTRL;
|
__asm volatile( "dsb" );
|
||||||
portNVIC_SYSTICK_CTRL = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE );
|
__asm volatile( "isb" );
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
/* Disable interrupts again because the clock is about to be stopped
|
||||||
above. */
|
and interrupts that execute while the clock is stopped will increase
|
||||||
__asm volatile( "cpsie i" );
|
any slippage between the time maintained by the RTOS and calendar
|
||||||
|
time. */
|
||||||
|
__asm volatile( "cpsid i" ::: "memory" );
|
||||||
|
__asm volatile( "dsb" );
|
||||||
|
__asm volatile( "isb" );
|
||||||
|
|
||||||
if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG ) != 0 )
|
/* Disable the SysTick clock without reading the
|
||||||
|
portNVIC_SYSTICK_CTRL_REG register to ensure the
|
||||||
|
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
|
||||||
|
be, but using the tickless mode will inevitably result in some tiny
|
||||||
|
drift of the time maintained by the kernel with respect to calendar
|
||||||
|
time*/
|
||||||
|
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );
|
||||||
|
|
||||||
|
/* Determine if the SysTick clock has already counted to zero and
|
||||||
|
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
|
||||||
|
to count to zero (in which case an interrupt other than the SysTick
|
||||||
|
must have brought the system out of sleep mode). */
|
||||||
|
if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
||||||
{
|
{
|
||||||
uint32_t ulCalculatedLoadValue;
|
uint32_t ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* The tick interrupt has already executed, and the SysTick
|
/* The tick interrupt is already pending, and the SysTick count
|
||||||
count reloaded with ulReloadValue. Reset the
|
reloaded with ulReloadValue. Reset the
|
||||||
portNVIC_SYSTICK_LOAD 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 );
|
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
|
||||||
|
|
@ -489,13 +520,11 @@ uint32_t ulPreviousMask;
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
||||||
}
|
}
|
||||||
|
|
||||||
portNVIC_SYSTICK_LOAD = ulCalculatedLoadValue;
|
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* The tick interrupt handler will already have pended the tick
|
/* As the pending tick will be processed as soon as this
|
||||||
processing in the kernel. As the pending tick will be
|
function exits, the tick value maintained by the tick is stepped
|
||||||
processed as soon as this function exits, the tick value
|
forward by one less than the time spent waiting. */
|
||||||
maintained by the tick is stepped forward by one less than the
|
|
||||||
time spent waiting. */
|
|
||||||
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -504,7 +533,7 @@ uint32_t ulPreviousMask;
|
||||||
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;
|
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? */
|
||||||
|
|
@ -512,50 +541,20 @@ uint32_t ulPreviousMask;
|
||||||
|
|
||||||
/* 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 = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD
|
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
||||||
again, then set portNVIC_SYSTICK_LOAD back to its standard
|
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
||||||
value. The critical section is used to ensure the tick interrupt
|
value. */
|
||||||
can only execute once in the case that the reload register is near
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
zero. */
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE = 0UL;
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
portENTER_CRITICAL();
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
{
|
|
||||||
portNVIC_SYSTICK_CTRL |= portNVIC_SYSTICK_ENABLE;
|
/* Exit with interrpts enabled. */
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
portNVIC_SYSTICK_LOAD = ulTimerCountsForOneTick - 1UL;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* #if configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the systick timer to generate the tick interrupts at the required
|
|
||||||
* frequency.
|
|
||||||
*/
|
|
||||||
void prvSetupTimerInterrupt( void )
|
|
||||||
{
|
|
||||||
/* Calculate the constants required to configure the tick interrupt. */
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
|
||||||
{
|
|
||||||
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
|
|
||||||
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
|
|
||||||
ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
|
|
||||||
}
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/* Stop and reset the SysTick. */
|
|
||||||
portNVIC_SYSTICK_CTRL = 0UL;
|
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE = 0UL;
|
|
||||||
|
|
||||||
/* Configure SysTick to interrupt at the requested rate. */
|
|
||||||
portNVIC_SYSTICK_LOAD = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
|
||||||
portNVIC_SYSTICK_CTRL = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -106,7 +106,6 @@ extern void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__((naked)
|
||||||
extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
||||||
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
||||||
|
|
@ -115,6 +114,8 @@ extern void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__((naked)
|
||||||
|
|
||||||
#define portNOP()
|
#define portNOP()
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/port.c
vendored
Normal file
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/port.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
453
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/portasm.c
vendored
Normal file
453
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/portasm.c
vendored
Normal file
|
|
@ -0,0 +1,453 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION
|
||||||
|
* is defined correctly and privileged functions are placed in correct sections. */
|
||||||
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
/* Portasm includes. */
|
||||||
|
#include "portasm.h"
|
||||||
|
|
||||||
|
/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the
|
||||||
|
* header files. */
|
||||||
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst2 \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r5, #1 \n" /* r5 = 1. */
|
||||||
|
" bics r4, r5 \n" /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r4, [r3] \n" /* r4 = *r3 i.e. r4 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const2 \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r4, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst2 \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
|
||||||
|
" movs r5, #4 \n" /* r5 = 4. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst2 \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write first set of RBAR/RLAR registers. */
|
||||||
|
" movs r5, #5 \n" /* r5 = 5. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 5. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst2 \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write second set of RBAR/RLAR registers. */
|
||||||
|
" movs r5, #6 \n" /* r5 = 6. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 6. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst2 \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write third set of RBAR/RLAR registers. */
|
||||||
|
" movs r5, #7 \n" /* r5 = 7. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 7. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst2 \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r5, #1 \n" /* r5 = 1. */
|
||||||
|
" orrs r4, r5 \n" /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldm r0!, {r1-r4} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
|
||||||
|
" ldr r5, xSecureContextConst2 \n"
|
||||||
|
" str r1, [r5] \n" /* Set xSecureContext to this task's value for the same. */
|
||||||
|
" msr psplim, r2 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" msr control, r3 \n" /* Set this task's CONTROL value. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r4 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
|
" ldr r4, xSecureContextConst2 \n"
|
||||||
|
" str r1, [r4] \n" /* Set xSecureContext to this task's value for the same. */
|
||||||
|
" msr psplim, r2 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" movs r1, #2 \n" /* r1 = 2. */
|
||||||
|
" msr CONTROL, r1 \n" /* Switch to use PSP in the thread mode. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r3 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst2: .word pxCurrentTCB \n"
|
||||||
|
"xSecureContextConst2: .word xSecureContext \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst2: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const2: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst2: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst2: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" movs r1, #1 \n" /* r1 = 1. */
|
||||||
|
" tst r0, r1 \n" /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
" beq running_privileged \n" /* If the result of previous AND operation was 0, branch. */
|
||||||
|
" movs r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
" running_privileged: \n"
|
||||||
|
" movs r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
::: "r0", "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* Read the CONTROL register. */
|
||||||
|
" movs r1, #1 \n" /* r1 = 1. */
|
||||||
|
" bics r0, r1 \n" /* Clear the bit 0. */
|
||||||
|
" msr control, r0 \n" /* Write back the new CONTROL value. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
::: "r0", "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" movs r1, #1 \n" /* r1 = 1. */
|
||||||
|
" orrs r0, r1 \n" /* r0 = r0 | r1. */
|
||||||
|
" msr control, r0 \n" /* CONTROL = r0. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
:::"r0", "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" ldr r0, xVTORConst \n" /* Use the NVIC offset register to locate the stack. */
|
||||||
|
" ldr r0, [r0] \n" /* Read the VTOR register which gives the address of vector table. */
|
||||||
|
" ldr r0, [r0] \n" /* The first entry in vector table is stack pointer. */
|
||||||
|
" msr msp, r0 \n" /* Set the MSP back to the start of the stack. */
|
||||||
|
" cpsie i \n" /* Globally enable interrupts. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" svc %0 \n" /* System call to start the first task. */
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"xVTORConst: .word 0xe000ed08 \n"
|
||||||
|
:: "i" ( portSVC_START_SCHEDULER ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, PRIMASK \n"
|
||||||
|
" cpsid i \n"
|
||||||
|
" bx lr \n"
|
||||||
|
::: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" msr PRIMASK, r0 \n"
|
||||||
|
" bx lr \n"
|
||||||
|
::: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" .extern SecureContext_SaveContext \n"
|
||||||
|
" .extern SecureContext_LoadContext \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r1, psp \n" /* Read PSP in r1. */
|
||||||
|
" ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
" ldr r0, [r2] \n" /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
|
||||||
|
" \n"
|
||||||
|
" cbz r0, save_ns_context \n" /* No secure context to save. */
|
||||||
|
" push {r0-r2, r14} \n"
|
||||||
|
" bl SecureContext_SaveContext \n"
|
||||||
|
" pop {r0-r3} \n" /* LR is now in r3. */
|
||||||
|
" mov lr, r3 \n" /* LR = r3. */
|
||||||
|
" lsls r2, r3, #25 \n" /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
" bpl save_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
" ldr r3, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r2, [r3] \n" /* Read pxCurrentTCB. */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" subs r1, r1, #16 \n" /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mrs r3, control \n" /* r3 = CONTROL. */
|
||||||
|
" mov r4, lr \n" /* r4 = LR/EXC_RETURN. */
|
||||||
|
" stmia r1!, {r0, r2-r4} \n" /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" subs r1, r1, #12 \n" /* Make space for xSecureContext, PSPLIM and LR on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" stmia r1!, {r0, r2-r3} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" b select_next_task \n"
|
||||||
|
" \n"
|
||||||
|
" save_ns_context: \n"
|
||||||
|
" ldr r3, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r2, [r3] \n" /* Read pxCurrentTCB. */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" subs r1, r1, #48 \n" /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" adds r1, r1, #16 \n" /* r1 = r1 + 16. */
|
||||||
|
" stmia r1!, {r4-r7} \n" /* Store the low registers that are not saved automatically. */
|
||||||
|
" mov r4, r8 \n" /* r4 = r8. */
|
||||||
|
" mov r5, r9 \n" /* r5 = r9. */
|
||||||
|
" mov r6, r10 \n" /* r6 = r10. */
|
||||||
|
" mov r7, r11 \n" /* r7 = r11. */
|
||||||
|
" stmia r1!, {r4-r7} \n" /* Store the high registers that are not saved automatically. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mrs r3, control \n" /* r3 = CONTROL. */
|
||||||
|
" mov r4, lr \n" /* r4 = LR/EXC_RETURN. */
|
||||||
|
" subs r1, r1, #48 \n" /* r1 = r1 - 48. */
|
||||||
|
" stmia r1!, {r0, r2-r4} \n" /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" subs r1, r1, #44 \n" /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" stmia r1!, {r0, r2-r7} \n" /* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */
|
||||||
|
" mov r4, r8 \n" /* r4 = r8. */
|
||||||
|
" mov r5, r9 \n" /* r5 = r9. */
|
||||||
|
" mov r6, r10 \n" /* r6 = r10. */
|
||||||
|
" mov r7, r11 \n" /* r7 = r11. */
|
||||||
|
" stmia r1!, {r4-r7} \n" /* Store the high registers that are not saved automatically. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" select_next_task: \n"
|
||||||
|
" cpsid i \n"
|
||||||
|
" bl vTaskSwitchContext \n"
|
||||||
|
" cpsie i \n"
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. r1 now points to the top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r5, #1 \n" /* r5 = 1. */
|
||||||
|
" bics r4, r5 \n" /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r4, [r3] \n" /* r4 = *r3 i.e. r4 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r4, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
|
||||||
|
" movs r5, #4 \n" /* r5 = 4. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write first set of RBAR/RLAR registers. */
|
||||||
|
" movs r5, #5 \n" /* r5 = 5. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 5. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write second set of RBAR/RLAR registers. */
|
||||||
|
" movs r5, #6 \n" /* r5 = 6. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 6. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write third set of RBAR/RLAR registers. */
|
||||||
|
" movs r5, #7 \n" /* r5 = 7. */
|
||||||
|
" str r5, [r2] \n" /* Program RNR = 7. */
|
||||||
|
" ldmia r3!, {r6,r7} \n" /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r4, xRBARConst \n" /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r4!, {r6,r7} \n" /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r5, #1 \n" /* r5 = 1. */
|
||||||
|
" orrs r4, r5 \n" /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldmia r1!, {r0, r2-r4} \n" /* Read from stack - r0 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = LR. */
|
||||||
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
" msr control, r3 \n" /* Restore the CONTROL register value for the task. */
|
||||||
|
" mov lr, r4 \n" /* LR = r4. */
|
||||||
|
" ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
" str r0, [r2] \n" /* Restore the task's xSecureContext. */
|
||||||
|
" cbz r0, restore_ns_context \n" /* If there is no secure context for the task, restore the non-secure context. */
|
||||||
|
" push {r1,r4} \n"
|
||||||
|
" bl SecureContext_LoadContext \n" /* Restore the secure context. */
|
||||||
|
" pop {r1,r4} \n"
|
||||||
|
" mov lr, r4 \n" /* LR = r4. */
|
||||||
|
" lsls r2, r4, #25 \n" /* r2 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
" bpl restore_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
" msr psp, r1 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" bx lr \n"
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" ldmia r1!, {r0, r2-r3} \n" /* Read from stack - r0 = xSecureContext, r2 = PSPLIM and r3 = LR. */
|
||||||
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
" mov lr, r3 \n" /* LR = r3. */
|
||||||
|
" ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
" str r0, [r2] \n" /* Restore the task's xSecureContext. */
|
||||||
|
" cbz r0, restore_ns_context \n" /* If there is no secure context for the task, restore the non-secure context. */
|
||||||
|
" push {r1,r3} \n"
|
||||||
|
" bl SecureContext_LoadContext \n" /* Restore the secure context. */
|
||||||
|
" pop {r1,r3} \n"
|
||||||
|
" mov lr, r3 \n" /* LR = r3. */
|
||||||
|
" lsls r2, r3, #25 \n" /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
" bpl restore_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
" msr psp, r1 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" bx lr \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" restore_ns_context: \n"
|
||||||
|
" adds r1, r1, #16 \n" /* Move to the high registers. */
|
||||||
|
" ldmia r1!, {r4-r7} \n" /* Restore the high registers that are not automatically restored. */
|
||||||
|
" mov r8, r4 \n" /* r8 = r4. */
|
||||||
|
" mov r9, r5 \n" /* r9 = r5. */
|
||||||
|
" mov r10, r6 \n" /* r10 = r6. */
|
||||||
|
" mov r11, r7 \n" /* r11 = r7. */
|
||||||
|
" msr psp, r1 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" subs r1, r1, #32 \n" /* Go back to the low registers. */
|
||||||
|
" ldmia r1!, {r4-r7} \n" /* Restore the low registers that are not automatically restored. */
|
||||||
|
" bx lr \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst: .word pxCurrentTCB \n"
|
||||||
|
"xSecureContextConst: .word xSecureContext \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" movs r0, #4 \n"
|
||||||
|
" mov r1, lr \n"
|
||||||
|
" tst r0, r1 \n"
|
||||||
|
" beq stacking_used_msp \n"
|
||||||
|
" mrs r0, psp \n"
|
||||||
|
" ldr r2, svchandler_address_const \n"
|
||||||
|
" bx r2 \n"
|
||||||
|
" stacking_used_msp: \n"
|
||||||
|
" mrs r0, msp \n"
|
||||||
|
" ldr r2, svchandler_address_const \n"
|
||||||
|
" bx r2 \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"svchandler_address_const: .word vPortSVCHandler_C \n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" svc %0 \n" /* Secure context is allocated in the supervisor call. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
:: "i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" ldr r1, [r0] \n" /* The first item in the TCB is the top of the stack. */
|
||||||
|
" ldr r0, [r1] \n" /* The first item on the stack is the task's xSecureContext. */
|
||||||
|
" cmp r0, #0 \n" /* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
" beq free_secure_context \n"
|
||||||
|
" bx lr \n" /* There is no secure context (xSecureContext is NULL). */
|
||||||
|
" free_secure_context: \n"
|
||||||
|
" svc %0 \n" /* Secure context is freed in the supervisor call. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
:: "i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/portasm.h
vendored
Normal file
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/portasm.h
vendored
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* 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 __PORT_ASM_H__
|
||||||
|
#define __PORT_ASM_H__
|
||||||
|
|
||||||
|
/* Scheduler includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
|
/* MPU wrappers includes. */
|
||||||
|
#include "mpu_wrappers.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restore the context of the first task so that the first task starts
|
||||||
|
* executing.
|
||||||
|
*/
|
||||||
|
void vRestoreContextOfFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raises the privilege level by clearing the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* @note This is a privileged function and should only be called from the kenrel
|
||||||
|
* code.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vRaisePrivilege( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the first task.
|
||||||
|
*/
|
||||||
|
void vStartFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables interrupts.
|
||||||
|
*/
|
||||||
|
uint32_t ulSetInterruptMask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables interrupts.
|
||||||
|
*/
|
||||||
|
void vClearInterruptMask( uint32_t ulMask ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PendSV Exception handler.
|
||||||
|
*/
|
||||||
|
void PendSV_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC Handler.
|
||||||
|
*/
|
||||||
|
void SVC_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a Secure context for the calling task.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the stack to be allocated on the
|
||||||
|
* secure side for the calling task.
|
||||||
|
*/
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free the task's secure context.
|
||||||
|
*
|
||||||
|
* @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
|
||||||
|
*/
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
#endif /* __PORT_ASM_H__ */
|
||||||
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/portmacro.h
vendored
Normal file
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/non_secure/portmacro.h
vendored
Normal file
|
|
@ -0,0 +1,310 @@
|
||||||
|
/*
|
||||||
|
* 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 PORTMACRO_H
|
||||||
|
#define PORTMACRO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Port specific definitions.
|
||||||
|
*
|
||||||
|
* The settings in this file configure FreeRTOS correctly for the given hardware
|
||||||
|
* and compiler.
|
||||||
|
*
|
||||||
|
* These settings should not be altered.
|
||||||
|
*------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef configENABLE_FPU
|
||||||
|
#error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU.
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_MPU
|
||||||
|
#error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU.
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_TRUSTZONE
|
||||||
|
#error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone.
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type definitions.
|
||||||
|
*/
|
||||||
|
#define portCHAR char
|
||||||
|
#define portFLOAT float
|
||||||
|
#define portDOUBLE double
|
||||||
|
#define portLONG long
|
||||||
|
#define portSHORT short
|
||||||
|
#define portSTACK_TYPE uint32_t
|
||||||
|
#define portBASE_TYPE long
|
||||||
|
|
||||||
|
typedef portSTACK_TYPE StackType_t;
|
||||||
|
typedef long BaseType_t;
|
||||||
|
typedef unsigned long UBaseType_t;
|
||||||
|
|
||||||
|
#if( configUSE_16_BIT_TICKS == 1 )
|
||||||
|
typedef uint16_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffff
|
||||||
|
#else
|
||||||
|
typedef uint32_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
#define portTICK_TYPE_IS_ATOMIC 1
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Architecture specifics.
|
||||||
|
*/
|
||||||
|
#define portARCH_NAME "Cortex-M23"
|
||||||
|
#define portSTACK_GROWTH ( -1 )
|
||||||
|
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
|
||||||
|
#define portBYTE_ALIGNMENT 8
|
||||||
|
#define portNOP()
|
||||||
|
#define portINLINE __inline
|
||||||
|
#ifndef portFORCE_INLINE
|
||||||
|
#define portFORCE_INLINE inline __attribute__(( always_inline ))
|
||||||
|
#endif
|
||||||
|
#define portHAS_STACK_OVERFLOW_CHECKING 1
|
||||||
|
#define portDONT_DISCARD __attribute__(( used ))
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extern declarations.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortIsInsideInterrupt( void );
|
||||||
|
|
||||||
|
extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */
|
||||||
|
extern void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */;
|
||||||
|
extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU specific constants.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
#else
|
||||||
|
#define portPRIVILEGE_BIT ( 0x0UL )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
|
||||||
|
/* MPU regions. */
|
||||||
|
#define portPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
|
#define portUNPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
#define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL )
|
||||||
|
#define portPRIVILEGED_RAM_REGION ( 3UL )
|
||||||
|
#define portSTACK_REGION ( 4UL )
|
||||||
|
#define portFIRST_CONFIGURABLE_REGION ( 5UL )
|
||||||
|
#define portLAST_CONFIGURABLE_REGION ( 7UL )
|
||||||
|
#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )
|
||||||
|
#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */
|
||||||
|
|
||||||
|
/* Device memory attributes used in MPU_MAIR registers.
|
||||||
|
*
|
||||||
|
* 8-bit values encoded as follows:
|
||||||
|
* Bit[7:4] - 0000 - Device Memory
|
||||||
|
* Bit[3:2] - 00 --> Device-nGnRnE
|
||||||
|
* 01 --> Device-nGnRE
|
||||||
|
* 10 --> Device-nGRE
|
||||||
|
* 11 --> Device-GRE
|
||||||
|
* Bit[1:0] - 00, Reserved.
|
||||||
|
*/
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */
|
||||||
|
|
||||||
|
/* Normal memory attributes used in MPU_MAIR registers. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */
|
||||||
|
|
||||||
|
/* Attributes used in MPU_RBAR registers. */
|
||||||
|
#define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL )
|
||||||
|
#define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL )
|
||||||
|
#define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_WRITE ( 1UL << 1UL )
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_ONLY ( 3UL << 1UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 1UL )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Settings to define an MPU region.
|
||||||
|
*/
|
||||||
|
typedef struct MPURegionSettings
|
||||||
|
{
|
||||||
|
uint32_t ulRBAR; /**< RBAR for the region. */
|
||||||
|
uint32_t ulRLAR; /**< RLAR for the region. */
|
||||||
|
} MPURegionSettings_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU settings as stored in the TCB.
|
||||||
|
*/
|
||||||
|
typedef struct MPU_SETTINGS
|
||||||
|
{
|
||||||
|
uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */
|
||||||
|
MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */
|
||||||
|
} xMPU_SETTINGS;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC numbers.
|
||||||
|
*/
|
||||||
|
#define portSVC_ALLOCATE_SECURE_CONTEXT 0
|
||||||
|
#define portSVC_FREE_SECURE_CONTEXT 1
|
||||||
|
#define portSVC_START_SCHEDULER 2
|
||||||
|
#define portSVC_RAISE_PRIVILEGE 3
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Scheduler utilities.
|
||||||
|
*/
|
||||||
|
#define portYIELD() vPortYield()
|
||||||
|
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
|
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||||
|
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
||||||
|
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Critical section management.
|
||||||
|
*/
|
||||||
|
#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask()
|
||||||
|
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMask( x )
|
||||||
|
#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" )
|
||||||
|
#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" )
|
||||||
|
#define portENTER_CRITICAL() vPortEnterCritical()
|
||||||
|
#define portEXIT_CRITICAL() vPortExitCritical()
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tickless idle/low power functionality.
|
||||||
|
*/
|
||||||
|
#ifndef portSUPPRESS_TICKS_AND_SLEEP
|
||||||
|
extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
||||||
|
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Task function macros as described on the FreeRTOS.org WEB site.
|
||||||
|
*/
|
||||||
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Allocate a secure context for the task.
|
||||||
|
*
|
||||||
|
* Tasks are not created with a secure context. Any task that is going to call
|
||||||
|
* secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a
|
||||||
|
* secure context before it calls any secure function.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the secure stack to be allocated.
|
||||||
|
*/
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a task is deleted to delete the task's secure context,
|
||||||
|
* if it has one.
|
||||||
|
*
|
||||||
|
* @param[in] pxTCB The TCB of the task being deleted.
|
||||||
|
*/
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB )
|
||||||
|
#else
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB )
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*
|
||||||
|
* The SVC handler checks that the SVC was raised from a system call and only
|
||||||
|
* then it raises the privilege. If this is called from any other place,
|
||||||
|
* the privilege is not raised.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
|
#else
|
||||||
|
#define portIS_PRIVILEGED()
|
||||||
|
#define portRAISE_PRIVILEGE()
|
||||||
|
#define portRESET_PRIVILEGE()
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Barriers.
|
||||||
|
*/
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PORTMACRO_H */
|
||||||
204
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_context.c
vendored
Normal file
204
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_context.c
vendored
Normal file
|
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Secure context includes. */
|
||||||
|
#include "secure_context.h"
|
||||||
|
|
||||||
|
/* Secure heap includes. */
|
||||||
|
#include "secure_heap.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief CONTROL value for privileged tasks.
|
||||||
|
*
|
||||||
|
* Bit[0] - 0 --> Thread mode is privileged.
|
||||||
|
* Bit[1] - 1 --> Thread mode uses PSP.
|
||||||
|
*/
|
||||||
|
#define securecontextCONTROL_VALUE_PRIVILEGED 0x02
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief CONTROL value for un-privileged tasks.
|
||||||
|
*
|
||||||
|
* Bit[0] - 1 --> Thread mode is un-privileged.
|
||||||
|
* Bit[1] - 1 --> Thread mode uses PSP.
|
||||||
|
*/
|
||||||
|
#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure to represent secure context.
|
||||||
|
*
|
||||||
|
* @note Since stack grows down, pucStackStart is the highest address while
|
||||||
|
* pucStackLimit is the first addess of the allocated memory.
|
||||||
|
*/
|
||||||
|
typedef struct SecureContext
|
||||||
|
{
|
||||||
|
uint8_t *pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */
|
||||||
|
uint8_t *pucStackLimit; /**< Last location of the stack memory (PSPLIM). */
|
||||||
|
uint8_t *pucStackStart; /**< First location of the stack memory. */
|
||||||
|
} SecureContext_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* No stack for thread mode until a task's context is loaded. */
|
||||||
|
secureportSET_PSPLIM( securecontextNO_STACK );
|
||||||
|
secureportSET_PSP( securecontextNO_STACK );
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
{
|
||||||
|
/* Configure thread mode to use PSP and to be unprivileged. */
|
||||||
|
secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );
|
||||||
|
}
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
/* Configure thread mode to use PSP and to be privileged.. */
|
||||||
|
secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );
|
||||||
|
}
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged )
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
uint8_t *pucStackMemory = NULL;
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
SecureContextHandle_t xSecureContextHandle = NULL;
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
uint32_t *pulCurrentStackPointer = NULL;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* Allocate the context structure. */
|
||||||
|
xSecureContextHandle = ( SecureContextHandle_t ) pvPortMalloc( sizeof( SecureContext_t ) );
|
||||||
|
|
||||||
|
if( xSecureContextHandle != NULL )
|
||||||
|
{
|
||||||
|
/* Allocate the stack space. */
|
||||||
|
pucStackMemory = pvPortMalloc( ulSecureStackSize );
|
||||||
|
|
||||||
|
if( pucStackMemory != NULL )
|
||||||
|
{
|
||||||
|
/* Since stack grows down, the starting point will be the last
|
||||||
|
* location. Note that this location is next to the last
|
||||||
|
* allocated byte because the hardware decrements the stack
|
||||||
|
* pointer before writing i.e. if stack pointer is 0x2, a push
|
||||||
|
* operation will decrement the stack pointer to 0x1 and then
|
||||||
|
* write at 0x1. */
|
||||||
|
xSecureContextHandle->pucStackStart = pucStackMemory + ulSecureStackSize;
|
||||||
|
|
||||||
|
/* The stack cannot go beyond this location. This value is
|
||||||
|
* programmed in the PSPLIM register on context switch.*/
|
||||||
|
xSecureContextHandle->pucStackLimit = pucStackMemory;
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
{
|
||||||
|
/* Store the correct CONTROL value for the task on the stack.
|
||||||
|
* This value is programmed in the CONTROL register on
|
||||||
|
* context switch. */
|
||||||
|
pulCurrentStackPointer = ( uint32_t * ) xSecureContextHandle->pucStackStart;
|
||||||
|
pulCurrentStackPointer--;
|
||||||
|
if( ulIsTaskPrivileged )
|
||||||
|
{
|
||||||
|
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store the current stack pointer. This value is programmed in
|
||||||
|
* the PSP register on context switch. */
|
||||||
|
xSecureContextHandle->pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;
|
||||||
|
}
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
/* Current SP is set to the starting of the stack. This
|
||||||
|
* value programmed in the PSP register on context switch. */
|
||||||
|
xSecureContextHandle->pucCurrentStackPointer = xSecureContextHandle->pucStackStart;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Free the context to avoid memory leak and make sure to return
|
||||||
|
* NULL to indicate failure. */
|
||||||
|
vPortFree( xSecureContextHandle );
|
||||||
|
xSecureContextHandle = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xSecureContextHandle;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* Ensure that valid parameters are passed. */
|
||||||
|
secureportASSERT( xSecureContextHandle != NULL );
|
||||||
|
|
||||||
|
/* Free the stack space. */
|
||||||
|
vPortFree( xSecureContextHandle->pucStackLimit );
|
||||||
|
|
||||||
|
/* Free the context itself. */
|
||||||
|
vPortFree( xSecureContextHandle );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
111
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_context.h
vendored
Normal file
111
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_context.h
vendored
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_CONTEXT_H__
|
||||||
|
#define __SECURE_CONTEXT_H__
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOSConfig.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PSP value when no task's context is loaded.
|
||||||
|
*/
|
||||||
|
#define securecontextNO_STACK 0x0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Opaque handle.
|
||||||
|
*/
|
||||||
|
struct SecureContext;
|
||||||
|
typedef struct SecureContext* SecureContextHandle_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the secure context management system.
|
||||||
|
*
|
||||||
|
* PSP is set to NULL and therefore a task must allocate and load a context
|
||||||
|
* before calling any secure side function in the thread mode.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureContext_Init( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocates a context on the secure side.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize Size of the stack to allocate on secure side.
|
||||||
|
* @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.
|
||||||
|
*
|
||||||
|
* @return Opaque context handle if context is successfully allocated, NULL
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged );
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize );
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the
|
||||||
|
* context to be freed.
|
||||||
|
*/
|
||||||
|
void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the context
|
||||||
|
* to be loaded.
|
||||||
|
*/
|
||||||
|
void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Saves the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the context
|
||||||
|
* to be saved.
|
||||||
|
*/
|
||||||
|
void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
#endif /* __SECURE_CONTEXT_H__ */
|
||||||
91
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_context_port.c
vendored
Normal file
91
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_context_port.c
vendored
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Secure context includes. */
|
||||||
|
#include "secure_context.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
/* xSecureContextHandle value is in r0. */
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r1, ipsr \n" /* r1 = IPSR. */
|
||||||
|
" cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */
|
||||||
|
" ldmia r0!, {r1, r2} \n" /* r1 = xSecureContextHandle->pucCurrentStackPointer, r2 = xSecureContextHandle->pucStackLimit. */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */
|
||||||
|
" msr control, r3 \n" /* CONTROL = r3. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" msr psplim, r2 \n" /* PSPLIM = r2. */
|
||||||
|
" msr psp, r1 \n" /* PSP = r1. */
|
||||||
|
" \n"
|
||||||
|
" load_ctx_therad_mode: \n"
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
:::"r0", "r1", "r2"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
/* xSecureContextHandle value is in r0. */
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r1, ipsr \n" /* r1 = IPSR. */
|
||||||
|
" cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */
|
||||||
|
" mrs r1, psp \n" /* r1 = PSP. */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" mrs r2, control \n" /* r2 = CONTROL. */
|
||||||
|
" subs r1, r1, #4 \n" /* Make space for the CONTROL value on the stack. */
|
||||||
|
" str r1, [r0] \n" /* Save the top of stack in context. xSecureContextHandle->pucCurrentStackPointer = r1. */
|
||||||
|
" stmia r1!, {r2} \n" /* Store CONTROL value on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" str r1, [r0] \n" /* Save the top of stack in context. xSecureContextHandle->pucCurrentStackPointer = r1. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" movs r1, %0 \n" /* r1 = securecontextNO_STACK. */
|
||||||
|
" msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */
|
||||||
|
" msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */
|
||||||
|
" \n"
|
||||||
|
" save_ctx_therad_mode: \n"
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
:: "i" ( securecontextNO_STACK ) : "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
450
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_heap.c
vendored
Normal file
450
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_heap.c
vendored
Normal file
|
|
@ -0,0 +1,450 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Secure context heap includes. */
|
||||||
|
#include "secure_heap.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Total heap size.
|
||||||
|
*/
|
||||||
|
#define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) )
|
||||||
|
|
||||||
|
/* No test marker by default. */
|
||||||
|
#ifndef mtCOVERAGE_TEST_MARKER
|
||||||
|
#define mtCOVERAGE_TEST_MARKER()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* No tracing by default. */
|
||||||
|
#ifndef traceMALLOC
|
||||||
|
#define traceMALLOC( pvReturn, xWantedSize )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* No tracing by default. */
|
||||||
|
#ifndef traceFREE
|
||||||
|
#define traceFREE( pv, xBlockSize )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Block sizes must not get too small. */
|
||||||
|
#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) )
|
||||||
|
|
||||||
|
/* Assumes 8bit bytes! */
|
||||||
|
#define secureheapBITS_PER_BYTE ( ( size_t ) 8 )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Allocate the memory for the heap. */
|
||||||
|
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
|
||||||
|
/* 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. */
|
||||||
|
extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
||||||
|
#else /* configAPPLICATION_ALLOCATED_HEAP */
|
||||||
|
static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
||||||
|
#endif /* configAPPLICATION_ALLOCATED_HEAP */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The linked list structure.
|
||||||
|
*
|
||||||
|
* This is used to link free blocks in order of their memory address.
|
||||||
|
*/
|
||||||
|
typedef struct A_BLOCK_LINK
|
||||||
|
{
|
||||||
|
struct A_BLOCK_LINK *pxNextFreeBlock; /**< The next free block in the list. */
|
||||||
|
size_t xBlockSize; /**< The size of the free block. */
|
||||||
|
} BlockLink_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called automatically to setup the required heap structures the first
|
||||||
|
* time pvPortMalloc() is called.
|
||||||
|
*/
|
||||||
|
static void prvHeapInit( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inserts a block of memory that is being freed into the correct
|
||||||
|
* position in the list of free memory blocks.
|
||||||
|
*
|
||||||
|
* The block being freed will be merged with the block in front it and/or the
|
||||||
|
* block behind it if the memory blocks are adjacent to each other.
|
||||||
|
*
|
||||||
|
* @param[in] pxBlockToInsert The block being freed.
|
||||||
|
*/
|
||||||
|
static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The size of the structure placed at the beginning of each allocated
|
||||||
|
* memory block must by correctly byte aligned.
|
||||||
|
*/
|
||||||
|
static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a couple of list links to mark the start and end of the list.
|
||||||
|
*/
|
||||||
|
static BlockLink_t xStart, *pxEnd = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Keeps track of the number of free bytes remaining, but says nothing
|
||||||
|
* about fragmentation.
|
||||||
|
*/
|
||||||
|
static size_t xFreeBytesRemaining = 0U;
|
||||||
|
static size_t xMinimumEverFreeBytesRemaining = 0U;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets set to the top bit of an size_t type.
|
||||||
|
*
|
||||||
|
* When this bit in the xBlockSize member of an BlockLink_t structure is set
|
||||||
|
* then the block belongs to the application. When the bit is free the block is
|
||||||
|
* still part of the free heap space.
|
||||||
|
*/
|
||||||
|
static size_t xBlockAllocatedBit = 0;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvHeapInit( void )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxFirstFreeBlock;
|
||||||
|
uint8_t *pucAlignedHeap;
|
||||||
|
size_t uxAddress;
|
||||||
|
size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;
|
||||||
|
|
||||||
|
/* Ensure the heap starts on a correctly aligned boundary. */
|
||||||
|
uxAddress = ( size_t ) ucHeap;
|
||||||
|
|
||||||
|
if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )
|
||||||
|
{
|
||||||
|
uxAddress += ( secureportBYTE_ALIGNMENT - 1 );
|
||||||
|
uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
|
||||||
|
}
|
||||||
|
|
||||||
|
pucAlignedHeap = ( uint8_t * ) uxAddress;
|
||||||
|
|
||||||
|
/* xStart is used to hold a pointer to the first item in the list of free
|
||||||
|
* blocks. The void cast is used to prevent compiler warnings. */
|
||||||
|
xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
|
||||||
|
xStart.xBlockSize = ( size_t ) 0;
|
||||||
|
|
||||||
|
/* pxEnd is used to mark the end of the list of free blocks and is inserted
|
||||||
|
* at the end of the heap space. */
|
||||||
|
uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
|
||||||
|
uxAddress -= xHeapStructSize;
|
||||||
|
uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
pxEnd = ( void * ) uxAddress;
|
||||||
|
pxEnd->xBlockSize = 0;
|
||||||
|
pxEnd->pxNextFreeBlock = NULL;
|
||||||
|
|
||||||
|
/* To start with there is a single free block that is sized to take up the
|
||||||
|
* entire heap space, minus the space taken by pxEnd. */
|
||||||
|
pxFirstFreeBlock = ( void * ) pucAlignedHeap;
|
||||||
|
pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
|
||||||
|
pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
|
||||||
|
|
||||||
|
/* Only one block exists - and it covers the entire usable heap space. */
|
||||||
|
xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
|
||||||
|
xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
|
||||||
|
|
||||||
|
/* Work out the position of the top bit in a size_t variable. */
|
||||||
|
xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxIterator;
|
||||||
|
uint8_t *puc;
|
||||||
|
|
||||||
|
/* Iterate through the list until a block is found that has a higher address
|
||||||
|
* than the block being inserted. */
|
||||||
|
for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
|
||||||
|
{
|
||||||
|
/* Nothing to do here, just iterate to the right position. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do the block being inserted, and the block it is being inserted after
|
||||||
|
* make a contiguous block of memory? */
|
||||||
|
puc = ( uint8_t * ) pxIterator;
|
||||||
|
if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
|
||||||
|
{
|
||||||
|
pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
|
||||||
|
pxBlockToInsert = pxIterator;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do the block being inserted, and the block it is being inserted before
|
||||||
|
* make a contiguous block of memory? */
|
||||||
|
puc = ( uint8_t * ) pxBlockToInsert;
|
||||||
|
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
|
||||||
|
{
|
||||||
|
if( pxIterator->pxNextFreeBlock != pxEnd )
|
||||||
|
{
|
||||||
|
/* Form one big block from the two blocks. */
|
||||||
|
pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxEnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the block being inserted plugged a gab, so was merged with the block
|
||||||
|
* before and the block after, then it's pxNextFreeBlock pointer will have
|
||||||
|
* already been set, and should not be set here as that would make it point
|
||||||
|
* to itself. */
|
||||||
|
if( pxIterator != pxBlockToInsert )
|
||||||
|
{
|
||||||
|
pxIterator->pxNextFreeBlock = pxBlockToInsert;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void *pvPortMalloc( size_t xWantedSize )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
|
||||||
|
void *pvReturn = NULL;
|
||||||
|
|
||||||
|
/* If this is the first call to malloc then the heap will require
|
||||||
|
* initialisation to setup the list of free blocks. */
|
||||||
|
if( pxEnd == NULL )
|
||||||
|
{
|
||||||
|
prvHeapInit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the requested block size is not so large that the top bit is set.
|
||||||
|
* The top bit of the block size member of the BlockLink_t structure is used
|
||||||
|
* to determine who owns the block - the application or the kernel, so it
|
||||||
|
* must be free. */
|
||||||
|
if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
|
||||||
|
{
|
||||||
|
/* The wanted size is increased so it can contain a BlockLink_t
|
||||||
|
* structure in addition to the requested amount of bytes. */
|
||||||
|
if( xWantedSize > 0 )
|
||||||
|
{
|
||||||
|
xWantedSize += xHeapStructSize;
|
||||||
|
|
||||||
|
/* Ensure that blocks are always aligned to the required number of
|
||||||
|
* bytes. */
|
||||||
|
if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )
|
||||||
|
{
|
||||||
|
/* Byte alignment required. */
|
||||||
|
xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );
|
||||||
|
secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
|
||||||
|
{
|
||||||
|
/* Traverse the list from the start (lowest address) block until
|
||||||
|
* one of adequate size is found. */
|
||||||
|
pxPreviousBlock = &xStart;
|
||||||
|
pxBlock = xStart.pxNextFreeBlock;
|
||||||
|
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
|
||||||
|
{
|
||||||
|
pxPreviousBlock = pxBlock;
|
||||||
|
pxBlock = pxBlock->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the end marker was reached then a block of adequate size was
|
||||||
|
* not found. */
|
||||||
|
if( pxBlock != pxEnd )
|
||||||
|
{
|
||||||
|
/* Return the memory space pointed to - jumping over the
|
||||||
|
* BlockLink_t structure at its start. */
|
||||||
|
pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
|
||||||
|
|
||||||
|
/* This block is being returned for use so must be taken out
|
||||||
|
* of the list of free blocks. */
|
||||||
|
pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
|
||||||
|
|
||||||
|
/* If the block is larger than required it can be split into
|
||||||
|
* two. */
|
||||||
|
if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )
|
||||||
|
{
|
||||||
|
/* This block is to be split into two. Create a new
|
||||||
|
* block following the number of bytes requested. The void
|
||||||
|
* cast is used to prevent byte alignment warnings from the
|
||||||
|
* compiler. */
|
||||||
|
pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
|
||||||
|
secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
|
||||||
|
/* Calculate the sizes of two blocks split from the single
|
||||||
|
* block. */
|
||||||
|
pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
|
||||||
|
pxBlock->xBlockSize = xWantedSize;
|
||||||
|
|
||||||
|
/* Insert the new block into the list of free blocks. */
|
||||||
|
prvInsertBlockIntoFreeList( pxNewBlockLink );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
xFreeBytesRemaining -= pxBlock->xBlockSize;
|
||||||
|
|
||||||
|
if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
|
||||||
|
{
|
||||||
|
xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The block is being returned - it is allocated and owned by
|
||||||
|
* the application and has no "next" block. */
|
||||||
|
pxBlock->xBlockSize |= xBlockAllocatedBit;
|
||||||
|
pxBlock->pxNextFreeBlock = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
traceMALLOC( pvReturn, xWantedSize );
|
||||||
|
|
||||||
|
#if( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )
|
||||||
|
{
|
||||||
|
if( pvReturn == NULL )
|
||||||
|
{
|
||||||
|
extern void vApplicationMallocFailedHook( void );
|
||||||
|
vApplicationMallocFailedHook();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
return pvReturn;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortFree( void *pv )
|
||||||
|
{
|
||||||
|
uint8_t *puc = ( uint8_t * ) pv;
|
||||||
|
BlockLink_t *pxLink;
|
||||||
|
|
||||||
|
if( pv != NULL )
|
||||||
|
{
|
||||||
|
/* The memory being freed will have an BlockLink_t structure immediately
|
||||||
|
* before it. */
|
||||||
|
puc -= xHeapStructSize;
|
||||||
|
|
||||||
|
/* This casting is to keep the compiler from issuing warnings. */
|
||||||
|
pxLink = ( void * ) puc;
|
||||||
|
|
||||||
|
/* Check the block is actually allocated. */
|
||||||
|
secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
|
||||||
|
secureportASSERT( pxLink->pxNextFreeBlock == NULL );
|
||||||
|
|
||||||
|
if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
|
||||||
|
{
|
||||||
|
if( pxLink->pxNextFreeBlock == NULL )
|
||||||
|
{
|
||||||
|
/* The block is being returned to the heap - it is no longer
|
||||||
|
* allocated. */
|
||||||
|
pxLink->xBlockSize &= ~xBlockAllocatedBit;
|
||||||
|
|
||||||
|
secureportDISABLE_NON_SECURE_INTERRUPTS();
|
||||||
|
{
|
||||||
|
/* Add this block to the list of free blocks. */
|
||||||
|
xFreeBytesRemaining += pxLink->xBlockSize;
|
||||||
|
traceFREE( pv, pxLink->xBlockSize );
|
||||||
|
prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
|
||||||
|
}
|
||||||
|
secureportENABLE_NON_SECURE_INTERRUPTS();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
size_t xPortGetFreeHeapSize( void )
|
||||||
|
{
|
||||||
|
return xFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
size_t xPortGetMinimumEverFreeHeapSize( void )
|
||||||
|
{
|
||||||
|
return xMinimumEverFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortInitialiseBlocks( void )
|
||||||
|
{
|
||||||
|
/* This just exists to keep the linker quiet. */
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
51
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_heap.h
vendored
Normal file
51
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_heap.h
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_HEAP_H__
|
||||||
|
#define __SECURE_HEAP_H__
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocates memory from heap.
|
||||||
|
*
|
||||||
|
* @param[in] xWantedSize The size of the memory to be allocated.
|
||||||
|
*
|
||||||
|
* @return Pointer to the memory region if the allocation is successful, NULL
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
void *pvPortMalloc( size_t xWantedSize );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees the previously allocated memory.
|
||||||
|
*
|
||||||
|
* @param[in] pv Pointer to the memory to be freed.
|
||||||
|
*/
|
||||||
|
void vPortFree( void *pv );
|
||||||
|
|
||||||
|
#endif /* __SECURE_HEAP_H__ */
|
||||||
105
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_init.c
vendored
Normal file
105
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_init.c
vendored
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Secure init includes. */
|
||||||
|
#include "secure_init.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constants required to manipulate the SCB.
|
||||||
|
*/
|
||||||
|
#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */
|
||||||
|
#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL )
|
||||||
|
#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )
|
||||||
|
#define secureinitSCB_AIRCR_PRIS_POS ( 14UL )
|
||||||
|
#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constants required to manipulate the FPU.
|
||||||
|
*/
|
||||||
|
#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */
|
||||||
|
#define secureinitFPCCR_LSPENS_POS ( 29UL )
|
||||||
|
#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS )
|
||||||
|
#define secureinitFPCCR_TS_POS ( 26UL )
|
||||||
|
#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS )
|
||||||
|
|
||||||
|
#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */
|
||||||
|
#define secureinitNSACR_CP10_POS ( 10UL )
|
||||||
|
#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS )
|
||||||
|
#define secureinitNSACR_CP11_POS ( 11UL )
|
||||||
|
#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
*( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |
|
||||||
|
( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |
|
||||||
|
( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* CP10 = 1 ==> Non-secure access to the Floating Point Unit is
|
||||||
|
* permitted. CP11 should be programmed to the same value as CP10. */
|
||||||
|
*( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );
|
||||||
|
|
||||||
|
/* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures
|
||||||
|
* that we can enable/disable lazy stacking in port.c file. */
|
||||||
|
*( secureinitFPCCR ) &= ~ ( secureinitFPCCR_LSPENS_MASK );
|
||||||
|
|
||||||
|
/* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP
|
||||||
|
* registers (S16-S31) are also pushed to stack on exception entry and
|
||||||
|
* restored on exception return. */
|
||||||
|
*( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
53
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_init.h
vendored
Normal file
53
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_init.h
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_INIT_H__
|
||||||
|
#define __SECURE_INIT_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief De-prioritizes the non-secure exceptions.
|
||||||
|
*
|
||||||
|
* This is needed to ensure that the non-secure PendSV runs at the lowest
|
||||||
|
* priority. Context switch is done in the non-secure PendSV handler.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureInit_DePrioritizeNSExceptions( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.
|
||||||
|
*
|
||||||
|
* Also sets FPCCR.TS=1 to ensure that the content of the Floating Point
|
||||||
|
* Registers are not leaked to the non-secure side.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureInit_EnableNSFPUAccess( void );
|
||||||
|
|
||||||
|
#endif /* __SECURE_INIT_H__ */
|
||||||
133
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_port_macros.h
vendored
Normal file
133
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23/secure/secure_port_macros.h
vendored
Normal file
|
|
@ -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 __SECURE_PORT_MACROS_H__
|
||||||
|
#define __SECURE_PORT_MACROS_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Byte alignment requirements.
|
||||||
|
*/
|
||||||
|
#define secureportBYTE_ALIGNMENT 8
|
||||||
|
#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to declare a function as non-secure callable.
|
||||||
|
*/
|
||||||
|
#if defined( __IAR_SYSTEMS_ICC__ )
|
||||||
|
#define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root
|
||||||
|
#else
|
||||||
|
#define secureportNON_SECURE_CALLABLE __attribute__((cmse_nonsecure_entry)) __attribute__((used))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the secure PRIMASK value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \
|
||||||
|
__asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the non-secure PRIMASK value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \
|
||||||
|
__asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the PSP value in the given variable.
|
||||||
|
*/
|
||||||
|
#define secureportREAD_PSP( pucOutCurrentStackPointer ) \
|
||||||
|
__asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the PSP to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_PSP( pucCurrentStackPointer ) \
|
||||||
|
__asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the PSPLIM to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_PSPLIM( pucStackLimit ) \
|
||||||
|
__asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the NonSecure MSP to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_MSP_NS( pucMainStackPointer ) \
|
||||||
|
__asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the CONTROL register to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_CONTROL( ulControl ) \
|
||||||
|
__asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the Interrupt Program Status Register (IPSR) value in the given
|
||||||
|
* variable.
|
||||||
|
*/
|
||||||
|
#define secureportREAD_IPSR( ulIPSR ) \
|
||||||
|
__asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PRIMASK value to enable interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PRIMASK value to disable interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable secure interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable non-secure interrupts.
|
||||||
|
*
|
||||||
|
* This effectively disables context switches.
|
||||||
|
*/
|
||||||
|
#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable non-secure interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assert definition.
|
||||||
|
*/
|
||||||
|
#define secureportASSERT( x ) \
|
||||||
|
if( ( x ) == 0 ) \
|
||||||
|
{ \
|
||||||
|
secureportDISABLE_SECURE_INTERRUPTS(); \
|
||||||
|
secureportDISABLE_NON_SECURE_INTERRUPTS(); \
|
||||||
|
for( ;; ); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __SECURE_PORT_MACROS_H__ */
|
||||||
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/port.c
vendored
Normal file
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/port.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
366
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c
vendored
Normal file
366
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c
vendored
Normal file
|
|
@ -0,0 +1,366 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION
|
||||||
|
* is defined correctly and privileged functions are placed in correct sections. */
|
||||||
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
/* Portasm includes. */
|
||||||
|
#include "portasm.h"
|
||||||
|
|
||||||
|
/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the
|
||||||
|
* header files. */
|
||||||
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst2 \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r4, #1 \n" /* r4 = 1. */
|
||||||
|
" bics r3, r4 \n" /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r4, [r1] \n" /* r4 = *r1 i.e. r4 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const2 \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r4, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst2 \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
|
||||||
|
" movs r4, #4 \n" /* r4 = 4. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst2 \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write first set of RBAR/RLAR registers. */
|
||||||
|
" movs r4, #5 \n" /* r4 = 5. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 5. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst2 \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write second set of RBAR/RLAR registers. */
|
||||||
|
" movs r4, #6 \n" /* r4 = 6. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 6. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst2 \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write third set of RBAR/RLAR registers. */
|
||||||
|
" movs r4, #7 \n" /* r4 = 7. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 7. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst2 \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r4, #1 \n" /* r4 = 1. */
|
||||||
|
" orrs r3, r4 \n" /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
|
||||||
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" msr control, r2 \n" /* Set this task's CONTROL value. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r3 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" movs r1, #2 \n" /* r1 = 2. */
|
||||||
|
" msr CONTROL, r1 \n" /* Switch to use PSP in the thread mode. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r2 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst2: .word pxCurrentTCB \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst2: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const2: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst2: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst2: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" movs r1, #1 \n" /* r1 = 1. */
|
||||||
|
" tst r0, r1 \n" /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
" beq running_privileged \n" /* If the result of previous AND operation was 0, branch. */
|
||||||
|
" movs r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
" running_privileged: \n"
|
||||||
|
" movs r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
::: "r0", "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* Read the CONTROL register. */
|
||||||
|
" movs r1, #1 \n" /* r1 = 1. */
|
||||||
|
" bics r0, r1 \n" /* Clear the bit 0. */
|
||||||
|
" msr control, r0 \n" /* Write back the new CONTROL value. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
::: "r0", "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" movs r1, #1 \n" /* r1 = 1. */
|
||||||
|
" orrs r0, r1 \n" /* r0 = r0 | r1. */
|
||||||
|
" msr control, r0 \n" /* CONTROL = r0. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
:::"r0", "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" ldr r0, xVTORConst \n" /* Use the NVIC offset register to locate the stack. */
|
||||||
|
" ldr r0, [r0] \n" /* Read the VTOR register which gives the address of vector table. */
|
||||||
|
" ldr r0, [r0] \n" /* The first entry in vector table is stack pointer. */
|
||||||
|
" msr msp, r0 \n" /* Set the MSP back to the start of the stack. */
|
||||||
|
" cpsie i \n" /* Globally enable interrupts. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" svc %0 \n" /* System call to start the first task. */
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"xVTORConst: .word 0xe000ed08 \n"
|
||||||
|
:: "i" ( portSVC_START_SCHEDULER ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, PRIMASK \n"
|
||||||
|
" cpsid i \n"
|
||||||
|
" bx lr \n"
|
||||||
|
::: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" msr PRIMASK, r0 \n"
|
||||||
|
" bx lr \n"
|
||||||
|
::: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r0, psp \n" /* Read PSP in r0. */
|
||||||
|
" ldr r2, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" subs r0, r0, #44 \n" /* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */
|
||||||
|
" str r0, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" mrs r1, psplim \n" /* r1 = PSPLIM. */
|
||||||
|
" mrs r2, control \n" /* r2 = CONTROL. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" stmia r0!, {r1-r7} \n" /* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */
|
||||||
|
" mov r4, r8 \n" /* r4 = r8. */
|
||||||
|
" mov r5, r9 \n" /* r5 = r9. */
|
||||||
|
" mov r6, r10 \n" /* r6 = r10. */
|
||||||
|
" mov r7, r11 \n" /* r7 = r11. */
|
||||||
|
" stmia r0!, {r4-r7} \n" /* Store the high registers that are not saved automatically. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" subs r0, r0, #40 \n" /* Make space for PSPLIM, LR and the remaining registers on the stack. */
|
||||||
|
" str r0, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" stmia r0!, {r2-r7} \n" /* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */
|
||||||
|
" mov r4, r8 \n" /* r4 = r8. */
|
||||||
|
" mov r5, r9 \n" /* r5 = r9. */
|
||||||
|
" mov r6, r10 \n" /* r6 = r10. */
|
||||||
|
" mov r7, r11 \n" /* r7 = r11. */
|
||||||
|
" stmia r0!, {r4-r7} \n" /* Store the high registers that are not saved automatically. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" cpsid i \n"
|
||||||
|
" bl vTaskSwitchContext \n"
|
||||||
|
" cpsie i \n"
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r4, #1 \n" /* r4 = 1. */
|
||||||
|
" bics r3, r4 \n" /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r4, [r1] \n" /* r4 = *r1 i.e. r4 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r4, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
|
||||||
|
" movs r4, #4 \n" /* r4 = 4. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write first set of RBAR/RLAR registers. */
|
||||||
|
" movs r4, #5 \n" /* r4 = 5. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 5. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write second set of RBAR/RLAR registers. */
|
||||||
|
" movs r4, #6 \n" /* r4 = 6. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 6. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write third set of RBAR/RLAR registers. */
|
||||||
|
" movs r4, #7 \n" /* r4 = 7. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 7. */
|
||||||
|
" ldmia r1!, {r5,r6} \n" /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
" ldr r3, xRBARConst \n" /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" stmia r3!, {r5,r6} \n" /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" movs r4, #1 \n" /* r4 = 1. */
|
||||||
|
" orrs r3, r4 \n" /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" adds r0, r0, #28 \n" /* Move to the high registers. */
|
||||||
|
" ldmia r0!, {r4-r7} \n" /* Restore the high registers that are not automatically restored. */
|
||||||
|
" mov r8, r4 \n" /* r8 = r4. */
|
||||||
|
" mov r9, r5 \n" /* r9 = r5. */
|
||||||
|
" mov r10, r6 \n" /* r10 = r6. */
|
||||||
|
" mov r11, r7 \n" /* r11 = r7. */
|
||||||
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" subs r0, r0, #44 \n" /* Move to the starting of the saved context. */
|
||||||
|
" ldmia r0!, {r1-r7} \n" /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */
|
||||||
|
" msr psplim, r1 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
" msr control, r2 \n" /* Restore the CONTROL register value for the task. */
|
||||||
|
" bx r3 \n"
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" adds r0, r0, #24 \n" /* Move to the high registers. */
|
||||||
|
" ldmia r0!, {r4-r7} \n" /* Restore the high registers that are not automatically restored. */
|
||||||
|
" mov r8, r4 \n" /* r8 = r4. */
|
||||||
|
" mov r9, r5 \n" /* r9 = r5. */
|
||||||
|
" mov r10, r6 \n" /* r10 = r6. */
|
||||||
|
" mov r11, r7 \n" /* r11 = r7. */
|
||||||
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" subs r0, r0, #40 \n" /* Move to the starting of the saved context. */
|
||||||
|
" ldmia r0!, {r2-r7} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */
|
||||||
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
" bx r3 \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst: .word pxCurrentTCB \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" movs r0, #4 \n"
|
||||||
|
" mov r1, lr \n"
|
||||||
|
" tst r0, r1 \n"
|
||||||
|
" beq stacking_used_msp \n"
|
||||||
|
" mrs r0, psp \n"
|
||||||
|
" ldr r2, svchandler_address_const \n"
|
||||||
|
" bx r2 \n"
|
||||||
|
" stacking_used_msp: \n"
|
||||||
|
" mrs r0, msp \n"
|
||||||
|
" ldr r2, svchandler_address_const \n"
|
||||||
|
" bx r2 \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"svchandler_address_const: .word vPortSVCHandler_C \n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h
vendored
Normal file
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h
vendored
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* 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 __PORT_ASM_H__
|
||||||
|
#define __PORT_ASM_H__
|
||||||
|
|
||||||
|
/* Scheduler includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
|
/* MPU wrappers includes. */
|
||||||
|
#include "mpu_wrappers.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restore the context of the first task so that the first task starts
|
||||||
|
* executing.
|
||||||
|
*/
|
||||||
|
void vRestoreContextOfFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raises the privilege level by clearing the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* @note This is a privileged function and should only be called from the kenrel
|
||||||
|
* code.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vRaisePrivilege( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the first task.
|
||||||
|
*/
|
||||||
|
void vStartFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables interrupts.
|
||||||
|
*/
|
||||||
|
uint32_t ulSetInterruptMask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables interrupts.
|
||||||
|
*/
|
||||||
|
void vClearInterruptMask( uint32_t ulMask ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PendSV Exception handler.
|
||||||
|
*/
|
||||||
|
void PendSV_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC Handler.
|
||||||
|
*/
|
||||||
|
void SVC_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a Secure context for the calling task.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the stack to be allocated on the
|
||||||
|
* secure side for the calling task.
|
||||||
|
*/
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free the task's secure context.
|
||||||
|
*
|
||||||
|
* @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
|
||||||
|
*/
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
#endif /* __PORT_ASM_H__ */
|
||||||
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h
vendored
Normal file
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h
vendored
Normal file
|
|
@ -0,0 +1,310 @@
|
||||||
|
/*
|
||||||
|
* 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 PORTMACRO_H
|
||||||
|
#define PORTMACRO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Port specific definitions.
|
||||||
|
*
|
||||||
|
* The settings in this file configure FreeRTOS correctly for the given hardware
|
||||||
|
* and compiler.
|
||||||
|
*
|
||||||
|
* These settings should not be altered.
|
||||||
|
*------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef configENABLE_FPU
|
||||||
|
#error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU.
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_MPU
|
||||||
|
#error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU.
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_TRUSTZONE
|
||||||
|
#error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone.
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type definitions.
|
||||||
|
*/
|
||||||
|
#define portCHAR char
|
||||||
|
#define portFLOAT float
|
||||||
|
#define portDOUBLE double
|
||||||
|
#define portLONG long
|
||||||
|
#define portSHORT short
|
||||||
|
#define portSTACK_TYPE uint32_t
|
||||||
|
#define portBASE_TYPE long
|
||||||
|
|
||||||
|
typedef portSTACK_TYPE StackType_t;
|
||||||
|
typedef long BaseType_t;
|
||||||
|
typedef unsigned long UBaseType_t;
|
||||||
|
|
||||||
|
#if( configUSE_16_BIT_TICKS == 1 )
|
||||||
|
typedef uint16_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffff
|
||||||
|
#else
|
||||||
|
typedef uint32_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
#define portTICK_TYPE_IS_ATOMIC 1
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Architecture specifics.
|
||||||
|
*/
|
||||||
|
#define portARCH_NAME "Cortex-M23"
|
||||||
|
#define portSTACK_GROWTH ( -1 )
|
||||||
|
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
|
||||||
|
#define portBYTE_ALIGNMENT 8
|
||||||
|
#define portNOP()
|
||||||
|
#define portINLINE __inline
|
||||||
|
#ifndef portFORCE_INLINE
|
||||||
|
#define portFORCE_INLINE inline __attribute__(( always_inline ))
|
||||||
|
#endif
|
||||||
|
#define portHAS_STACK_OVERFLOW_CHECKING 1
|
||||||
|
#define portDONT_DISCARD __attribute__(( used ))
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extern declarations.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortIsInsideInterrupt( void );
|
||||||
|
|
||||||
|
extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */
|
||||||
|
extern void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */;
|
||||||
|
extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU specific constants.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
#else
|
||||||
|
#define portPRIVILEGE_BIT ( 0x0UL )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
|
||||||
|
/* MPU regions. */
|
||||||
|
#define portPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
|
#define portUNPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
#define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL )
|
||||||
|
#define portPRIVILEGED_RAM_REGION ( 3UL )
|
||||||
|
#define portSTACK_REGION ( 4UL )
|
||||||
|
#define portFIRST_CONFIGURABLE_REGION ( 5UL )
|
||||||
|
#define portLAST_CONFIGURABLE_REGION ( 7UL )
|
||||||
|
#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )
|
||||||
|
#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */
|
||||||
|
|
||||||
|
/* Device memory attributes used in MPU_MAIR registers.
|
||||||
|
*
|
||||||
|
* 8-bit values encoded as follows:
|
||||||
|
* Bit[7:4] - 0000 - Device Memory
|
||||||
|
* Bit[3:2] - 00 --> Device-nGnRnE
|
||||||
|
* 01 --> Device-nGnRE
|
||||||
|
* 10 --> Device-nGRE
|
||||||
|
* 11 --> Device-GRE
|
||||||
|
* Bit[1:0] - 00, Reserved.
|
||||||
|
*/
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */
|
||||||
|
|
||||||
|
/* Normal memory attributes used in MPU_MAIR registers. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */
|
||||||
|
|
||||||
|
/* Attributes used in MPU_RBAR registers. */
|
||||||
|
#define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL )
|
||||||
|
#define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL )
|
||||||
|
#define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_WRITE ( 1UL << 1UL )
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_ONLY ( 3UL << 1UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 1UL )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Settings to define an MPU region.
|
||||||
|
*/
|
||||||
|
typedef struct MPURegionSettings
|
||||||
|
{
|
||||||
|
uint32_t ulRBAR; /**< RBAR for the region. */
|
||||||
|
uint32_t ulRLAR; /**< RLAR for the region. */
|
||||||
|
} MPURegionSettings_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU settings as stored in the TCB.
|
||||||
|
*/
|
||||||
|
typedef struct MPU_SETTINGS
|
||||||
|
{
|
||||||
|
uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */
|
||||||
|
MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */
|
||||||
|
} xMPU_SETTINGS;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC numbers.
|
||||||
|
*/
|
||||||
|
#define portSVC_ALLOCATE_SECURE_CONTEXT 0
|
||||||
|
#define portSVC_FREE_SECURE_CONTEXT 1
|
||||||
|
#define portSVC_START_SCHEDULER 2
|
||||||
|
#define portSVC_RAISE_PRIVILEGE 3
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Scheduler utilities.
|
||||||
|
*/
|
||||||
|
#define portYIELD() vPortYield()
|
||||||
|
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
|
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||||
|
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
||||||
|
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Critical section management.
|
||||||
|
*/
|
||||||
|
#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask()
|
||||||
|
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMask( x )
|
||||||
|
#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" )
|
||||||
|
#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" )
|
||||||
|
#define portENTER_CRITICAL() vPortEnterCritical()
|
||||||
|
#define portEXIT_CRITICAL() vPortExitCritical()
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tickless idle/low power functionality.
|
||||||
|
*/
|
||||||
|
#ifndef portSUPPRESS_TICKS_AND_SLEEP
|
||||||
|
extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
||||||
|
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Task function macros as described on the FreeRTOS.org WEB site.
|
||||||
|
*/
|
||||||
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Allocate a secure context for the task.
|
||||||
|
*
|
||||||
|
* Tasks are not created with a secure context. Any task that is going to call
|
||||||
|
* secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a
|
||||||
|
* secure context before it calls any secure function.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the secure stack to be allocated.
|
||||||
|
*/
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a task is deleted to delete the task's secure context,
|
||||||
|
* if it has one.
|
||||||
|
*
|
||||||
|
* @param[in] pxTCB The TCB of the task being deleted.
|
||||||
|
*/
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB )
|
||||||
|
#else
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB )
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*
|
||||||
|
* The SVC handler checks that the SVC was raised from a system call and only
|
||||||
|
* then it raises the privilege. If this is called from any other place,
|
||||||
|
* the privilege is not raised.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
|
#else
|
||||||
|
#define portIS_PRIVILEGED()
|
||||||
|
#define portRAISE_PRIVILEGE()
|
||||||
|
#define portRESET_PRIVILEGE()
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Barriers.
|
||||||
|
*/
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PORTMACRO_H */
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -514,14 +514,14 @@ void xPortSysTickHandler( void )
|
||||||
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 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
|
||||||
out of sleep mode to execute immediately. see comments above
|
out of sleep mode to execute immediately. see comments above
|
||||||
|
|
@ -602,7 +602,7 @@ void xPortSysTickHandler( void )
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Exit with interrpts enabled. */
|
/* Exit with interrupts enabled. */
|
||||||
__asm volatile( "cpsie i" ::: "memory" );
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -166,6 +166,8 @@ not necessary for to use this port. They are defined so the common demo files
|
||||||
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
||||||
{
|
{
|
||||||
uint32_t ulCurrentInterrupt;
|
uint32_t ulCurrentInterrupt;
|
||||||
|
|
@ -233,6 +235,7 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/port.c
vendored
Normal file
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/port.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
410
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.c
vendored
Normal file
410
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.c
vendored
Normal file
|
|
@ -0,0 +1,410 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION
|
||||||
|
* is defined correctly and privileged functions are placed in correct sections. */
|
||||||
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
/* Portasm includes. */
|
||||||
|
#include "portasm.h"
|
||||||
|
|
||||||
|
/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the
|
||||||
|
* header files. */
|
||||||
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst2 \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r4, #1 \n" /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r4, [r3] \n" /* r4 = *r3 i.e. r4 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const2 \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r4, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst2 \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" movs r4, #4 \n" /* r4 = 4. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
|
||||||
|
" ldr r2, xRBARConst2 \n" /* r2 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" ldmia r3!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
|
" stmia r2!, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r4, #1 \n" /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldm r0!, {r1-r4} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
|
||||||
|
" ldr r5, xSecureContextConst2 \n"
|
||||||
|
" str r1, [r5] \n" /* Set xSecureContext to this task's value for the same. */
|
||||||
|
" msr psplim, r2 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" msr control, r3 \n" /* Set this task's CONTROL value. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r4 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
|
" ldr r4, xSecureContextConst2 \n"
|
||||||
|
" str r1, [r4] \n" /* Set xSecureContext to this task's value for the same. */
|
||||||
|
" msr psplim, r2 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" movs r1, #2 \n" /* r1 = 2. */
|
||||||
|
" msr CONTROL, r1 \n" /* Switch to use PSP in the thread mode. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r3 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst2: .word pxCurrentTCB \n"
|
||||||
|
"xSecureContextConst2: .word xSecureContext \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst2: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const2: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst2: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst2: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" tst r0, #1 \n" /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
|
" ite ne \n"
|
||||||
|
" movne r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
|
" moveq r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
::: "r0", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* Read the CONTROL register. */
|
||||||
|
" bic r0, #1 \n" /* Clear the bit 0. */
|
||||||
|
" msr control, r0 \n" /* Write back the new CONTROL value. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
::: "r0", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" orr r0, #1 \n" /* r0 = r0 | 1. */
|
||||||
|
" msr control, r0 \n" /* CONTROL = r0. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
:::"r0", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" ldr r0, xVTORConst \n" /* Use the NVIC offset register to locate the stack. */
|
||||||
|
" ldr r0, [r0] \n" /* Read the VTOR register which gives the address of vector table. */
|
||||||
|
" ldr r0, [r0] \n" /* The first entry in vector table is stack pointer. */
|
||||||
|
" msr msp, r0 \n" /* Set the MSP back to the start of the stack. */
|
||||||
|
" cpsie i \n" /* Globally enable interrupts. */
|
||||||
|
" cpsie f \n"
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" svc %0 \n" /* System call to start the first task. */
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"xVTORConst: .word 0xe000ed08 \n"
|
||||||
|
:: "i" ( portSVC_START_SCHEDULER ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, basepri \n" /* r0 = basepri. Return original basepri value. */
|
||||||
|
" mov r1, %0 \n" /* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
" msr basepri, r1 \n" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
:: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" msr basepri, r0 \n" /* basepri = ulMask. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
::: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" .extern SecureContext_SaveContext \n"
|
||||||
|
" .extern SecureContext_LoadContext \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r1, psp \n" /* Read PSP in r1. */
|
||||||
|
" ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
" ldr r0, [r2] \n" /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
|
||||||
|
" \n"
|
||||||
|
" cbz r0, save_ns_context \n" /* No secure context to save. */
|
||||||
|
" push {r0-r2, r14} \n"
|
||||||
|
" bl SecureContext_SaveContext \n"
|
||||||
|
" pop {r0-r3} \n" /* LR is now in r3. */
|
||||||
|
" mov lr, r3 \n" /* LR = r3. */
|
||||||
|
" lsls r2, r3, #25 \n" /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
" bpl save_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
" ldr r3, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r2, [r3] \n" /* Read pxCurrentTCB. */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" subs r1, r1, #16 \n" /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mrs r3, control \n" /* r3 = CONTROL. */
|
||||||
|
" mov r4, lr \n" /* r4 = LR/EXC_RETURN. */
|
||||||
|
" stmia r1!, {r0, r2-r4} \n" /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" subs r1, r1, #12 \n" /* Make space for xSecureContext, PSPLIM and LR on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" stmia r1!, {r0, r2-r3} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" b select_next_task \n"
|
||||||
|
" \n"
|
||||||
|
" save_ns_context: \n"
|
||||||
|
" ldr r3, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r2, [r3] \n" /* Read pxCurrentTCB. */
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the FPU is in use. */
|
||||||
|
" it eq \n"
|
||||||
|
" vstmdbeq r1!, {s16-s31} \n" /* Store the FPU registers which are not saved automatically. */
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" subs r1, r1, #48 \n" /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" adds r1, r1, #16 \n" /* r1 = r1 + 16. */
|
||||||
|
" stm r1, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mrs r3, control \n" /* r3 = CONTROL. */
|
||||||
|
" mov r4, lr \n" /* r4 = LR/EXC_RETURN. */
|
||||||
|
" subs r1, r1, #16 \n" /* r1 = r1 - 16. */
|
||||||
|
" stm r1, {r0, r2-r4} \n" /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" subs r1, r1, #44 \n" /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
|
||||||
|
" str r1, [r2] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" adds r1, r1, #12 \n" /* r1 = r1 + 12. */
|
||||||
|
" stm r1, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" subs r1, r1, #12 \n" /* r1 = r1 - 12. */
|
||||||
|
" stmia r1!, {r0, r2-r3} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" select_next_task: \n"
|
||||||
|
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
||||||
|
" msr basepri, r0 \n" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" bl vTaskSwitchContext \n"
|
||||||
|
" mov r0, #0 \n" /* r0 = 0. */
|
||||||
|
" msr basepri, r0 \n" /* Enable interrupts. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. r1 now points to the top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r4, #1 \n" /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r4, [r3] \n" /* r4 = *r3 i.e. r4 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r4, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" movs r4, #4 \n" /* r4 = 4. */
|
||||||
|
" str r4, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
|
||||||
|
" ldr r2, xRBARConst \n" /* r2 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" ldmia r3!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
|
" stmia r2!, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r4, #1 \n" /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldmia r1!, {r0, r2-r4} \n" /* Read from stack - r0 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = LR. */
|
||||||
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
" msr control, r3 \n" /* Restore the CONTROL register value for the task. */
|
||||||
|
" mov lr, r4 \n" /* LR = r4. */
|
||||||
|
" ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
" str r0, [r2] \n" /* Restore the task's xSecureContext. */
|
||||||
|
" cbz r0, restore_ns_context \n" /* If there is no secure context for the task, restore the non-secure context. */
|
||||||
|
" push {r1,r4} \n"
|
||||||
|
" bl SecureContext_LoadContext \n" /* Restore the secure context. */
|
||||||
|
" pop {r1,r4} \n"
|
||||||
|
" mov lr, r4 \n" /* LR = r4. */
|
||||||
|
" lsls r2, r4, #25 \n" /* r2 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
" bpl restore_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
" msr psp, r1 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" bx lr \n"
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" ldmia r1!, {r0, r2-r3} \n" /* Read from stack - r0 = xSecureContext, r2 = PSPLIM and r3 = LR. */
|
||||||
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
" mov lr, r3 \n" /* LR = r3. */
|
||||||
|
" ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
" str r0, [r2] \n" /* Restore the task's xSecureContext. */
|
||||||
|
" cbz r0, restore_ns_context \n" /* If there is no secure context for the task, restore the non-secure context. */
|
||||||
|
" push {r1,r3} \n"
|
||||||
|
" bl SecureContext_LoadContext \n" /* Restore the secure context. */
|
||||||
|
" pop {r1,r3} \n"
|
||||||
|
" mov lr, r3 \n" /* LR = r3. */
|
||||||
|
" lsls r2, r3, #25 \n" /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
" bpl restore_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
" msr psp, r1 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" bx lr \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" restore_ns_context: \n"
|
||||||
|
" ldmia r1!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the FPU is in use. */
|
||||||
|
" it eq \n"
|
||||||
|
" vldmiaeq r1!, {s16-s31} \n" /* Restore the FPU registers which are not restored automatically. */
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
" msr psp, r1 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" bx lr \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst: .word pxCurrentTCB \n"
|
||||||
|
"xSecureContextConst: .word xSecureContext \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
:: "i"( configMAX_SYSCALL_INTERRUPT_PRIORITY )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" tst lr, #4 \n"
|
||||||
|
" ite eq \n"
|
||||||
|
" mrseq r0, msp \n"
|
||||||
|
" mrsne r0, psp \n"
|
||||||
|
" ldr r1, svchandler_address_const \n"
|
||||||
|
" bx r1 \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"svchandler_address_const: .word vPortSVCHandler_C \n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" svc %0 \n" /* Secure context is allocated in the supervisor call. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
:: "i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" ldr r1, [r0] \n" /* The first item in the TCB is the top of the stack. */
|
||||||
|
" ldr r0, [r1] \n" /* The first item on the stack is the task's xSecureContext. */
|
||||||
|
" cmp r0, #0 \n" /* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
" it ne \n"
|
||||||
|
" svcne %0 \n" /* Secure context is freed in the supervisor call. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
:: "i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.h
vendored
Normal file
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.h
vendored
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* 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 __PORT_ASM_H__
|
||||||
|
#define __PORT_ASM_H__
|
||||||
|
|
||||||
|
/* Scheduler includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
|
/* MPU wrappers includes. */
|
||||||
|
#include "mpu_wrappers.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restore the context of the first task so that the first task starts
|
||||||
|
* executing.
|
||||||
|
*/
|
||||||
|
void vRestoreContextOfFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raises the privilege level by clearing the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* @note This is a privileged function and should only be called from the kenrel
|
||||||
|
* code.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vRaisePrivilege( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the first task.
|
||||||
|
*/
|
||||||
|
void vStartFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables interrupts.
|
||||||
|
*/
|
||||||
|
uint32_t ulSetInterruptMask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables interrupts.
|
||||||
|
*/
|
||||||
|
void vClearInterruptMask( uint32_t ulMask ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PendSV Exception handler.
|
||||||
|
*/
|
||||||
|
void PendSV_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC Handler.
|
||||||
|
*/
|
||||||
|
void SVC_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a Secure context for the calling task.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the stack to be allocated on the
|
||||||
|
* secure side for the calling task.
|
||||||
|
*/
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free the task's secure context.
|
||||||
|
*
|
||||||
|
* @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
|
||||||
|
*/
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
#endif /* __PORT_ASM_H__ */
|
||||||
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portmacro.h
vendored
Normal file
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portmacro.h
vendored
Normal file
|
|
@ -0,0 +1,310 @@
|
||||||
|
/*
|
||||||
|
* 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 PORTMACRO_H
|
||||||
|
#define PORTMACRO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Port specific definitions.
|
||||||
|
*
|
||||||
|
* The settings in this file configure FreeRTOS correctly for the given hardware
|
||||||
|
* and compiler.
|
||||||
|
*
|
||||||
|
* These settings should not be altered.
|
||||||
|
*------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef configENABLE_FPU
|
||||||
|
#error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU.
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_MPU
|
||||||
|
#error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU.
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_TRUSTZONE
|
||||||
|
#error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone.
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type definitions.
|
||||||
|
*/
|
||||||
|
#define portCHAR char
|
||||||
|
#define portFLOAT float
|
||||||
|
#define portDOUBLE double
|
||||||
|
#define portLONG long
|
||||||
|
#define portSHORT short
|
||||||
|
#define portSTACK_TYPE uint32_t
|
||||||
|
#define portBASE_TYPE long
|
||||||
|
|
||||||
|
typedef portSTACK_TYPE StackType_t;
|
||||||
|
typedef long BaseType_t;
|
||||||
|
typedef unsigned long UBaseType_t;
|
||||||
|
|
||||||
|
#if( configUSE_16_BIT_TICKS == 1 )
|
||||||
|
typedef uint16_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffff
|
||||||
|
#else
|
||||||
|
typedef uint32_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
#define portTICK_TYPE_IS_ATOMIC 1
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Architecture specifics.
|
||||||
|
*/
|
||||||
|
#define portARCH_NAME "Cortex-M33"
|
||||||
|
#define portSTACK_GROWTH ( -1 )
|
||||||
|
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
|
||||||
|
#define portBYTE_ALIGNMENT 8
|
||||||
|
#define portNOP()
|
||||||
|
#define portINLINE __inline
|
||||||
|
#ifndef portFORCE_INLINE
|
||||||
|
#define portFORCE_INLINE inline __attribute__(( always_inline ))
|
||||||
|
#endif
|
||||||
|
#define portHAS_STACK_OVERFLOW_CHECKING 1
|
||||||
|
#define portDONT_DISCARD __attribute__(( used ))
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extern declarations.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortIsInsideInterrupt( void );
|
||||||
|
|
||||||
|
extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */
|
||||||
|
extern void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */;
|
||||||
|
extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU specific constants.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
#else
|
||||||
|
#define portPRIVILEGE_BIT ( 0x0UL )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
|
||||||
|
/* MPU regions. */
|
||||||
|
#define portPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
|
#define portUNPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
#define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL )
|
||||||
|
#define portPRIVILEGED_RAM_REGION ( 3UL )
|
||||||
|
#define portSTACK_REGION ( 4UL )
|
||||||
|
#define portFIRST_CONFIGURABLE_REGION ( 5UL )
|
||||||
|
#define portLAST_CONFIGURABLE_REGION ( 7UL )
|
||||||
|
#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )
|
||||||
|
#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */
|
||||||
|
|
||||||
|
/* Device memory attributes used in MPU_MAIR registers.
|
||||||
|
*
|
||||||
|
* 8-bit values encoded as follows:
|
||||||
|
* Bit[7:4] - 0000 - Device Memory
|
||||||
|
* Bit[3:2] - 00 --> Device-nGnRnE
|
||||||
|
* 01 --> Device-nGnRE
|
||||||
|
* 10 --> Device-nGRE
|
||||||
|
* 11 --> Device-GRE
|
||||||
|
* Bit[1:0] - 00, Reserved.
|
||||||
|
*/
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */
|
||||||
|
|
||||||
|
/* Normal memory attributes used in MPU_MAIR registers. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */
|
||||||
|
|
||||||
|
/* Attributes used in MPU_RBAR registers. */
|
||||||
|
#define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL )
|
||||||
|
#define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL )
|
||||||
|
#define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_WRITE ( 1UL << 1UL )
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_ONLY ( 3UL << 1UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 1UL )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Settings to define an MPU region.
|
||||||
|
*/
|
||||||
|
typedef struct MPURegionSettings
|
||||||
|
{
|
||||||
|
uint32_t ulRBAR; /**< RBAR for the region. */
|
||||||
|
uint32_t ulRLAR; /**< RLAR for the region. */
|
||||||
|
} MPURegionSettings_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU settings as stored in the TCB.
|
||||||
|
*/
|
||||||
|
typedef struct MPU_SETTINGS
|
||||||
|
{
|
||||||
|
uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */
|
||||||
|
MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */
|
||||||
|
} xMPU_SETTINGS;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC numbers.
|
||||||
|
*/
|
||||||
|
#define portSVC_ALLOCATE_SECURE_CONTEXT 0
|
||||||
|
#define portSVC_FREE_SECURE_CONTEXT 1
|
||||||
|
#define portSVC_START_SCHEDULER 2
|
||||||
|
#define portSVC_RAISE_PRIVILEGE 3
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Scheduler utilities.
|
||||||
|
*/
|
||||||
|
#define portYIELD() vPortYield()
|
||||||
|
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
|
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||||
|
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
||||||
|
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Critical section management.
|
||||||
|
*/
|
||||||
|
#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask()
|
||||||
|
#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x )
|
||||||
|
#define portDISABLE_INTERRUPTS() ulSetInterruptMask()
|
||||||
|
#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 )
|
||||||
|
#define portENTER_CRITICAL() vPortEnterCritical()
|
||||||
|
#define portEXIT_CRITICAL() vPortExitCritical()
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tickless idle/low power functionality.
|
||||||
|
*/
|
||||||
|
#ifndef portSUPPRESS_TICKS_AND_SLEEP
|
||||||
|
extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
||||||
|
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Task function macros as described on the FreeRTOS.org WEB site.
|
||||||
|
*/
|
||||||
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Allocate a secure context for the task.
|
||||||
|
*
|
||||||
|
* Tasks are not created with a secure context. Any task that is going to call
|
||||||
|
* secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a
|
||||||
|
* secure context before it calls any secure function.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the secure stack to be allocated.
|
||||||
|
*/
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a task is deleted to delete the task's secure context,
|
||||||
|
* if it has one.
|
||||||
|
*
|
||||||
|
* @param[in] pxTCB The TCB of the task being deleted.
|
||||||
|
*/
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB )
|
||||||
|
#else
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB )
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*
|
||||||
|
* The SVC handler checks that the SVC was raised from a system call and only
|
||||||
|
* then it raises the privilege. If this is called from any other place,
|
||||||
|
* the privilege is not raised.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
|
#else
|
||||||
|
#define portIS_PRIVILEGED()
|
||||||
|
#define portRAISE_PRIVILEGE()
|
||||||
|
#define portRESET_PRIVILEGE()
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Barriers.
|
||||||
|
*/
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PORTMACRO_H */
|
||||||
204
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.c
vendored
Normal file
204
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.c
vendored
Normal file
|
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Secure context includes. */
|
||||||
|
#include "secure_context.h"
|
||||||
|
|
||||||
|
/* Secure heap includes. */
|
||||||
|
#include "secure_heap.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief CONTROL value for privileged tasks.
|
||||||
|
*
|
||||||
|
* Bit[0] - 0 --> Thread mode is privileged.
|
||||||
|
* Bit[1] - 1 --> Thread mode uses PSP.
|
||||||
|
*/
|
||||||
|
#define securecontextCONTROL_VALUE_PRIVILEGED 0x02
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief CONTROL value for un-privileged tasks.
|
||||||
|
*
|
||||||
|
* Bit[0] - 1 --> Thread mode is un-privileged.
|
||||||
|
* Bit[1] - 1 --> Thread mode uses PSP.
|
||||||
|
*/
|
||||||
|
#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure to represent secure context.
|
||||||
|
*
|
||||||
|
* @note Since stack grows down, pucStackStart is the highest address while
|
||||||
|
* pucStackLimit is the first addess of the allocated memory.
|
||||||
|
*/
|
||||||
|
typedef struct SecureContext
|
||||||
|
{
|
||||||
|
uint8_t *pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */
|
||||||
|
uint8_t *pucStackLimit; /**< Last location of the stack memory (PSPLIM). */
|
||||||
|
uint8_t *pucStackStart; /**< First location of the stack memory. */
|
||||||
|
} SecureContext_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* No stack for thread mode until a task's context is loaded. */
|
||||||
|
secureportSET_PSPLIM( securecontextNO_STACK );
|
||||||
|
secureportSET_PSP( securecontextNO_STACK );
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
{
|
||||||
|
/* Configure thread mode to use PSP and to be unprivileged. */
|
||||||
|
secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );
|
||||||
|
}
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
/* Configure thread mode to use PSP and to be privileged.. */
|
||||||
|
secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );
|
||||||
|
}
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged )
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
uint8_t *pucStackMemory = NULL;
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
SecureContextHandle_t xSecureContextHandle = NULL;
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
uint32_t *pulCurrentStackPointer = NULL;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* Allocate the context structure. */
|
||||||
|
xSecureContextHandle = ( SecureContextHandle_t ) pvPortMalloc( sizeof( SecureContext_t ) );
|
||||||
|
|
||||||
|
if( xSecureContextHandle != NULL )
|
||||||
|
{
|
||||||
|
/* Allocate the stack space. */
|
||||||
|
pucStackMemory = pvPortMalloc( ulSecureStackSize );
|
||||||
|
|
||||||
|
if( pucStackMemory != NULL )
|
||||||
|
{
|
||||||
|
/* Since stack grows down, the starting point will be the last
|
||||||
|
* location. Note that this location is next to the last
|
||||||
|
* allocated byte because the hardware decrements the stack
|
||||||
|
* pointer before writing i.e. if stack pointer is 0x2, a push
|
||||||
|
* operation will decrement the stack pointer to 0x1 and then
|
||||||
|
* write at 0x1. */
|
||||||
|
xSecureContextHandle->pucStackStart = pucStackMemory + ulSecureStackSize;
|
||||||
|
|
||||||
|
/* The stack cannot go beyond this location. This value is
|
||||||
|
* programmed in the PSPLIM register on context switch.*/
|
||||||
|
xSecureContextHandle->pucStackLimit = pucStackMemory;
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
{
|
||||||
|
/* Store the correct CONTROL value for the task on the stack.
|
||||||
|
* This value is programmed in the CONTROL register on
|
||||||
|
* context switch. */
|
||||||
|
pulCurrentStackPointer = ( uint32_t * ) xSecureContextHandle->pucStackStart;
|
||||||
|
pulCurrentStackPointer--;
|
||||||
|
if( ulIsTaskPrivileged )
|
||||||
|
{
|
||||||
|
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store the current stack pointer. This value is programmed in
|
||||||
|
* the PSP register on context switch. */
|
||||||
|
xSecureContextHandle->pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;
|
||||||
|
}
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
/* Current SP is set to the starting of the stack. This
|
||||||
|
* value programmed in the PSP register on context switch. */
|
||||||
|
xSecureContextHandle->pucCurrentStackPointer = xSecureContextHandle->pucStackStart;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Free the context to avoid memory leak and make sure to return
|
||||||
|
* NULL to indicate failure. */
|
||||||
|
vPortFree( xSecureContextHandle );
|
||||||
|
xSecureContextHandle = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xSecureContextHandle;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* Ensure that valid parameters are passed. */
|
||||||
|
secureportASSERT( xSecureContextHandle != NULL );
|
||||||
|
|
||||||
|
/* Free the stack space. */
|
||||||
|
vPortFree( xSecureContextHandle->pucStackLimit );
|
||||||
|
|
||||||
|
/* Free the context itself. */
|
||||||
|
vPortFree( xSecureContextHandle );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
111
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.h
vendored
Normal file
111
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.h
vendored
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_CONTEXT_H__
|
||||||
|
#define __SECURE_CONTEXT_H__
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOSConfig.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PSP value when no task's context is loaded.
|
||||||
|
*/
|
||||||
|
#define securecontextNO_STACK 0x0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Opaque handle.
|
||||||
|
*/
|
||||||
|
struct SecureContext;
|
||||||
|
typedef struct SecureContext* SecureContextHandle_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the secure context management system.
|
||||||
|
*
|
||||||
|
* PSP is set to NULL and therefore a task must allocate and load a context
|
||||||
|
* before calling any secure side function in the thread mode.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureContext_Init( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocates a context on the secure side.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize Size of the stack to allocate on secure side.
|
||||||
|
* @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.
|
||||||
|
*
|
||||||
|
* @return Opaque context handle if context is successfully allocated, NULL
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged );
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize );
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the
|
||||||
|
* context to be freed.
|
||||||
|
*/
|
||||||
|
void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the context
|
||||||
|
* to be loaded.
|
||||||
|
*/
|
||||||
|
void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Saves the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the context
|
||||||
|
* to be saved.
|
||||||
|
*/
|
||||||
|
void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
#endif /* __SECURE_CONTEXT_H__ */
|
||||||
88
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context_port.c
vendored
Normal file
88
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context_port.c
vendored
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Secure context includes. */
|
||||||
|
#include "secure_context.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
/* xSecureContextHandle value is in r0. */
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r1, ipsr \n" /* r1 = IPSR. */
|
||||||
|
" cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */
|
||||||
|
" ldmia r0!, {r1, r2} \n" /* r1 = xSecureContextHandle->pucCurrentStackPointer, r2 = xSecureContextHandle->pucStackLimit. */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */
|
||||||
|
" msr control, r3 \n" /* CONTROL = r3. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" msr psplim, r2 \n" /* PSPLIM = r2. */
|
||||||
|
" msr psp, r1 \n" /* PSP = r1. */
|
||||||
|
" \n"
|
||||||
|
" load_ctx_therad_mode: \n"
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
:::"r0", "r1", "r2"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
/* xSecureContextHandle value is in r0. */
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r1, ipsr \n" /* r1 = IPSR. */
|
||||||
|
" cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */
|
||||||
|
" mrs r1, psp \n" /* r1 = PSP. */
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
" vstmdb r1!, {s0} \n" /* Trigger the defferred stacking of FPU registers. */
|
||||||
|
" vldmia r1!, {s0} \n" /* Nullify the effect of the pervious statement. */
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" mrs r2, control \n" /* r2 = CONTROL. */
|
||||||
|
" stmdb r1!, {r2} \n" /* Store CONTROL value on the stack. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" str r1, [r0] \n" /* Save the top of stack in context. xSecureContextHandle->pucCurrentStackPointer = r1. */
|
||||||
|
" movs r1, %0 \n" /* r1 = securecontextNO_STACK. */
|
||||||
|
" msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */
|
||||||
|
" msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */
|
||||||
|
" \n"
|
||||||
|
" save_ctx_therad_mode: \n"
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
:: "i" ( securecontextNO_STACK ) : "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
450
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.c
vendored
Normal file
450
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.c
vendored
Normal file
|
|
@ -0,0 +1,450 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Secure context heap includes. */
|
||||||
|
#include "secure_heap.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Total heap size.
|
||||||
|
*/
|
||||||
|
#define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) )
|
||||||
|
|
||||||
|
/* No test marker by default. */
|
||||||
|
#ifndef mtCOVERAGE_TEST_MARKER
|
||||||
|
#define mtCOVERAGE_TEST_MARKER()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* No tracing by default. */
|
||||||
|
#ifndef traceMALLOC
|
||||||
|
#define traceMALLOC( pvReturn, xWantedSize )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* No tracing by default. */
|
||||||
|
#ifndef traceFREE
|
||||||
|
#define traceFREE( pv, xBlockSize )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Block sizes must not get too small. */
|
||||||
|
#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) )
|
||||||
|
|
||||||
|
/* Assumes 8bit bytes! */
|
||||||
|
#define secureheapBITS_PER_BYTE ( ( size_t ) 8 )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Allocate the memory for the heap. */
|
||||||
|
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
|
||||||
|
/* 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. */
|
||||||
|
extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
||||||
|
#else /* configAPPLICATION_ALLOCATED_HEAP */
|
||||||
|
static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
||||||
|
#endif /* configAPPLICATION_ALLOCATED_HEAP */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The linked list structure.
|
||||||
|
*
|
||||||
|
* This is used to link free blocks in order of their memory address.
|
||||||
|
*/
|
||||||
|
typedef struct A_BLOCK_LINK
|
||||||
|
{
|
||||||
|
struct A_BLOCK_LINK *pxNextFreeBlock; /**< The next free block in the list. */
|
||||||
|
size_t xBlockSize; /**< The size of the free block. */
|
||||||
|
} BlockLink_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called automatically to setup the required heap structures the first
|
||||||
|
* time pvPortMalloc() is called.
|
||||||
|
*/
|
||||||
|
static void prvHeapInit( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inserts a block of memory that is being freed into the correct
|
||||||
|
* position in the list of free memory blocks.
|
||||||
|
*
|
||||||
|
* The block being freed will be merged with the block in front it and/or the
|
||||||
|
* block behind it if the memory blocks are adjacent to each other.
|
||||||
|
*
|
||||||
|
* @param[in] pxBlockToInsert The block being freed.
|
||||||
|
*/
|
||||||
|
static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The size of the structure placed at the beginning of each allocated
|
||||||
|
* memory block must by correctly byte aligned.
|
||||||
|
*/
|
||||||
|
static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a couple of list links to mark the start and end of the list.
|
||||||
|
*/
|
||||||
|
static BlockLink_t xStart, *pxEnd = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Keeps track of the number of free bytes remaining, but says nothing
|
||||||
|
* about fragmentation.
|
||||||
|
*/
|
||||||
|
static size_t xFreeBytesRemaining = 0U;
|
||||||
|
static size_t xMinimumEverFreeBytesRemaining = 0U;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets set to the top bit of an size_t type.
|
||||||
|
*
|
||||||
|
* When this bit in the xBlockSize member of an BlockLink_t structure is set
|
||||||
|
* then the block belongs to the application. When the bit is free the block is
|
||||||
|
* still part of the free heap space.
|
||||||
|
*/
|
||||||
|
static size_t xBlockAllocatedBit = 0;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvHeapInit( void )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxFirstFreeBlock;
|
||||||
|
uint8_t *pucAlignedHeap;
|
||||||
|
size_t uxAddress;
|
||||||
|
size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;
|
||||||
|
|
||||||
|
/* Ensure the heap starts on a correctly aligned boundary. */
|
||||||
|
uxAddress = ( size_t ) ucHeap;
|
||||||
|
|
||||||
|
if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )
|
||||||
|
{
|
||||||
|
uxAddress += ( secureportBYTE_ALIGNMENT - 1 );
|
||||||
|
uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
|
||||||
|
}
|
||||||
|
|
||||||
|
pucAlignedHeap = ( uint8_t * ) uxAddress;
|
||||||
|
|
||||||
|
/* xStart is used to hold a pointer to the first item in the list of free
|
||||||
|
* blocks. The void cast is used to prevent compiler warnings. */
|
||||||
|
xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
|
||||||
|
xStart.xBlockSize = ( size_t ) 0;
|
||||||
|
|
||||||
|
/* pxEnd is used to mark the end of the list of free blocks and is inserted
|
||||||
|
* at the end of the heap space. */
|
||||||
|
uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
|
||||||
|
uxAddress -= xHeapStructSize;
|
||||||
|
uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
pxEnd = ( void * ) uxAddress;
|
||||||
|
pxEnd->xBlockSize = 0;
|
||||||
|
pxEnd->pxNextFreeBlock = NULL;
|
||||||
|
|
||||||
|
/* To start with there is a single free block that is sized to take up the
|
||||||
|
* entire heap space, minus the space taken by pxEnd. */
|
||||||
|
pxFirstFreeBlock = ( void * ) pucAlignedHeap;
|
||||||
|
pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
|
||||||
|
pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
|
||||||
|
|
||||||
|
/* Only one block exists - and it covers the entire usable heap space. */
|
||||||
|
xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
|
||||||
|
xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
|
||||||
|
|
||||||
|
/* Work out the position of the top bit in a size_t variable. */
|
||||||
|
xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxIterator;
|
||||||
|
uint8_t *puc;
|
||||||
|
|
||||||
|
/* Iterate through the list until a block is found that has a higher address
|
||||||
|
* than the block being inserted. */
|
||||||
|
for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
|
||||||
|
{
|
||||||
|
/* Nothing to do here, just iterate to the right position. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do the block being inserted, and the block it is being inserted after
|
||||||
|
* make a contiguous block of memory? */
|
||||||
|
puc = ( uint8_t * ) pxIterator;
|
||||||
|
if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
|
||||||
|
{
|
||||||
|
pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
|
||||||
|
pxBlockToInsert = pxIterator;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do the block being inserted, and the block it is being inserted before
|
||||||
|
* make a contiguous block of memory? */
|
||||||
|
puc = ( uint8_t * ) pxBlockToInsert;
|
||||||
|
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
|
||||||
|
{
|
||||||
|
if( pxIterator->pxNextFreeBlock != pxEnd )
|
||||||
|
{
|
||||||
|
/* Form one big block from the two blocks. */
|
||||||
|
pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxEnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the block being inserted plugged a gab, so was merged with the block
|
||||||
|
* before and the block after, then it's pxNextFreeBlock pointer will have
|
||||||
|
* already been set, and should not be set here as that would make it point
|
||||||
|
* to itself. */
|
||||||
|
if( pxIterator != pxBlockToInsert )
|
||||||
|
{
|
||||||
|
pxIterator->pxNextFreeBlock = pxBlockToInsert;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void *pvPortMalloc( size_t xWantedSize )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
|
||||||
|
void *pvReturn = NULL;
|
||||||
|
|
||||||
|
/* If this is the first call to malloc then the heap will require
|
||||||
|
* initialisation to setup the list of free blocks. */
|
||||||
|
if( pxEnd == NULL )
|
||||||
|
{
|
||||||
|
prvHeapInit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the requested block size is not so large that the top bit is set.
|
||||||
|
* The top bit of the block size member of the BlockLink_t structure is used
|
||||||
|
* to determine who owns the block - the application or the kernel, so it
|
||||||
|
* must be free. */
|
||||||
|
if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
|
||||||
|
{
|
||||||
|
/* The wanted size is increased so it can contain a BlockLink_t
|
||||||
|
* structure in addition to the requested amount of bytes. */
|
||||||
|
if( xWantedSize > 0 )
|
||||||
|
{
|
||||||
|
xWantedSize += xHeapStructSize;
|
||||||
|
|
||||||
|
/* Ensure that blocks are always aligned to the required number of
|
||||||
|
* bytes. */
|
||||||
|
if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )
|
||||||
|
{
|
||||||
|
/* Byte alignment required. */
|
||||||
|
xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );
|
||||||
|
secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
|
||||||
|
{
|
||||||
|
/* Traverse the list from the start (lowest address) block until
|
||||||
|
* one of adequate size is found. */
|
||||||
|
pxPreviousBlock = &xStart;
|
||||||
|
pxBlock = xStart.pxNextFreeBlock;
|
||||||
|
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
|
||||||
|
{
|
||||||
|
pxPreviousBlock = pxBlock;
|
||||||
|
pxBlock = pxBlock->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the end marker was reached then a block of adequate size was
|
||||||
|
* not found. */
|
||||||
|
if( pxBlock != pxEnd )
|
||||||
|
{
|
||||||
|
/* Return the memory space pointed to - jumping over the
|
||||||
|
* BlockLink_t structure at its start. */
|
||||||
|
pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
|
||||||
|
|
||||||
|
/* This block is being returned for use so must be taken out
|
||||||
|
* of the list of free blocks. */
|
||||||
|
pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
|
||||||
|
|
||||||
|
/* If the block is larger than required it can be split into
|
||||||
|
* two. */
|
||||||
|
if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )
|
||||||
|
{
|
||||||
|
/* This block is to be split into two. Create a new
|
||||||
|
* block following the number of bytes requested. The void
|
||||||
|
* cast is used to prevent byte alignment warnings from the
|
||||||
|
* compiler. */
|
||||||
|
pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
|
||||||
|
secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
|
||||||
|
/* Calculate the sizes of two blocks split from the single
|
||||||
|
* block. */
|
||||||
|
pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
|
||||||
|
pxBlock->xBlockSize = xWantedSize;
|
||||||
|
|
||||||
|
/* Insert the new block into the list of free blocks. */
|
||||||
|
prvInsertBlockIntoFreeList( pxNewBlockLink );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
xFreeBytesRemaining -= pxBlock->xBlockSize;
|
||||||
|
|
||||||
|
if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
|
||||||
|
{
|
||||||
|
xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The block is being returned - it is allocated and owned by
|
||||||
|
* the application and has no "next" block. */
|
||||||
|
pxBlock->xBlockSize |= xBlockAllocatedBit;
|
||||||
|
pxBlock->pxNextFreeBlock = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
traceMALLOC( pvReturn, xWantedSize );
|
||||||
|
|
||||||
|
#if( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )
|
||||||
|
{
|
||||||
|
if( pvReturn == NULL )
|
||||||
|
{
|
||||||
|
extern void vApplicationMallocFailedHook( void );
|
||||||
|
vApplicationMallocFailedHook();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
return pvReturn;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortFree( void *pv )
|
||||||
|
{
|
||||||
|
uint8_t *puc = ( uint8_t * ) pv;
|
||||||
|
BlockLink_t *pxLink;
|
||||||
|
|
||||||
|
if( pv != NULL )
|
||||||
|
{
|
||||||
|
/* The memory being freed will have an BlockLink_t structure immediately
|
||||||
|
* before it. */
|
||||||
|
puc -= xHeapStructSize;
|
||||||
|
|
||||||
|
/* This casting is to keep the compiler from issuing warnings. */
|
||||||
|
pxLink = ( void * ) puc;
|
||||||
|
|
||||||
|
/* Check the block is actually allocated. */
|
||||||
|
secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
|
||||||
|
secureportASSERT( pxLink->pxNextFreeBlock == NULL );
|
||||||
|
|
||||||
|
if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
|
||||||
|
{
|
||||||
|
if( pxLink->pxNextFreeBlock == NULL )
|
||||||
|
{
|
||||||
|
/* The block is being returned to the heap - it is no longer
|
||||||
|
* allocated. */
|
||||||
|
pxLink->xBlockSize &= ~xBlockAllocatedBit;
|
||||||
|
|
||||||
|
secureportDISABLE_NON_SECURE_INTERRUPTS();
|
||||||
|
{
|
||||||
|
/* Add this block to the list of free blocks. */
|
||||||
|
xFreeBytesRemaining += pxLink->xBlockSize;
|
||||||
|
traceFREE( pv, pxLink->xBlockSize );
|
||||||
|
prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
|
||||||
|
}
|
||||||
|
secureportENABLE_NON_SECURE_INTERRUPTS();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
size_t xPortGetFreeHeapSize( void )
|
||||||
|
{
|
||||||
|
return xFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
size_t xPortGetMinimumEverFreeHeapSize( void )
|
||||||
|
{
|
||||||
|
return xMinimumEverFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortInitialiseBlocks( void )
|
||||||
|
{
|
||||||
|
/* This just exists to keep the linker quiet. */
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
51
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.h
vendored
Normal file
51
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.h
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_HEAP_H__
|
||||||
|
#define __SECURE_HEAP_H__
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocates memory from heap.
|
||||||
|
*
|
||||||
|
* @param[in] xWantedSize The size of the memory to be allocated.
|
||||||
|
*
|
||||||
|
* @return Pointer to the memory region if the allocation is successful, NULL
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
void *pvPortMalloc( size_t xWantedSize );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees the previously allocated memory.
|
||||||
|
*
|
||||||
|
* @param[in] pv Pointer to the memory to be freed.
|
||||||
|
*/
|
||||||
|
void vPortFree( void *pv );
|
||||||
|
|
||||||
|
#endif /* __SECURE_HEAP_H__ */
|
||||||
105
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.c
vendored
Normal file
105
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.c
vendored
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Secure init includes. */
|
||||||
|
#include "secure_init.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constants required to manipulate the SCB.
|
||||||
|
*/
|
||||||
|
#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */
|
||||||
|
#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL )
|
||||||
|
#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )
|
||||||
|
#define secureinitSCB_AIRCR_PRIS_POS ( 14UL )
|
||||||
|
#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constants required to manipulate the FPU.
|
||||||
|
*/
|
||||||
|
#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */
|
||||||
|
#define secureinitFPCCR_LSPENS_POS ( 29UL )
|
||||||
|
#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS )
|
||||||
|
#define secureinitFPCCR_TS_POS ( 26UL )
|
||||||
|
#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS )
|
||||||
|
|
||||||
|
#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */
|
||||||
|
#define secureinitNSACR_CP10_POS ( 10UL )
|
||||||
|
#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS )
|
||||||
|
#define secureinitNSACR_CP11_POS ( 11UL )
|
||||||
|
#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
*( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |
|
||||||
|
( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |
|
||||||
|
( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* CP10 = 1 ==> Non-secure access to the Floating Point Unit is
|
||||||
|
* permitted. CP11 should be programmed to the same value as CP10. */
|
||||||
|
*( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );
|
||||||
|
|
||||||
|
/* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures
|
||||||
|
* that we can enable/disable lazy stacking in port.c file. */
|
||||||
|
*( secureinitFPCCR ) &= ~ ( secureinitFPCCR_LSPENS_MASK );
|
||||||
|
|
||||||
|
/* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP
|
||||||
|
* registers (S16-S31) are also pushed to stack on exception entry and
|
||||||
|
* restored on exception return. */
|
||||||
|
*( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
53
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.h
vendored
Normal file
53
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.h
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_INIT_H__
|
||||||
|
#define __SECURE_INIT_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief De-prioritizes the non-secure exceptions.
|
||||||
|
*
|
||||||
|
* This is needed to ensure that the non-secure PendSV runs at the lowest
|
||||||
|
* priority. Context switch is done in the non-secure PendSV handler.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureInit_DePrioritizeNSExceptions( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.
|
||||||
|
*
|
||||||
|
* Also sets FPCCR.TS=1 to ensure that the content of the Floating Point
|
||||||
|
* Registers are not leaked to the non-secure side.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureInit_EnableNSFPUAccess( void );
|
||||||
|
|
||||||
|
#endif /* __SECURE_INIT_H__ */
|
||||||
133
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_port_macros.h
vendored
Normal file
133
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_port_macros.h
vendored
Normal file
|
|
@ -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 __SECURE_PORT_MACROS_H__
|
||||||
|
#define __SECURE_PORT_MACROS_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Byte alignment requirements.
|
||||||
|
*/
|
||||||
|
#define secureportBYTE_ALIGNMENT 8
|
||||||
|
#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to declare a function as non-secure callable.
|
||||||
|
*/
|
||||||
|
#if defined( __IAR_SYSTEMS_ICC__ )
|
||||||
|
#define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root
|
||||||
|
#else
|
||||||
|
#define secureportNON_SECURE_CALLABLE __attribute__((cmse_nonsecure_entry)) __attribute__((used))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the secure PRIMASK value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \
|
||||||
|
__asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the non-secure PRIMASK value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \
|
||||||
|
__asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the PSP value in the given variable.
|
||||||
|
*/
|
||||||
|
#define secureportREAD_PSP( pucOutCurrentStackPointer ) \
|
||||||
|
__asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the PSP to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_PSP( pucCurrentStackPointer ) \
|
||||||
|
__asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the PSPLIM to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_PSPLIM( pucStackLimit ) \
|
||||||
|
__asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the NonSecure MSP to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_MSP_NS( pucMainStackPointer ) \
|
||||||
|
__asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the CONTROL register to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_CONTROL( ulControl ) \
|
||||||
|
__asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the Interrupt Program Status Register (IPSR) value in the given
|
||||||
|
* variable.
|
||||||
|
*/
|
||||||
|
#define secureportREAD_IPSR( ulIPSR ) \
|
||||||
|
__asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PRIMASK value to enable interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PRIMASK value to disable interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable secure interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable non-secure interrupts.
|
||||||
|
*
|
||||||
|
* This effectively disables context switches.
|
||||||
|
*/
|
||||||
|
#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable non-secure interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assert definition.
|
||||||
|
*/
|
||||||
|
#define secureportASSERT( x ) \
|
||||||
|
if( ( x ) == 0 ) \
|
||||||
|
{ \
|
||||||
|
secureportDISABLE_SECURE_INTERRUPTS(); \
|
||||||
|
secureportDISABLE_NON_SECURE_INTERRUPTS(); \
|
||||||
|
for( ;; ); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __SECURE_PORT_MACROS_H__ */
|
||||||
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
vendored
Normal file
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
316
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
vendored
Normal file
316
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
vendored
Normal file
|
|
@ -0,0 +1,316 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION
|
||||||
|
* is defined correctly and privileged functions are placed in correct sections. */
|
||||||
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
/* Portasm includes. */
|
||||||
|
#include "portasm.h"
|
||||||
|
|
||||||
|
/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the
|
||||||
|
* header files. */
|
||||||
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst2 \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r4, #1 \n" /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r3, [r1] \n" /* r3 = *r1 i.e. r3 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const2 \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r3, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst2 \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" movs r3, #4 \n" /* r3 = 4. */
|
||||||
|
" str r3, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
|
||||||
|
" ldr r2, xRBARConst2 \n" /* r2 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" ldmia r1!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
|
" stmia r2!, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r4, #1 \n" /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
|
||||||
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" msr control, r2 \n" /* Set this task's CONTROL value. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r3 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
" movs r1, #2 \n" /* r1 = 2. */
|
||||||
|
" msr CONTROL, r1 \n" /* Switch to use PSP in the thread mode. */
|
||||||
|
" adds r0, #32 \n" /* Discard everything up to r0. */
|
||||||
|
" msr psp, r0 \n" /* This is now the new top of stack to use in the task. */
|
||||||
|
" isb \n"
|
||||||
|
" bx r2 \n" /* Finally, branch to EXC_RETURN. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst2: .word pxCurrentTCB \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst2: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const2: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst2: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst2: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" tst r0, #1 \n" /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
|
" ite ne \n"
|
||||||
|
" movne r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
|
" moveq r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
::: "r0", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* Read the CONTROL register. */
|
||||||
|
" bic r0, #1 \n" /* Clear the bit 0. */
|
||||||
|
" msr control, r0 \n" /* Write back the new CONTROL value. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
::: "r0", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" orr r0, #1 \n" /* r0 = r0 | 1. */
|
||||||
|
" msr control, r0 \n" /* CONTROL = r0. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
:::"r0", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" ldr r0, xVTORConst \n" /* Use the NVIC offset register to locate the stack. */
|
||||||
|
" ldr r0, [r0] \n" /* Read the VTOR register which gives the address of vector table. */
|
||||||
|
" ldr r0, [r0] \n" /* The first entry in vector table is stack pointer. */
|
||||||
|
" msr msp, r0 \n" /* Set the MSP back to the start of the stack. */
|
||||||
|
" cpsie i \n" /* Globally enable interrupts. */
|
||||||
|
" cpsie f \n"
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" svc %0 \n" /* System call to start the first task. */
|
||||||
|
" nop \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"xVTORConst: .word 0xe000ed08 \n"
|
||||||
|
:: "i" ( portSVC_START_SCHEDULER ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, basepri \n" /* r0 = basepri. Return original basepri value. */
|
||||||
|
" mov r1, %0 \n" /* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
" msr basepri, r1 \n" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
:: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" msr basepri, r0 \n" /* basepri = ulMask. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" bx lr \n" /* Return. */
|
||||||
|
::: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
|
" mrs r0, psp \n" /* Read PSP in r0. */
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the FPU is in use. */
|
||||||
|
" it eq \n"
|
||||||
|
" vstmdbeq r0!, {s16-s31} \n" /* Store the FPU registers which are not saved automatically. */
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" mrs r1, psplim \n" /* r1 = PSPLIM. */
|
||||||
|
" mrs r2, control \n" /* r2 = CONTROL. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" stmdb r0!, {r1-r11} \n" /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
|
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" str r0, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
|
" \n"
|
||||||
|
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
||||||
|
" msr basepri, r0 \n" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
" dsb \n"
|
||||||
|
" isb \n"
|
||||||
|
" bl vTaskSwitchContext \n"
|
||||||
|
" mov r0, #0 \n" /* r0 = 0. */
|
||||||
|
" msr basepri, r0 \n" /* Enable interrupts. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r4, #1 \n" /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
|
||||||
|
" ldr r3, [r1] \n" /* r3 = *r1 i.e. r3 = MAIR0. */
|
||||||
|
" ldr r2, xMAIR0Const \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
" str r3, [r2] \n" /* Program MAIR0. */
|
||||||
|
" ldr r2, xRNRConst \n" /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
" movs r3, #4 \n" /* r3 = 4. */
|
||||||
|
" str r3, [r2] \n" /* Program RNR = 4. */
|
||||||
|
" adds r1, #4 \n" /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
|
||||||
|
" ldr r2, xRBARConst \n" /* r2 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
|
" stmia r2!, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
" ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r4, #1 \n" /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */
|
||||||
|
" str r4, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" ldmia r0!, {r1-r11} \n" /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_FPU == 1 )
|
||||||
|
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the FPU is in use. */
|
||||||
|
" it eq \n"
|
||||||
|
" vldmiaeq r0!, {s16-s31} \n" /* Restore the FPU registers which are not restored automatically. */
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
" \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
" msr psplim, r1 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
" msr control, r2 \n" /* Restore the CONTROL register value for the task. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
" bx r3 \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"pxCurrentTCBConst: .word pxCurrentTCB \n"
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
"xMPUCTRLConst: .word 0xe000ed94 \n"
|
||||||
|
"xMAIR0Const: .word 0xe000edc0 \n"
|
||||||
|
"xRNRConst: .word 0xe000ed98 \n"
|
||||||
|
"xRBARConst: .word 0xe000ed9c \n"
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
:: "i"( configMAX_SYSCALL_INTERRUPT_PRIORITY )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" tst lr, #4 \n"
|
||||||
|
" ite eq \n"
|
||||||
|
" mrseq r0, msp \n"
|
||||||
|
" mrsne r0, psp \n"
|
||||||
|
" ldr r1, svchandler_address_const \n"
|
||||||
|
" bx r1 \n"
|
||||||
|
" \n"
|
||||||
|
" .align 4 \n"
|
||||||
|
"svchandler_address_const: .word vPortSVCHandler_C \n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h
vendored
Normal file
113
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h
vendored
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* 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 __PORT_ASM_H__
|
||||||
|
#define __PORT_ASM_H__
|
||||||
|
|
||||||
|
/* Scheduler includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
|
/* MPU wrappers includes. */
|
||||||
|
#include "mpu_wrappers.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restore the context of the first task so that the first task starts
|
||||||
|
* executing.
|
||||||
|
*/
|
||||||
|
void vRestoreContextOfFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raises the privilege level by clearing the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* @note This is a privileged function and should only be called from the kenrel
|
||||||
|
* code.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vRaisePrivilege( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the first task.
|
||||||
|
*/
|
||||||
|
void vStartFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables interrupts.
|
||||||
|
*/
|
||||||
|
uint32_t ulSetInterruptMask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables interrupts.
|
||||||
|
*/
|
||||||
|
void vClearInterruptMask( uint32_t ulMask ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PendSV Exception handler.
|
||||||
|
*/
|
||||||
|
void PendSV_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC Handler.
|
||||||
|
*/
|
||||||
|
void SVC_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a Secure context for the calling task.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the stack to be allocated on the
|
||||||
|
* secure side for the calling task.
|
||||||
|
*/
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free the task's secure context.
|
||||||
|
*
|
||||||
|
* @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
|
||||||
|
*/
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
#endif /* __PORT_ASM_H__ */
|
||||||
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h
vendored
Normal file
310
Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h
vendored
Normal file
|
|
@ -0,0 +1,310 @@
|
||||||
|
/*
|
||||||
|
* 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 PORTMACRO_H
|
||||||
|
#define PORTMACRO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Port specific definitions.
|
||||||
|
*
|
||||||
|
* The settings in this file configure FreeRTOS correctly for the given hardware
|
||||||
|
* and compiler.
|
||||||
|
*
|
||||||
|
* These settings should not be altered.
|
||||||
|
*------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef configENABLE_FPU
|
||||||
|
#error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU.
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_MPU
|
||||||
|
#error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU.
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_TRUSTZONE
|
||||||
|
#error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone.
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type definitions.
|
||||||
|
*/
|
||||||
|
#define portCHAR char
|
||||||
|
#define portFLOAT float
|
||||||
|
#define portDOUBLE double
|
||||||
|
#define portLONG long
|
||||||
|
#define portSHORT short
|
||||||
|
#define portSTACK_TYPE uint32_t
|
||||||
|
#define portBASE_TYPE long
|
||||||
|
|
||||||
|
typedef portSTACK_TYPE StackType_t;
|
||||||
|
typedef long BaseType_t;
|
||||||
|
typedef unsigned long UBaseType_t;
|
||||||
|
|
||||||
|
#if( configUSE_16_BIT_TICKS == 1 )
|
||||||
|
typedef uint16_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffff
|
||||||
|
#else
|
||||||
|
typedef uint32_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
#define portTICK_TYPE_IS_ATOMIC 1
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Architecture specifics.
|
||||||
|
*/
|
||||||
|
#define portARCH_NAME "Cortex-M33"
|
||||||
|
#define portSTACK_GROWTH ( -1 )
|
||||||
|
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
|
||||||
|
#define portBYTE_ALIGNMENT 8
|
||||||
|
#define portNOP()
|
||||||
|
#define portINLINE __inline
|
||||||
|
#ifndef portFORCE_INLINE
|
||||||
|
#define portFORCE_INLINE inline __attribute__(( always_inline ))
|
||||||
|
#endif
|
||||||
|
#define portHAS_STACK_OVERFLOW_CHECKING 1
|
||||||
|
#define portDONT_DISCARD __attribute__(( used ))
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extern declarations.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortIsInsideInterrupt( void );
|
||||||
|
|
||||||
|
extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */
|
||||||
|
extern void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */;
|
||||||
|
extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU specific constants.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
#else
|
||||||
|
#define portPRIVILEGE_BIT ( 0x0UL )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
|
||||||
|
/* MPU regions. */
|
||||||
|
#define portPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
|
#define portUNPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
#define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL )
|
||||||
|
#define portPRIVILEGED_RAM_REGION ( 3UL )
|
||||||
|
#define portSTACK_REGION ( 4UL )
|
||||||
|
#define portFIRST_CONFIGURABLE_REGION ( 5UL )
|
||||||
|
#define portLAST_CONFIGURABLE_REGION ( 7UL )
|
||||||
|
#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )
|
||||||
|
#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */
|
||||||
|
|
||||||
|
/* Device memory attributes used in MPU_MAIR registers.
|
||||||
|
*
|
||||||
|
* 8-bit values encoded as follows:
|
||||||
|
* Bit[7:4] - 0000 - Device Memory
|
||||||
|
* Bit[3:2] - 00 --> Device-nGnRnE
|
||||||
|
* 01 --> Device-nGnRE
|
||||||
|
* 10 --> Device-nGRE
|
||||||
|
* 11 --> Device-GRE
|
||||||
|
* Bit[1:0] - 00, Reserved.
|
||||||
|
*/
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */
|
||||||
|
|
||||||
|
/* Normal memory attributes used in MPU_MAIR registers. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */
|
||||||
|
|
||||||
|
/* Attributes used in MPU_RBAR registers. */
|
||||||
|
#define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL )
|
||||||
|
#define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL )
|
||||||
|
#define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_WRITE ( 1UL << 1UL )
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_ONLY ( 3UL << 1UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 1UL )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Settings to define an MPU region.
|
||||||
|
*/
|
||||||
|
typedef struct MPURegionSettings
|
||||||
|
{
|
||||||
|
uint32_t ulRBAR; /**< RBAR for the region. */
|
||||||
|
uint32_t ulRLAR; /**< RLAR for the region. */
|
||||||
|
} MPURegionSettings_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU settings as stored in the TCB.
|
||||||
|
*/
|
||||||
|
typedef struct MPU_SETTINGS
|
||||||
|
{
|
||||||
|
uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */
|
||||||
|
MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */
|
||||||
|
} xMPU_SETTINGS;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC numbers.
|
||||||
|
*/
|
||||||
|
#define portSVC_ALLOCATE_SECURE_CONTEXT 0
|
||||||
|
#define portSVC_FREE_SECURE_CONTEXT 1
|
||||||
|
#define portSVC_START_SCHEDULER 2
|
||||||
|
#define portSVC_RAISE_PRIVILEGE 3
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Scheduler utilities.
|
||||||
|
*/
|
||||||
|
#define portYIELD() vPortYield()
|
||||||
|
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
|
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||||
|
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
||||||
|
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Critical section management.
|
||||||
|
*/
|
||||||
|
#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask()
|
||||||
|
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMask( x )
|
||||||
|
#define portDISABLE_INTERRUPTS() ulSetInterruptMask()
|
||||||
|
#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 )
|
||||||
|
#define portENTER_CRITICAL() vPortEnterCritical()
|
||||||
|
#define portEXIT_CRITICAL() vPortExitCritical()
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tickless idle/low power functionality.
|
||||||
|
*/
|
||||||
|
#ifndef portSUPPRESS_TICKS_AND_SLEEP
|
||||||
|
extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
||||||
|
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Task function macros as described on the FreeRTOS.org WEB site.
|
||||||
|
*/
|
||||||
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Allocate a secure context for the task.
|
||||||
|
*
|
||||||
|
* Tasks are not created with a secure context. Any task that is going to call
|
||||||
|
* secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a
|
||||||
|
* secure context before it calls any secure function.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the secure stack to be allocated.
|
||||||
|
*/
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a task is deleted to delete the task's secure context,
|
||||||
|
* if it has one.
|
||||||
|
*
|
||||||
|
* @param[in] pxTCB The TCB of the task being deleted.
|
||||||
|
*/
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB )
|
||||||
|
#else
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB )
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*
|
||||||
|
* The SVC handler checks that the SVC was raised from a system call and only
|
||||||
|
* then it raises the privilege. If this is called from any other place,
|
||||||
|
* the privilege is not raised.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
|
#else
|
||||||
|
#define portIS_PRIVILEGED()
|
||||||
|
#define portRAISE_PRIVILEGE()
|
||||||
|
#define portRESET_PRIVILEGE()
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Barriers.
|
||||||
|
*/
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PORTMACRO_H */
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -30,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. */
|
||||||
|
|
@ -46,7 +46,7 @@ task.h is included from an application file. */
|
||||||
#define portNVIC_SYSTICK_CLK ( 1UL << 2UL )
|
#define portNVIC_SYSTICK_CLK ( 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 ( 0 )
|
#define portNVIC_SYSTICK_CLK ( 0 )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -86,21 +86,22 @@ task.h is included from an application file. */
|
||||||
#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 )
|
#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 )
|
||||||
|
|
||||||
/* Constants required to check the validity of an interrupt priority. */
|
/* Constants required to check the validity of an interrupt priority. */
|
||||||
#define portFIRST_USER_INTERRUPT_NUMBER ( 16 )
|
#define portFIRST_USER_INTERRUPT_NUMBER ( 16 )
|
||||||
#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 )
|
#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 )
|
||||||
#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) )
|
#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) )
|
||||||
#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff )
|
#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff )
|
||||||
#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 )
|
#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 )
|
||||||
#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 )
|
#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 )
|
||||||
#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL )
|
#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL )
|
||||||
#define portPRIGROUP_SHIFT ( 8UL )
|
#define portPRIGROUP_SHIFT ( 8UL )
|
||||||
|
|
||||||
/* Offsets in the stack to the parameters when inside the SVC handler. */
|
/* Offsets in the stack to the parameters when inside the SVC handler. */
|
||||||
#define portOFFSET_TO_PC ( 6 )
|
#define portOFFSET_TO_PC ( 6 )
|
||||||
|
|
||||||
/* 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 )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure a number of standard MPU regions that are used by all tasks.
|
* Configure a number of standard MPU regions that are used by all tasks.
|
||||||
|
|
@ -114,13 +115,6 @@ static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks to see if being called from the context of an unprivileged task, and
|
|
||||||
* if so raises the privilege level and returns false - otherwise does nothing
|
|
||||||
* other than return true.
|
|
||||||
*/
|
|
||||||
BaseType_t xPortRaisePrivilege( void ) __attribute__(( naked ));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the timer to generate the tick interrupts. The implementation in this
|
* Setup the timer to generate the tick interrupts. The implementation in this
|
||||||
* file is weak to allow application writers to change the timer used to
|
* file is weak to allow application writers to change the timer used to
|
||||||
|
|
@ -146,11 +140,40 @@ static void prvRestoreContextOfFirstTask( void ) __attribute__(( naked )) PRIVIL
|
||||||
*/
|
*/
|
||||||
static void prvSVCHandler( uint32_t *pulRegisters ) __attribute__(( noinline )) PRIVILEGED_FUNCTION;
|
static void prvSVCHandler( uint32_t *pulRegisters ) __attribute__(( noinline )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Calls the port specific code to raise the privilege.
|
||||||
|
*
|
||||||
|
* @return pdFALSE if privilege was raised, pdTRUE otherwise.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortRaisePrivilege( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief If xRunningPrivileged is not pdTRUE, calls the port specific
|
||||||
|
* code to reset the privilege, otherwise does nothing.
|
||||||
|
*/
|
||||||
|
extern void vPortResetPrivilege( BaseType_t xRunningPrivileged );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
/* Each task maintains its own interrupt status in the critical nesting
|
||||||
variable. Note this is not saved as part of the task context as context
|
* variable. Note this is not saved as part of the task context as context
|
||||||
switches can only occur when uxCriticalNesting is zero. */
|
* switches can only occur when uxCriticalNesting is zero. */
|
||||||
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -163,7 +186,6 @@ static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
static uint32_t ulMaxPRIGROUPValue = 0;
|
static uint32_t ulMaxPRIGROUPValue = 0;
|
||||||
static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
|
static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
|
||||||
#endif /* configASSERT_DEFINED */
|
#endif /* configASSERT_DEFINED */
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -172,7 +194,7 @@ static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged )
|
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged )
|
||||||
{
|
{
|
||||||
/* 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. */
|
||||||
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
||||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
@ -218,10 +240,25 @@ void vPortSVCHandler( void )
|
||||||
static void prvSVCHandler( uint32_t *pulParam )
|
static void prvSVCHandler( uint32_t *pulParam )
|
||||||
{
|
{
|
||||||
uint8_t ucSVCNumber;
|
uint8_t ucSVCNumber;
|
||||||
|
uint32_t ulPC;
|
||||||
|
#if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||||
|
#if defined( __ARMCC_VERSION )
|
||||||
|
/* Declaration when these variable are defined in code instead of being
|
||||||
|
* exported from linker scripts. */
|
||||||
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
extern uint32_t * __syscalls_flash_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __syscalls_flash_start__[];
|
||||||
|
extern uint32_t __syscalls_flash_end__[];
|
||||||
|
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||||
|
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||||
|
|
||||||
|
/* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first
|
||||||
|
* argument (r0) is pulParam[ 0 ]. */
|
||||||
|
ulPC = pulParam[ portOFFSET_TO_PC ];
|
||||||
|
ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ];
|
||||||
|
|
||||||
/* The stack contains: r0, r1, r2, r3, r12, r14, the return address and
|
|
||||||
xPSR. The first argument (r0) is pulParam[ 0 ]. */
|
|
||||||
ucSVCNumber = ( ( uint8_t * ) pulParam[ portOFFSET_TO_PC ] )[ -2 ];
|
|
||||||
switch( ucSVCNumber )
|
switch( ucSVCNumber )
|
||||||
{
|
{
|
||||||
case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI;
|
case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI;
|
||||||
|
|
@ -230,14 +267,32 @@ uint8_t ucSVCNumber;
|
||||||
|
|
||||||
case portSVC_YIELD : portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
case portSVC_YIELD : portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
|
||||||
/* Barriers are normally not required
|
/* Barriers are normally not required
|
||||||
but do ensure the code is completely
|
* but do ensure the code is completely
|
||||||
within the specified behaviour for the
|
* within the specified behaviour for the
|
||||||
architecture. */
|
* architecture. */
|
||||||
__asm volatile( "dsb" ::: "memory" );
|
__asm volatile( "dsb" ::: "memory" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile( "isb" );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
#if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||||
|
case portSVC_RAISE_PRIVILEGE : /* Only raise the privilege, if the
|
||||||
|
* svc was raised from any of the
|
||||||
|
* system calls. */
|
||||||
|
if( ulPC >= ( uint32_t ) __syscalls_flash_start__ &&
|
||||||
|
ulPC <= ( uint32_t ) __syscalls_flash_end__ )
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r1, control \n" /* Obtain current control value. */
|
||||||
|
" bic r1, #1 \n" /* Set privilege bit. */
|
||||||
|
" msr control, r1 \n" /* Write back new control value. */
|
||||||
|
::: "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#else
|
||||||
case portSVC_RAISE_PRIVILEGE : __asm volatile
|
case portSVC_RAISE_PRIVILEGE : __asm volatile
|
||||||
(
|
(
|
||||||
" mrs r1, control \n" /* Obtain current control value. */
|
" mrs r1, control \n" /* Obtain current control value. */
|
||||||
|
|
@ -246,6 +301,7 @@ uint8_t ucSVCNumber;
|
||||||
::: "r1", "memory"
|
::: "r1", "memory"
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||||
|
|
||||||
default : /* Unknown SVC call. */
|
default : /* Unknown SVC call. */
|
||||||
break;
|
break;
|
||||||
|
|
@ -265,9 +321,23 @@ static void prvRestoreContextOfFirstTask( void )
|
||||||
" ldr r1, [r3] \n"
|
" ldr r1, [r3] \n"
|
||||||
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
||||||
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
||||||
|
" \n"
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r3, #1 \n" /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
||||||
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r3, #1 \n" /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
" \n"
|
||||||
" ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
" ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
||||||
" msr control, r3 \n"
|
" msr control, r3 \n"
|
||||||
" msr psp, r0 \n" /* Restore the task stack pointer. */
|
" msr psp, r0 \n" /* Restore the task stack pointer. */
|
||||||
|
|
@ -288,7 +358,7 @@ static void prvRestoreContextOfFirstTask( void )
|
||||||
BaseType_t xPortStartScheduler( void )
|
BaseType_t xPortStartScheduler( void )
|
||||||
{
|
{
|
||||||
/* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See
|
/* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See
|
||||||
http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
|
* http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */
|
||||||
configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) );
|
configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) );
|
||||||
|
|
||||||
#if( configASSERT_DEFINED == 1 )
|
#if( configASSERT_DEFINED == 1 )
|
||||||
|
|
@ -298,15 +368,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
|
||||||
ensure interrupt entry is as fast and simple as possible.
|
* to 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. */
|
||||||
|
|
@ -316,7 +386,7 @@ 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 )
|
||||||
{
|
{
|
||||||
|
|
@ -327,8 +397,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
|
||||||
|
|
@ -336,26 +406,26 @@ 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 same priority as the kernel, and the SVC
|
/* Make PendSV and SysTick the same priority as the kernel, and the SVC
|
||||||
handler higher priority so it can be used to exit a critical section (where
|
* handler higher priority so it can be used to exit a critical section (where
|
||||||
lower priorities are masked). */
|
* lower priorities are masked). */
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
|
||||||
|
|
||||||
|
|
@ -363,7 +433,7 @@ BaseType_t xPortStartScheduler( void )
|
||||||
prvSetupMPU();
|
prvSetupMPU();
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
|
@ -391,7 +461,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 );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
@ -449,9 +519,23 @@ void xPortPendSVHandler( void )
|
||||||
" ldr r1, [r3] \n"
|
" ldr r1, [r3] \n"
|
||||||
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
||||||
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
||||||
|
" \n"
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r3, #1 \n" /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
||||||
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r3, #1 \n" /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
" \n"
|
||||||
" ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
" ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
||||||
" msr control, r3 \n"
|
" msr control, r3 \n"
|
||||||
" \n"
|
" \n"
|
||||||
|
|
@ -520,8 +604,8 @@ extern uint32_t __privileged_data_end__[];
|
||||||
( portMPU_REGION_ENABLE );
|
( portMPU_REGION_ENABLE );
|
||||||
|
|
||||||
/* Setup the first 16K for privileged only access (even though less
|
/* Setup the first 16K for privileged only access (even though less
|
||||||
than 10K is actually being used). This is where the kernel code is
|
* than 10K is actually being used). This is where the kernel code is
|
||||||
placed. */
|
* placed. */
|
||||||
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
||||||
( portMPU_REGION_VALID ) |
|
( portMPU_REGION_VALID ) |
|
||||||
( portPRIVILEGED_FLASH_REGION );
|
( portPRIVILEGED_FLASH_REGION );
|
||||||
|
|
@ -532,7 +616,7 @@ extern uint32_t __privileged_data_end__[];
|
||||||
( portMPU_REGION_ENABLE );
|
( portMPU_REGION_ENABLE );
|
||||||
|
|
||||||
/* Setup the privileged data RAM region. This is where the kernel data
|
/* Setup the privileged data RAM region. This is where the kernel data
|
||||||
is placed. */
|
* is placed. */
|
||||||
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */
|
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */
|
||||||
( portMPU_REGION_VALID ) |
|
( portMPU_REGION_VALID ) |
|
||||||
( portPRIVILEGED_RAM_REGION );
|
( portPRIVILEGED_RAM_REGION );
|
||||||
|
|
@ -543,7 +627,7 @@ extern uint32_t __privileged_data_end__[];
|
||||||
( portMPU_REGION_ENABLE );
|
( portMPU_REGION_ENABLE );
|
||||||
|
|
||||||
/* By default allow everything to access the general peripherals. The
|
/* By default allow everything to access the general peripherals. The
|
||||||
system peripherals and registers are protected. */
|
* system peripherals and registers are protected. */
|
||||||
portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) |
|
portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) |
|
||||||
( portMPU_REGION_VALID ) |
|
( portMPU_REGION_VALID ) |
|
||||||
( portGENERAL_PERIPHERALS_REGION );
|
( portGENERAL_PERIPHERALS_REGION );
|
||||||
|
|
@ -566,7 +650,7 @@ static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes )
|
||||||
uint32_t ulRegionSize, ulReturnValue = 4;
|
uint32_t ulRegionSize, ulReturnValue = 4;
|
||||||
|
|
||||||
/* 32 is the smallest region size, 31 is the largest valid value for
|
/* 32 is the smallest region size, 31 is the largest valid value for
|
||||||
ulReturnValue. */
|
* ulReturnValue. */
|
||||||
for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) )
|
for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) )
|
||||||
{
|
{
|
||||||
if( ulActualSizeInBytes <= ulRegionSize )
|
if( ulActualSizeInBytes <= ulRegionSize )
|
||||||
|
|
@ -580,26 +664,38 @@ uint32_t ulRegionSize, ulReturnValue = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Shift the code by one before returning so it can be written directly
|
/* Shift the code by one before returning so it can be written directly
|
||||||
into the the correct bit position of the attribute register. */
|
* into the the correct bit position of the attribute register. */
|
||||||
return ( ulReturnValue << 1UL );
|
return ( ulReturnValue << 1UL );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t xPortRaisePrivilege( void )
|
BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" mrs r0, control \n"
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n" /* Is the task running privileged? */
|
" tst r0, #1 \n" /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" itte ne \n"
|
" ite ne \n"
|
||||||
" movne r0, #0 \n" /* CONTROL[0]!=0, return false. */
|
" movne r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
" svcne %0 \n" /* Switch to privileged. */
|
" moveq r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
" moveq r0, #1 \n" /* CONTROL[0]==0, return true. */
|
" bx lr \n" /* Return. */
|
||||||
" bx lr \n"
|
" \n"
|
||||||
:: "i" (portSVC_RAISE_PRIVILEGE) : "r0", "memory"
|
" .align 4 \n"
|
||||||
|
::: "r0", "memory"
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
return 0;
|
void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" orr r0, #1 \n" /* r0 = r0 | 1. */
|
||||||
|
" msr control, r0 \n" /* CONTROL = r0. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
:::"r0", "memory"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -627,7 +723,7 @@ uint32_t ul;
|
||||||
( portMPU_REGION_ENABLE );
|
( portMPU_REGION_ENABLE );
|
||||||
|
|
||||||
/* Re-instate the privileged only RAM region as xRegion[ 0 ] will have
|
/* Re-instate the privileged only RAM region as xRegion[ 0 ] will have
|
||||||
just removed the privileged only parameters. */
|
* just removed the privileged only parameters. */
|
||||||
xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress =
|
xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress =
|
||||||
( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */
|
( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */
|
||||||
( portMPU_REGION_VALID ) |
|
( portMPU_REGION_VALID ) |
|
||||||
|
|
@ -649,9 +745,9 @@ uint32_t ul;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* This function is called automatically when the task is created - in
|
/* This function is called automatically when the task is created - in
|
||||||
which case the stack region parameters will be valid. At all other
|
* which case the stack region parameters will be valid. At all other
|
||||||
times the stack parameters will not be valid and it is assumed that the
|
* times the stack parameters will not be valid and it is assumed that the
|
||||||
stack region has already been configured. */
|
* stack region has already been configured. */
|
||||||
if( ulStackDepth > 0 )
|
if( ulStackDepth > 0 )
|
||||||
{
|
{
|
||||||
/* Define the region that allows access to the stack. */
|
/* Define the region that allows access to the stack. */
|
||||||
|
|
@ -674,8 +770,8 @@ uint32_t ul;
|
||||||
if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL )
|
if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL )
|
||||||
{
|
{
|
||||||
/* Translate the generic region definition contained in
|
/* Translate the generic region definition contained in
|
||||||
xRegions into the CM3 specific MPU settings that are then
|
* xRegions into the CM3 specific MPU settings that are then
|
||||||
stored in xMPUSettings. */
|
* stored in xMPUSettings. */
|
||||||
xMPUSettings->xRegion[ ul ].ulRegionBaseAddress =
|
xMPUSettings->xRegion[ ul ].ulRegionBaseAddress =
|
||||||
( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) |
|
( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) |
|
||||||
( portMPU_REGION_VALID ) |
|
( portMPU_REGION_VALID ) |
|
||||||
|
|
@ -716,48 +812,46 @@ uint32_t ul;
|
||||||
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
|
* http://www.freertos.org/RTOS-Cortex-M3-M4.html
|
||||||
http://www.freertos.org/FAQHelp.html */
|
* http://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 unpredicable behaviour. */
|
* of zero will result in unpredicable behaviour. */
|
||||||
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configASSERT_DEFINED */
|
#endif /* configASSERT_DEFINED */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -73,12 +73,13 @@ typedef unsigned long UBaseType_t;
|
||||||
#define portUSING_MPU_WRAPPERS 1
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
|
||||||
#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL )
|
#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL )
|
||||||
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL )
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL )
|
||||||
#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL )
|
#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL )
|
||||||
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL )
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL )
|
||||||
#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL )
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL )
|
||||||
#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL )
|
#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL )
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL )
|
||||||
|
|
||||||
#define portUNPRIVILEGED_FLASH_REGION ( 0UL )
|
#define portUNPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
#define portPRIVILEGED_FLASH_REGION ( 1UL )
|
#define portPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
|
@ -200,18 +201,28 @@ not necessary for to use this port. They are defined so the common demo files
|
||||||
#ifndef portFORCE_INLINE
|
#ifndef portFORCE_INLINE
|
||||||
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
||||||
#endif
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Set the privilege level to user mode if xRunningPrivileged is false. */
|
extern BaseType_t xIsPrivileged( void );
|
||||||
portFORCE_INLINE static void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
extern void vResetPrivilege( void );
|
||||||
{
|
|
||||||
if( xRunningPrivileged != pdTRUE )
|
/**
|
||||||
{
|
* @brief Checks whether or not the processor is privileged.
|
||||||
__asm volatile ( " mrs r0, control \n" \
|
*
|
||||||
" orr r0, #1 \n" \
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
" msr control, r0 \n" \
|
*/
|
||||||
:::"r0", "memory" );
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
}
|
|
||||||
}
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
||||||
|
|
@ -281,7 +292,13 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
|
#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY
|
||||||
|
#warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.freertos.org/FreeRTOS-V10.3.x.html"
|
||||||
|
#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -576,14 +576,14 @@ void xPortSysTickHandler( void )
|
||||||
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 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
|
||||||
out of sleep mode to execute immediately. see comments above
|
out of sleep mode to execute immediately. see comments above
|
||||||
|
|
@ -664,7 +664,7 @@ void xPortSysTickHandler( void )
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Exit with interrpts enabled. */
|
/* Exit with interrupts enabled. */
|
||||||
__asm volatile( "cpsie i" ::: "memory" );
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -233,6 +233,7 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -123,13 +123,6 @@ static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks to see if being called from the context of an unprivileged task, and
|
|
||||||
* if so raises the privilege level and returns false - otherwise does nothing
|
|
||||||
* other than return true.
|
|
||||||
*/
|
|
||||||
BaseType_t xPortRaisePrivilege( void ) __attribute__(( naked ));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the timer to generate the tick interrupts. The implementation in this
|
* Setup the timer to generate the tick interrupts. The implementation in this
|
||||||
* file is weak to allow application writers to change the timer used to
|
* file is weak to allow application writers to change the timer used to
|
||||||
|
|
@ -141,7 +134,7 @@ void vPortSetupTimerInterrupt( void );
|
||||||
* Standard FreeRTOS exception handlers.
|
* Standard FreeRTOS exception handlers.
|
||||||
*/
|
*/
|
||||||
void xPortPendSVHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
void xPortPendSVHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
void xPortSysTickHandler( void ) __attribute__ ((optimize("3"))) PRIVILEGED_FUNCTION;
|
void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION;
|
||||||
void vPortSVCHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
void vPortSVCHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -160,6 +153,35 @@ static void prvSVCHandler( uint32_t *pulRegisters ) __attribute__(( noinline ))
|
||||||
*/
|
*/
|
||||||
static void vPortEnableVFP( void ) __attribute__ (( naked ));
|
static void vPortEnableVFP( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Calls the port specific code to raise the privilege.
|
||||||
|
*
|
||||||
|
* @return pdFALSE if privilege was raised, pdTRUE otherwise.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortRaisePrivilege( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief If xRunningPrivileged is not pdTRUE, calls the port specific
|
||||||
|
* code to reset the privilege, otherwise does nothing.
|
||||||
|
*/
|
||||||
|
extern void vPortResetPrivilege( BaseType_t xRunningPrivileged );
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
/* Each task maintains its own interrupt status in the critical nesting
|
||||||
|
|
@ -238,10 +260,25 @@ void vPortSVCHandler( void )
|
||||||
static void prvSVCHandler( uint32_t *pulParam )
|
static void prvSVCHandler( uint32_t *pulParam )
|
||||||
{
|
{
|
||||||
uint8_t ucSVCNumber;
|
uint8_t ucSVCNumber;
|
||||||
|
uint32_t ulPC;
|
||||||
|
#if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||||
|
#if defined( __ARMCC_VERSION )
|
||||||
|
/* Declaration when these variable are defined in code instead of being
|
||||||
|
* exported from linker scripts. */
|
||||||
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
extern uint32_t * __syscalls_flash_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __syscalls_flash_start__[];
|
||||||
|
extern uint32_t __syscalls_flash_end__[];
|
||||||
|
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||||
|
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||||
|
|
||||||
|
/* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first
|
||||||
|
argument (r0) is pulParam[ 0 ]. */
|
||||||
|
ulPC = pulParam[ portOFFSET_TO_PC ];
|
||||||
|
ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ];
|
||||||
|
|
||||||
/* The stack contains: r0, r1, r2, r3, r12, r14, the return address and
|
|
||||||
xPSR. The first argument (r0) is pulParam[ 0 ]. */
|
|
||||||
ucSVCNumber = ( ( uint8_t * ) pulParam[ portOFFSET_TO_PC ] )[ -2 ];
|
|
||||||
switch( ucSVCNumber )
|
switch( ucSVCNumber )
|
||||||
{
|
{
|
||||||
case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI;
|
case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI;
|
||||||
|
|
@ -258,6 +295,23 @@ uint8_t ucSVCNumber;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||||
|
case portSVC_RAISE_PRIVILEGE : /* Only raise the privilege, if the
|
||||||
|
* svc was raised from any of the
|
||||||
|
* system calls. */
|
||||||
|
if( ulPC >= ( uint32_t ) __syscalls_flash_start__ &&
|
||||||
|
ulPC <= ( uint32_t ) __syscalls_flash_end__ )
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r1, control \n" /* Obtain current control value. */
|
||||||
|
" bic r1, #1 \n" /* Set privilege bit. */
|
||||||
|
" msr control, r1 \n" /* Write back new control value. */
|
||||||
|
::: "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#else
|
||||||
case portSVC_RAISE_PRIVILEGE : __asm volatile
|
case portSVC_RAISE_PRIVILEGE : __asm volatile
|
||||||
(
|
(
|
||||||
" mrs r1, control \n" /* Obtain current control value. */
|
" mrs r1, control \n" /* Obtain current control value. */
|
||||||
|
|
@ -266,6 +320,7 @@ uint8_t ucSVCNumber;
|
||||||
::: "r1", "memory"
|
::: "r1", "memory"
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||||
|
|
||||||
default : /* Unknown SVC call. */
|
default : /* Unknown SVC call. */
|
||||||
break;
|
break;
|
||||||
|
|
@ -285,9 +340,23 @@ static void prvRestoreContextOfFirstTask( void )
|
||||||
" ldr r1, [r3] \n"
|
" ldr r1, [r3] \n"
|
||||||
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
||||||
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
||||||
|
" \n"
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r3, #1 \n" /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
||||||
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers from TCB. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r3, #1 \n" /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
" \n"
|
||||||
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
||||||
" msr control, r3 \n"
|
" msr control, r3 \n"
|
||||||
" msr psp, r0 \n" /* Restore the task stack pointer. */
|
" msr psp, r0 \n" /* Restore the task stack pointer. */
|
||||||
|
|
@ -484,9 +553,23 @@ void xPortPendSVHandler( void )
|
||||||
" ldr r1, [r3] \n"
|
" ldr r1, [r3] \n"
|
||||||
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
||||||
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
||||||
|
" \n"
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r3, #1 \n" /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
||||||
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers from TCB. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r3, #1 \n" /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
" \n"
|
||||||
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
||||||
" msr control, r3 \n"
|
" msr control, r3 \n"
|
||||||
" \n"
|
" \n"
|
||||||
|
|
@ -554,14 +637,24 @@ static void vPortEnableVFP( void )
|
||||||
|
|
||||||
static void prvSetupMPU( void )
|
static void prvSetupMPU( void )
|
||||||
{
|
{
|
||||||
extern uint32_t __privileged_functions_end__[];
|
#if defined( __ARMCC_VERSION )
|
||||||
extern uint32_t __FLASH_segment_start__[];
|
/* Declaration when these variable are defined in code instead of being
|
||||||
extern uint32_t __FLASH_segment_end__[];
|
* exported from linker scripts. */
|
||||||
extern uint32_t __privileged_data_start__[];
|
extern uint32_t * __privileged_functions_end__;
|
||||||
extern uint32_t __privileged_data_end__[];
|
extern uint32_t * __FLASH_segment_start__;
|
||||||
|
extern uint32_t * __FLASH_segment_end__;
|
||||||
|
extern uint32_t * __privileged_data_start__;
|
||||||
|
extern uint32_t * __privileged_data_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __privileged_functions_end__[];
|
||||||
|
extern uint32_t __FLASH_segment_start__[];
|
||||||
|
extern uint32_t __FLASH_segment_end__[];
|
||||||
|
extern uint32_t __privileged_data_start__[];
|
||||||
|
extern uint32_t __privileged_data_end__[];
|
||||||
|
#endif
|
||||||
/* Check the expected MPU is present. */
|
/* Check the expected MPU is present. */
|
||||||
if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE )
|
if( ( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) || ( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE << 1 ))
|
||||||
{
|
{
|
||||||
/* First setup the entire flash for unprivileged read only access. */
|
/* First setup the entire flash for unprivileged read only access. */
|
||||||
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
||||||
|
|
@ -573,7 +666,7 @@ extern uint32_t __privileged_data_end__[];
|
||||||
( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) |
|
( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) |
|
||||||
( portMPU_REGION_ENABLE );
|
( portMPU_REGION_ENABLE );
|
||||||
|
|
||||||
/* Setup the first 16K for privileged only access (even though less
|
/* Setup the first nK for privileged only access (even though less
|
||||||
than 10K is actually being used). This is where the kernel code is
|
than 10K is actually being used). This is where the kernel code is
|
||||||
placed. */
|
placed. */
|
||||||
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
||||||
|
|
@ -639,30 +732,53 @@ uint32_t ulRegionSize, ulReturnValue = 4;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t xPortRaisePrivilege( void )
|
BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" mrs r0, control \n"
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n" /* Is the task running privileged? */
|
" tst r0, #1 \n" /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" itte ne \n"
|
" ite ne \n"
|
||||||
" movne r0, #0 \n" /* CONTROL[0]!=0, return false. */
|
" movne r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
" svcne %0 \n" /* Switch to privileged. */
|
" moveq r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
" moveq r0, #1 \n" /* CONTROL[0]==0, return true. */
|
" bx lr \n" /* Return. */
|
||||||
" bx lr \n"
|
" \n"
|
||||||
:: "i" (portSVC_RAISE_PRIVILEGE) : "r0", "memory"
|
" .align 4 \n"
|
||||||
|
::: "r0", "memory"
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
return 0;
|
void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" orr r0, #1 \n" /* r0 = r0 | 1. */
|
||||||
|
" msr control, r0 \n" /* CONTROL = r0. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
:::"r0", "memory"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
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 )
|
||||||
{
|
{
|
||||||
extern uint32_t __SRAM_segment_start__[];
|
#if defined( __ARMCC_VERSION )
|
||||||
extern uint32_t __SRAM_segment_end__[];
|
/* Declaration when these variable are defined in code instead of being
|
||||||
extern uint32_t __privileged_data_start__[];
|
* exported from linker scripts. */
|
||||||
extern uint32_t __privileged_data_end__[];
|
extern uint32_t * __SRAM_segment_start__;
|
||||||
|
extern uint32_t * __SRAM_segment_end__;
|
||||||
|
extern uint32_t * __privileged_data_start__;
|
||||||
|
extern uint32_t * __privileged_data_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __SRAM_segment_start__[];
|
||||||
|
extern uint32_t __SRAM_segment_end__[];
|
||||||
|
extern uint32_t __privileged_data_start__[];
|
||||||
|
extern uint32_t __privileged_data_end__[];
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t lIndex;
|
int32_t lIndex;
|
||||||
uint32_t ul;
|
uint32_t ul;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -73,12 +73,13 @@ typedef unsigned long UBaseType_t;
|
||||||
#define portUSING_MPU_WRAPPERS 1
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
|
||||||
#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL )
|
#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL )
|
||||||
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL )
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL )
|
||||||
#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL )
|
#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL )
|
||||||
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL )
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL )
|
||||||
#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL )
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL )
|
||||||
#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL )
|
#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x03UL << 16UL )
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL )
|
||||||
|
|
||||||
#define portUNPRIVILEGED_FLASH_REGION ( 0UL )
|
#define portUNPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
#define portPRIVILEGED_FLASH_REGION ( 1UL )
|
#define portPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
|
@ -200,18 +201,28 @@ not necessary for to use this port. They are defined so the common demo files
|
||||||
#ifndef portFORCE_INLINE
|
#ifndef portFORCE_INLINE
|
||||||
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
||||||
#endif
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Set the privilege level to user mode if xRunningPrivileged is false. */
|
extern BaseType_t xIsPrivileged( void );
|
||||||
portFORCE_INLINE static void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
extern void vResetPrivilege( void );
|
||||||
{
|
|
||||||
if( xRunningPrivileged != pdTRUE )
|
/**
|
||||||
{
|
* @brief Checks whether or not the processor is privileged.
|
||||||
__asm volatile ( " mrs r0, control \n" \
|
*
|
||||||
" orr r0, #1 \n" \
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
" msr control, r0 \n" \
|
*/
|
||||||
:::"r0", "memory" );
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
}
|
|
||||||
}
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
||||||
|
|
@ -281,7 +292,13 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
|
#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY
|
||||||
|
#warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.freertos.org/FreeRTOS-V10.3.x.html"
|
||||||
|
#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -566,14 +566,14 @@ void xPortSysTickHandler( void )
|
||||||
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 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
|
||||||
out of sleep mode to execute immediately. see comments above
|
out of sleep mode to execute immediately. see comments above
|
||||||
|
|
@ -654,7 +654,7 @@ void xPortSysTickHandler( void )
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Exit with interrpts enabled. */
|
/* Exit with interrupts enabled. */
|
||||||
__asm volatile( "cpsie i" ::: "memory" );
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -237,6 +237,7 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Portion Copyright © 2020 STMicroelectronics International N.V. All rights reserved.
|
||||||
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -26,7 +27,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* Implementation of functions defined in portable.h
|
* Implementation of functions defined in portable.h for the ARM CM7 port.
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
||||||
|
|
@ -44,15 +45,20 @@ task.h is included from an application file. */
|
||||||
|
|
||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
|
||||||
|
|
||||||
#ifndef configSYSTICK_CLOCK_HZ
|
#ifndef configSYSTICK_CLOCK_HZ
|
||||||
#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ
|
#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ
|
||||||
|
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
||||||
|
#define portNVIC_SYSTICK_CLK ( 1UL << 2UL )
|
||||||
|
#else
|
||||||
|
/* The way the SysTick is clocked is not modified in case it is not the same
|
||||||
|
as the core. */
|
||||||
|
#define portNVIC_SYSTICK_CLK ( 0 )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Constants required to access and manipulate the NVIC. */
|
/* Constants required to access and manipulate the NVIC. */
|
||||||
#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_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
|
||||||
#define portNVIC_SYSPRI1_REG ( * ( ( volatile uint32_t * ) 0xe000ed1c ) )
|
#define portNVIC_SYSPRI1_REG ( * ( ( volatile uint32_t * ) 0xe000ed1c ) )
|
||||||
#define portNVIC_SYS_CTRL_STATE_REG ( * ( ( volatile uint32_t * ) 0xe000ed24 ) )
|
#define portNVIC_SYS_CTRL_STATE_REG ( * ( ( volatile uint32_t * ) 0xe000ed24 ) )
|
||||||
|
|
@ -73,9 +79,7 @@ task.h is included from an application file. */
|
||||||
#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL
|
#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL
|
||||||
|
|
||||||
/* Constants required to access and manipulate the SysTick. */
|
/* Constants required to access and manipulate the SysTick. */
|
||||||
#define portNVIC_SYSTICK_CLK ( 0x00000004UL )
|
|
||||||
#define portNVIC_SYSTICK_INT ( 0x00000002UL )
|
#define portNVIC_SYSTICK_INT ( 0x00000002UL )
|
||||||
#define portNVIC_SYSTICK_COUNT_FLAG ( 1UL << 16UL )
|
|
||||||
#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL )
|
#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL )
|
||||||
#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
|
#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
|
||||||
#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
|
#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
|
||||||
|
|
@ -87,7 +91,7 @@ task.h is included from an application file. */
|
||||||
|
|
||||||
/* Constants required to set up the initial stack. */
|
/* Constants required to set up the initial stack. */
|
||||||
#define portINITIAL_XPSR ( 0x01000000UL )
|
#define portINITIAL_XPSR ( 0x01000000UL )
|
||||||
#define portINITIAL_EXEC_RETURN ( 0xfffffffdUL )
|
#define portINITIAL_EXC_RETURN ( 0xfffffffdUL )
|
||||||
#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 )
|
#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 )
|
||||||
#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 )
|
#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 )
|
||||||
|
|
||||||
|
|
@ -104,30 +108,10 @@ task.h is included from an application file. */
|
||||||
/* Offsets in the stack to the parameters when inside the SVC handler. */
|
/* Offsets in the stack to the parameters when inside the SVC handler. */
|
||||||
#define portOFFSET_TO_PC ( 6 )
|
#define portOFFSET_TO_PC ( 6 )
|
||||||
|
|
||||||
/* The systick is a 24-bit counter. */
|
|
||||||
#define portMAX_24_BIT_NUMBER ( 0xffffffUL )
|
|
||||||
|
|
||||||
/* A fiddle factor to estimate the number of SysTick counts that would have
|
|
||||||
occurred while the SysTick counter is stopped during tickless idle
|
|
||||||
calculations. */
|
|
||||||
#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 )
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
|
||||||
variable. Note this is not saved as part of the task context as context
|
|
||||||
switches can only occur when uxCriticalNesting is zero. */
|
|
||||||
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the timer to generate the tick interrupts. The implementation in this
|
|
||||||
* file is weak to allow application writers to change the timer used to
|
|
||||||
* generate the tick interrupt.
|
|
||||||
*/
|
|
||||||
void vPortSetupTimerInterrupt( void );
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure a number of standard MPU regions that are used by all tasks.
|
* Configure a number of standard MPU regions that are used by all tasks.
|
||||||
*/
|
*/
|
||||||
|
|
@ -141,17 +125,17 @@ static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;
|
||||||
static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Checks to see if being called from the context of an unprivileged task, and
|
* Setup the timer to generate the tick interrupts. The implementation in this
|
||||||
* if so raises the privilege level and returns false - otherwise does nothing
|
* file is weak to allow application writers to change the timer used to
|
||||||
* other than return true.
|
* generate the tick interrupt.
|
||||||
*/
|
*/
|
||||||
BaseType_t xPortRaisePrivilege( void ) __attribute__(( naked ));
|
void vPortSetupTimerInterrupt( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Standard FreeRTOS exception handlers.
|
* Standard FreeRTOS exception handlers.
|
||||||
*/
|
*/
|
||||||
void xPortPendSVHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
void xPortPendSVHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
void xPortSysTickHandler( void ) __attribute__ ((optimize("3"))) PRIVILEGED_FUNCTION;
|
void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION;
|
||||||
void vPortSVCHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
void vPortSVCHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -169,29 +153,42 @@ static void prvSVCHandler( uint32_t *pulRegisters ) __attribute__(( noinline ))
|
||||||
* Function to enable the VFP.
|
* Function to enable the VFP.
|
||||||
*/
|
*/
|
||||||
static void vPortEnableVFP( void ) __attribute__ (( naked ));
|
static void vPortEnableVFP( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of SysTick increments that make up one tick period.
|
|
||||||
*/
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
|
||||||
static uint32_t ulTimerCountsForOneTick = 0;
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* The maximum number of tick periods that can be suppressed is limited by the
|
* @brief Checks whether or not the processor is privileged.
|
||||||
* 24 bit resolution of the SysTick timer.
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Compensate for the CPU cycles that pass while the SysTick is stopped (low
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
* power functionality only.
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
static uint32_t ulStoppedTimerCompensation = 0;
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
/**
|
||||||
|
* @brief Calls the port specific code to raise the privilege.
|
||||||
|
*
|
||||||
|
* @return pdFALSE if privilege was raised, pdTRUE otherwise.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortRaisePrivilege( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief If xRunningPrivileged is not pdTRUE, calls the port specific
|
||||||
|
* code to reset the privilege, otherwise does nothing.
|
||||||
|
*/
|
||||||
|
extern void vPortResetPrivilege( BaseType_t xRunningPrivileged );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Each task maintains its own interrupt status in the critical nesting
|
||||||
|
variable. Note this is not saved as part of the task context as context
|
||||||
|
switches can only occur when uxCriticalNesting is zero. */
|
||||||
|
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure
|
* Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure
|
||||||
|
|
@ -221,12 +218,12 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
|
||||||
*pxTopOfStack = 0; /* LR */
|
*pxTopOfStack = 0; /* LR */
|
||||||
pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
|
pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
|
||||||
*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_EXEC_RETURN;
|
*pxTopOfStack = portINITIAL_EXC_RETURN;
|
||||||
|
|
||||||
pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
|
pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
|
||||||
|
|
||||||
if( xRunPrivileged == pdTRUE )
|
if( xRunPrivileged == pdTRUE )
|
||||||
|
|
@ -256,7 +253,7 @@ void vPortSVCHandler( void )
|
||||||
" mrs r0, psp \n"
|
" mrs r0, psp \n"
|
||||||
#endif
|
#endif
|
||||||
" b %0 \n"
|
" b %0 \n"
|
||||||
::"i"(prvSVCHandler):"r0"
|
::"i"(prvSVCHandler):"r0", "memory"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
@ -264,10 +261,25 @@ void vPortSVCHandler( void )
|
||||||
static void prvSVCHandler( uint32_t *pulParam )
|
static void prvSVCHandler( uint32_t *pulParam )
|
||||||
{
|
{
|
||||||
uint8_t ucSVCNumber;
|
uint8_t ucSVCNumber;
|
||||||
|
uint32_t ulPC;
|
||||||
|
#if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||||
|
#if defined( __ARMCC_VERSION )
|
||||||
|
/* Declaration when these variable are defined in code instead of being
|
||||||
|
* exported from linker scripts. */
|
||||||
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
extern uint32_t * __syscalls_flash_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __syscalls_flash_start__[];
|
||||||
|
extern uint32_t __syscalls_flash_end__[];
|
||||||
|
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||||
|
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||||
|
|
||||||
|
/* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first
|
||||||
|
argument (r0) is pulParam[ 0 ]. */
|
||||||
|
ulPC = pulParam[ portOFFSET_TO_PC ];
|
||||||
|
ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ];
|
||||||
|
|
||||||
/* The stack contains: r0, r1, r2, r3, r12, r14, the return address and
|
|
||||||
xPSR. The first argument (r0) is pulParam[ 0 ]. */
|
|
||||||
ucSVCNumber = ( ( uint8_t * ) pulParam[ portOFFSET_TO_PC ] )[ -2 ];
|
|
||||||
switch( ucSVCNumber )
|
switch( ucSVCNumber )
|
||||||
{
|
{
|
||||||
case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI;
|
case portSVC_START_SCHEDULER : portNVIC_SYSPRI1_REG |= portNVIC_SVC_PRI;
|
||||||
|
|
@ -279,19 +291,37 @@ uint8_t ucSVCNumber;
|
||||||
but do ensure the code is completely
|
but do ensure the code is completely
|
||||||
within the specified behaviour for the
|
within the specified behaviour for the
|
||||||
architecture. */
|
architecture. */
|
||||||
__asm volatile( "dsb" );
|
__asm volatile( "dsb" ::: "memory" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile( "isb" );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||||
|
case portSVC_RAISE_PRIVILEGE : /* Only raise the privilege, if the
|
||||||
|
* svc was raised from any of the
|
||||||
|
* system calls. */
|
||||||
|
if( ulPC >= ( uint32_t ) __syscalls_flash_start__ &&
|
||||||
|
ulPC <= ( uint32_t ) __syscalls_flash_end__ )
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r1, control \n" /* Obtain current control value. */
|
||||||
|
" bic r1, #1 \n" /* Set privilege bit. */
|
||||||
|
" msr control, r1 \n" /* Write back new control value. */
|
||||||
|
::: "r1", "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#else
|
||||||
case portSVC_RAISE_PRIVILEGE : __asm volatile
|
case portSVC_RAISE_PRIVILEGE : __asm volatile
|
||||||
(
|
(
|
||||||
" mrs r1, control \n" /* Obtain current control value. */
|
" mrs r1, control \n" /* Obtain current control value. */
|
||||||
" bic r1, #1 \n" /* Set privilege bit. */
|
" bic r1, #1 \n" /* Set privilege bit. */
|
||||||
" msr control, r1 \n" /* Write back new control value. */
|
" msr control, r1 \n" /* Write back new control value. */
|
||||||
:::"r1"
|
::: "r1", "memory"
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||||
|
|
||||||
default : /* Unknown SVC call. */
|
default : /* Unknown SVC call. */
|
||||||
break;
|
break;
|
||||||
|
|
@ -311,9 +341,23 @@ static void prvRestoreContextOfFirstTask( void )
|
||||||
" ldr r1, [r3] \n"
|
" ldr r1, [r3] \n"
|
||||||
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
||||||
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
||||||
|
" \n"
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r3, #1 \n" /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
||||||
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers from TCB. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r3, #1 \n" /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
" \n"
|
||||||
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
||||||
" msr control, r3 \n"
|
" msr control, r3 \n"
|
||||||
" msr psp, r0 \n" /* Restore the task stack pointer. */
|
" msr psp, r0 \n" /* Restore the task stack pointer. */
|
||||||
|
|
@ -369,6 +413,24 @@ BaseType_t xPortStartScheduler( void )
|
||||||
ucMaxPriorityValue <<= ( uint8_t ) 0x01;
|
ucMaxPriorityValue <<= ( uint8_t ) 0x01;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __NVIC_PRIO_BITS
|
||||||
|
{
|
||||||
|
/* Check the CMSIS configuration that defines the number of
|
||||||
|
priority bits matches the number of priority bits actually queried
|
||||||
|
from the hardware. */
|
||||||
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef configPRIO_BITS
|
||||||
|
{
|
||||||
|
/* Check the FreeRTOS configuration that defines the number of
|
||||||
|
priority bits matches the number of priority bits actually queried
|
||||||
|
from the hardware. */
|
||||||
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
|
||||||
|
}
|
||||||
|
#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;
|
||||||
|
|
@ -402,19 +464,24 @@ BaseType_t xPortStartScheduler( void )
|
||||||
/* Lazy save always. */
|
/* Lazy save always. */
|
||||||
*( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;
|
*( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;
|
||||||
|
|
||||||
/* Start the first task. */
|
/* Start the first task. This also clears the bit that indicates the FPU is
|
||||||
|
in use in case the FPU was used before the scheduler was started - which
|
||||||
|
would otherwise result in the unnecessary leaving of space in the SVC stack
|
||||||
|
for lazy saving of FPU registers. */
|
||||||
__asm volatile(
|
__asm volatile(
|
||||||
" ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */
|
" ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"
|
" ldr r0, [r0] \n"
|
||||||
" ldr r0, [r0] \n"
|
" ldr r0, [r0] \n"
|
||||||
" msr msp, r0 \n" /* Set the msp back to the start of the stack. */
|
" msr msp, r0 \n" /* Set the msp back to the start of the stack. */
|
||||||
|
" mov r0, #0 \n" /* Clear the bit that indicates the FPU is in use, see comment above. */
|
||||||
|
" msr control, r0 \n"
|
||||||
" cpsie i \n" /* Globally enable interrupts. */
|
" cpsie i \n" /* Globally enable interrupts. */
|
||||||
" cpsie f \n"
|
" cpsie f \n"
|
||||||
" dsb \n"
|
" dsb \n"
|
||||||
" isb \n"
|
" isb \n"
|
||||||
" svc %0 \n" /* System call to start first task. */
|
" svc %0 \n" /* System call to start first task. */
|
||||||
" nop \n"
|
" nop \n"
|
||||||
:: "i" (portSVC_START_SCHEDULER) );
|
:: "i" (portSVC_START_SCHEDULER) : "memory" );
|
||||||
|
|
||||||
/* Should not get here! */
|
/* Should not get here! */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -461,6 +528,7 @@ void xPortPendSVHandler( void )
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" mrs r0, psp \n"
|
" mrs r0, psp \n"
|
||||||
|
" isb \n"
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */
|
" ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */
|
||||||
" ldr r2, [r3] \n"
|
" ldr r2, [r3] \n"
|
||||||
|
|
@ -473,7 +541,7 @@ void xPortPendSVHandler( void )
|
||||||
" stmdb r0!, {r1, r4-r11, r14} \n" /* Save the remaining registers. */
|
" stmdb r0!, {r1, r4-r11, r14} \n" /* Save the remaining registers. */
|
||||||
" str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */
|
" str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" stmdb sp!, {r3} \n"
|
" stmdb sp!, {r0, r3} \n"
|
||||||
" mov r0, %0 \n"
|
" mov r0, %0 \n"
|
||||||
" cpsid i \n" /* Errata workaround. */
|
" cpsid i \n" /* Errata workaround. */
|
||||||
" msr basepri, r0 \n"
|
" msr basepri, r0 \n"
|
||||||
|
|
@ -483,14 +551,28 @@ void xPortPendSVHandler( void )
|
||||||
" bl vTaskSwitchContext \n"
|
" bl vTaskSwitchContext \n"
|
||||||
" mov r0, #0 \n"
|
" mov r0, #0 \n"
|
||||||
" msr basepri, r0 \n"
|
" msr basepri, r0 \n"
|
||||||
" ldmia sp!, {r3} \n"
|
" ldmia sp!, {r0, r3} \n"
|
||||||
" \n" /* Restore the context. */
|
" \n" /* Restore the context. */
|
||||||
" ldr r1, [r3] \n"
|
" ldr r1, [r3] \n"
|
||||||
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */
|
||||||
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
" add r1, r1, #4 \n" /* Move onto the second item in the TCB... */
|
||||||
|
" \n"
|
||||||
|
" dmb \n" /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" bic r3, #1 \n" /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Disable MPU. */
|
||||||
|
" \n"
|
||||||
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
" ldr r2, =0xe000ed9c \n" /* Region Base Address register. */
|
||||||
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */
|
" ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers from TCB. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
" stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */
|
||||||
|
" \n"
|
||||||
|
" ldr r2, =0xe000ed94 \n" /* MPU_CTRL register. */
|
||||||
|
" ldr r3, [r2] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
" orr r3, #1 \n" /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */
|
||||||
|
" str r3, [r2] \n" /* Enable MPU. */
|
||||||
|
" dsb \n" /* Force memory writes before continuing. */
|
||||||
|
" \n"
|
||||||
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
" ldmia r0!, {r3-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry. */
|
||||||
" msr control, r3 \n"
|
" msr control, r3 \n"
|
||||||
" \n"
|
" \n"
|
||||||
|
|
@ -525,181 +607,20 @@ uint32_t ulDummy;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
|
||||||
|
|
||||||
__attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
|
||||||
{
|
|
||||||
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL;
|
|
||||||
TickType_t xModifiableIdleTime;
|
|
||||||
|
|
||||||
/* Make sure the SysTick reload value does not overflow the counter. */
|
|
||||||
if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
|
|
||||||
{
|
|
||||||
xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
inevitably result in some tiny drift of the time maintained by the
|
|
||||||
kernel with respect to calendar time. */
|
|
||||||
portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE;
|
|
||||||
|
|
||||||
/* Calculate the reload value required to wait xExpectedIdleTime
|
|
||||||
tick periods. -1 is used because this code will execute part way
|
|
||||||
through one of the tick periods. */
|
|
||||||
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
|
||||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
|
||||||
{
|
|
||||||
ulReloadValue -= ulStoppedTimerCompensation;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
|
||||||
method as that will mask interrupts that should exit sleep mode. */
|
|
||||||
__asm volatile( "cpsid i" );
|
|
||||||
__asm volatile( "dsb" );
|
|
||||||
__asm volatile( "isb" );
|
|
||||||
|
|
||||||
/* If a context switch is pending or a task is waiting for the scheduler
|
|
||||||
to be unsuspended then abandon the low power entry. */
|
|
||||||
if( eTaskConfirmSleepModeStatus() == eAbortSleep )
|
|
||||||
{
|
|
||||||
/* Restart from whatever is left in the count register to complete
|
|
||||||
this tick period. */
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
|
||||||
|
|
||||||
/* Restart SysTick. */
|
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE;
|
|
||||||
|
|
||||||
/* Reset the reload register to the value required for normal tick
|
|
||||||
periods. */
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
|
||||||
above. */
|
|
||||||
__asm volatile( "cpsie i" );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Set the new reload value. */
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
|
|
||||||
|
|
||||||
/* Clear the SysTick count flag and set the count value back to
|
|
||||||
zero. */
|
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
|
||||||
|
|
||||||
/* Restart SysTick. */
|
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE;
|
|
||||||
|
|
||||||
/* Sleep until something happens. configPRE_SLEEP_PROCESSING() can
|
|
||||||
set its parameter to 0 to indicate that its implementation contains
|
|
||||||
its own wait for interrupt or wait for event instruction, and so wfi
|
|
||||||
should not be executed again. However, the original expected idle
|
|
||||||
time variable must remain unmodified, so a copy is taken. */
|
|
||||||
xModifiableIdleTime = xExpectedIdleTime;
|
|
||||||
configPRE_SLEEP_PROCESSING( &xModifiableIdleTime );
|
|
||||||
if( xModifiableIdleTime > 0 )
|
|
||||||
{
|
|
||||||
__asm volatile( "dsb" );
|
|
||||||
__asm volatile( "wfi" );
|
|
||||||
__asm volatile( "isb" );
|
|
||||||
}
|
|
||||||
configPOST_SLEEP_PROCESSING( &xExpectedIdleTime );
|
|
||||||
|
|
||||||
/* Stop SysTick. Again, 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 drift of the time maintained by the
|
|
||||||
kernel with respect to calendar time. */
|
|
||||||
ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG;
|
|
||||||
portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE );
|
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
|
||||||
above. */
|
|
||||||
__asm volatile( "cpsie i" );
|
|
||||||
|
|
||||||
if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG ) != 0 )
|
|
||||||
{
|
|
||||||
uint32_t ulCalculatedLoadValue;
|
|
||||||
|
|
||||||
/* The tick interrupt has already executed, and the SysTick
|
|
||||||
count reloaded with ulReloadValue. Reset the
|
|
||||||
portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
|
||||||
period. */
|
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
|
||||||
|
|
||||||
/* Don't allow a tiny value, or values that have somehow
|
|
||||||
underflowed because the post sleep hook did something
|
|
||||||
that took too long. */
|
|
||||||
if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
|
|
||||||
{
|
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
|
||||||
}
|
|
||||||
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
|
||||||
|
|
||||||
/* The tick interrupt handler will already have pended the tick
|
|
||||||
processing in the kernel. As the pending tick will be
|
|
||||||
processed as soon as this function exits, the tick value
|
|
||||||
maintained by the tick is stepped forward by one less than the
|
|
||||||
time spent waiting. */
|
|
||||||
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Something other than the tick interrupt ended the sleep.
|
|
||||||
Work out how long the sleep lasted rounded to complete tick
|
|
||||||
periods (not the ulReload value which accounted for part
|
|
||||||
ticks). */
|
|
||||||
ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
|
||||||
|
|
||||||
/* How many complete tick periods passed while the processor
|
|
||||||
was waiting? */
|
|
||||||
ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
|
|
||||||
|
|
||||||
/* The reload value is set to whatever fraction of a single tick
|
|
||||||
period remains. */
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
|
||||||
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
|
||||||
value. The critical section is used to ensure the tick interrupt
|
|
||||||
can only execute once in the case that the reload register is near
|
|
||||||
zero. */
|
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE;
|
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #if configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the systick timer to generate the tick interrupts at the required
|
* Setup the systick timer to generate the tick interrupts at the required
|
||||||
* frequency.
|
* frequency.
|
||||||
*/
|
*/
|
||||||
__attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
__attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
||||||
{
|
{
|
||||||
/* Calculate the constants required to configure the tick interrupt. */
|
/* Stop and clear the SysTick. */
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
portNVIC_SYSTICK_CTRL_REG = 0UL;
|
||||||
{
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
|
|
||||||
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
|
|
||||||
ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
|
|
||||||
}
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/* Configure SysTick to interrupt at the requested rate. */
|
/* Configure SysTick to interrupt at the requested rate. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
||||||
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE );
|
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* This is a naked function. */
|
/* This is a naked function. */
|
||||||
|
|
@ -719,12 +640,25 @@ static void vPortEnableVFP( void )
|
||||||
|
|
||||||
static void prvSetupMPU( void )
|
static void prvSetupMPU( void )
|
||||||
{
|
{
|
||||||
extern uint32_t __privileged_functions_end__[];
|
#if defined( __ARMCC_VERSION )
|
||||||
extern uint32_t __FLASH_segment_start__[];
|
/* Declaration when these variable are defined in code instead of being
|
||||||
extern uint32_t __FLASH_segment_end__[];
|
* exported from linker scripts. */
|
||||||
extern uint32_t __privileged_data_start__[];
|
extern uint32_t * __privileged_functions_end__;
|
||||||
extern uint32_t __privileged_data_end__[];
|
extern uint32_t * __FLASH_segment_start__;
|
||||||
|
extern uint32_t * __FLASH_segment_end__;
|
||||||
|
extern uint32_t * __privileged_data_start__;
|
||||||
|
extern uint32_t * __privileged_data_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __privileged_functions_end__[];
|
||||||
|
extern uint32_t __FLASH_segment_start__[];
|
||||||
|
extern uint32_t __FLASH_segment_end__[];
|
||||||
|
extern uint32_t __privileged_data_start__[];
|
||||||
|
extern uint32_t __privileged_data_end__[];
|
||||||
|
#endif
|
||||||
|
/* Check the expected MPU is present. */
|
||||||
|
if( ( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) || ( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE << 1 ))
|
||||||
|
{
|
||||||
/* First setup the entire flash for unprivileged read only access. */
|
/* First setup the entire flash for unprivileged read only access. */
|
||||||
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
||||||
( portMPU_REGION_VALID ) |
|
( portMPU_REGION_VALID ) |
|
||||||
|
|
@ -735,7 +669,7 @@ extern uint32_t __privileged_data_end__[];
|
||||||
( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) |
|
( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) |
|
||||||
( portMPU_REGION_ENABLE );
|
( portMPU_REGION_ENABLE );
|
||||||
|
|
||||||
/* Setup the first 16K for privileged only access (even though less
|
/* Setup the first nK for privileged only access (even though less
|
||||||
than 10K is actually being used). This is where the kernel code is
|
than 10K is actually being used). This is where the kernel code is
|
||||||
placed. */
|
placed. */
|
||||||
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */
|
||||||
|
|
@ -773,6 +707,7 @@ extern uint32_t __privileged_data_end__[];
|
||||||
|
|
||||||
/* Enable the MPU with the background region configured. */
|
/* Enable the MPU with the background region configured. */
|
||||||
portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE );
|
portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -800,30 +735,53 @@ uint32_t ulRegionSize, ulReturnValue = 4;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
BaseType_t xPortRaisePrivilege( void )
|
BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" mrs r0, control \n"
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n" /* Is the task running privileged? */
|
" tst r0, #1 \n" /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" itte ne \n"
|
" ite ne \n"
|
||||||
" movne r0, #0 \n" /* CONTROL[0]!=0, return false. */
|
" movne r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
" svcne %0 \n" /* Switch to privileged. */
|
" moveq r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
" moveq r0, #1 \n" /* CONTROL[0]==0, return true. */
|
" bx lr \n" /* Return. */
|
||||||
" bx lr \n"
|
" \n"
|
||||||
:: "i" (portSVC_RAISE_PRIVILEGE) : "r0"
|
" .align 4 \n"
|
||||||
|
::: "r0", "memory"
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
return 0;
|
void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
|
{
|
||||||
|
__asm volatile
|
||||||
|
(
|
||||||
|
" mrs r0, control \n" /* r0 = CONTROL. */
|
||||||
|
" orr r0, #1 \n" /* r0 = r0 | 1. */
|
||||||
|
" msr control, r0 \n" /* CONTROL = r0. */
|
||||||
|
" bx lr \n" /* Return to the caller. */
|
||||||
|
:::"r0", "memory"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
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 )
|
||||||
{
|
{
|
||||||
extern uint32_t __SRAM_segment_start__[];
|
#if defined( __ARMCC_VERSION )
|
||||||
extern uint32_t __SRAM_segment_end__[];
|
/* Declaration when these variable are defined in code instead of being
|
||||||
extern uint32_t __privileged_data_start__[];
|
* exported from linker scripts. */
|
||||||
extern uint32_t __privileged_data_end__[];
|
extern uint32_t * __SRAM_segment_start__;
|
||||||
|
extern uint32_t * __SRAM_segment_end__;
|
||||||
|
extern uint32_t * __privileged_data_start__;
|
||||||
|
extern uint32_t * __privileged_data_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __SRAM_segment_start__[];
|
||||||
|
extern uint32_t __SRAM_segment_end__[];
|
||||||
|
extern uint32_t __privileged_data_start__[];
|
||||||
|
extern uint32_t __privileged_data_end__[];
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t lIndex;
|
int32_t lIndex;
|
||||||
uint32_t ul;
|
uint32_t ul;
|
||||||
|
|
||||||
|
|
@ -922,7 +880,7 @@ uint32_t ul;
|
||||||
uint8_t ucCurrentPriority;
|
uint8_t ucCurrentPriority;
|
||||||
|
|
||||||
/* Obtain the number of the currently executing interrupt. */
|
/* Obtain the number of the currently executing interrupt. */
|
||||||
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
|
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" );
|
||||||
|
|
||||||
/* Is the interrupt number a user defined interrupt? */
|
/* Is the interrupt number a user defined interrupt? */
|
||||||
if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
|
if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Portion Copyright © 2020 STMicroelectronics International N.V. All rights reserved.
|
||||||
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -25,6 +26,7 @@
|
||||||
* 1 tab == 4 spaces!
|
* 1 tab == 4 spaces!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef PORTMACRO_H
|
#ifndef PORTMACRO_H
|
||||||
#define PORTMACRO_H
|
#define PORTMACRO_H
|
||||||
|
|
||||||
|
|
@ -72,12 +74,13 @@ typedef unsigned long UBaseType_t;
|
||||||
#define portUSING_MPU_WRAPPERS 1
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
|
||||||
#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL )
|
#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL )
|
||||||
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL )
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL )
|
||||||
#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL )
|
#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL )
|
||||||
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL )
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL )
|
||||||
#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL )
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL )
|
||||||
#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL )
|
#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x03UL << 16UL )
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL )
|
||||||
|
|
||||||
#define portUNPRIVILEGED_FLASH_REGION ( 0UL )
|
#define portUNPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
#define portPRIVILEGED_FLASH_REGION ( 1UL )
|
#define portPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
|
@ -89,7 +92,7 @@ typedef unsigned long UBaseType_t;
|
||||||
#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )
|
#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )
|
||||||
#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */
|
#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */
|
||||||
|
|
||||||
#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " :::"r0" )
|
#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " ::: "r0", "memory" )
|
||||||
|
|
||||||
typedef struct MPU_REGION_REGISTERS
|
typedef struct MPU_REGION_REGISTERS
|
||||||
{
|
{
|
||||||
|
|
@ -116,7 +119,7 @@ typedef struct MPU_SETTINGS
|
||||||
|
|
||||||
/* Scheduler utilities. */
|
/* Scheduler utilities. */
|
||||||
|
|
||||||
#define portYIELD() __asm volatile ( " SVC %0 \n" :: "i" (portSVC_YIELD) )
|
#define portYIELD() __asm volatile ( " SVC %0 \n" :: "i" (portSVC_YIELD) : "memory" )
|
||||||
#define portYIELD_WITHIN_API() \
|
#define portYIELD_WITHIN_API() \
|
||||||
{ \
|
{ \
|
||||||
/* Set a PendSV to request a context switch. */ \
|
/* Set a PendSV to request a context switch. */ \
|
||||||
|
|
@ -124,7 +127,7 @@ typedef struct MPU_SETTINGS
|
||||||
\
|
\
|
||||||
/* Barriers are normally not required but do ensure the code is completely \
|
/* Barriers are normally not required but do ensure the code is completely \
|
||||||
within the specified behaviour for the architecture. */ \
|
within the specified behaviour for the architecture. */ \
|
||||||
__asm volatile( "dsb" ); \
|
__asm volatile( "dsb" ::: "memory" ); \
|
||||||
__asm volatile( "isb" ); \
|
__asm volatile( "isb" ); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -165,7 +168,7 @@ not necessary for to use this port. They are defined so the common demo files
|
||||||
{
|
{
|
||||||
uint8_t ucReturn;
|
uint8_t ucReturn;
|
||||||
|
|
||||||
__asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) );
|
__asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" );
|
||||||
return ucReturn;
|
return ucReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -199,18 +202,28 @@ not necessary for to use this port. They are defined so the common demo files
|
||||||
#ifndef portFORCE_INLINE
|
#ifndef portFORCE_INLINE
|
||||||
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
||||||
#endif
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Set the privilege level to user mode if xRunningPrivileged is false. */
|
extern BaseType_t xIsPrivileged( void );
|
||||||
portFORCE_INLINE static void vPortResetPrivilege( BaseType_t xRunningPrivileged )
|
extern void vResetPrivilege( void );
|
||||||
{
|
|
||||||
if( xRunningPrivileged != pdTRUE )
|
/**
|
||||||
{
|
* @brief Checks whether or not the processor is privileged.
|
||||||
__asm volatile ( " mrs r0, control \n" \
|
*
|
||||||
" orr r0, #1 \n" \
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
" msr control, r0 \n" \
|
*/
|
||||||
:::"r0" );
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
}
|
|
||||||
}
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
||||||
|
|
@ -219,7 +232,7 @@ uint32_t ulCurrentInterrupt;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
/* Obtain the number of the currently executing interrupt. */
|
/* Obtain the number of the currently executing interrupt. */
|
||||||
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
|
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" );
|
||||||
|
|
||||||
if( ulCurrentInterrupt == 0 )
|
if( ulCurrentInterrupt == 0 )
|
||||||
{
|
{
|
||||||
|
|
@ -247,7 +260,7 @@ uint32_t ulNewBASEPRI;
|
||||||
" isb \n" \
|
" isb \n" \
|
||||||
" dsb \n" \
|
" dsb \n" \
|
||||||
" cpsie i \n" \
|
" cpsie i \n" \
|
||||||
:"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )
|
:"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -266,7 +279,7 @@ uint32_t ulOriginalBASEPRI, ulNewBASEPRI;
|
||||||
" isb \n" \
|
" isb \n" \
|
||||||
" dsb \n" \
|
" dsb \n" \
|
||||||
" cpsie i \n" \
|
" cpsie i \n" \
|
||||||
:"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )
|
:"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
/* This return will not be reached but is necessary to prevent compiler
|
/* This return will not be reached but is necessary to prevent compiler
|
||||||
|
|
@ -279,12 +292,18 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" msr basepri, %0 " :: "r" ( ulNewMaskValue )
|
" msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
|
#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY
|
||||||
|
#warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.freertos.org/FreeRTOS-V10.3.x.html"
|
||||||
|
#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -36,20 +36,16 @@
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
#ifndef configSYSTICK_CLOCK_HZ
|
|
||||||
#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Constants required to manipulate the NVIC. */
|
/* Constants required to manipulate the NVIC. */
|
||||||
/* Constants required to manipulate the NVIC. */
|
#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) )
|
||||||
#define portNVIC_SYSTICK_CTRL ( * ( ( volatile uint32_t * ) 0xe000e010 ) )
|
#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) )
|
||||||
#define portNVIC_SYSTICK_LOAD ( * ( ( volatile uint32_t * ) 0xe000e014 ) )
|
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) )
|
||||||
#define portNVIC_SYSTICK_CURRENT_VALUE ( * ( ( volatile uint32_t * ) 0xe000e018 ) )
|
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
#define portNVIC_SYSPRI2 ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
|
#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t *) 0xe000ed20 ) )
|
||||||
#define portNVIC_SYSTICK_CLK 0x00000004
|
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
||||||
#define portNVIC_SYSTICK_INT 0x00000002
|
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
||||||
#define portNVIC_SYSTICK_ENABLE 0x00000001
|
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
||||||
#define portNVIC_SYSTICK_COUNT_FLAG ( 1UL << 16UL )
|
#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL )
|
||||||
#define portMIN_INTERRUPT_PRIORITY ( 255UL )
|
#define portMIN_INTERRUPT_PRIORITY ( 255UL )
|
||||||
#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL )
|
#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL )
|
||||||
#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL )
|
#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL )
|
||||||
|
|
@ -64,22 +60,44 @@ FreeRTOS.org versions prior to V4.3.0 did not include this definition. */
|
||||||
#define configKERNEL_INTERRUPT_PRIORITY 0
|
#define configKERNEL_INTERRUPT_PRIORITY 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Each task maintains its own interrupt status in the critical nesting
|
||||||
|
variable. */
|
||||||
|
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
|
|
||||||
/* The systick is a 24-bit counter. */
|
/* The systick is a 24-bit counter. */
|
||||||
#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 )
|
#ifndef portMISSED_COUNTS_FACTOR
|
||||||
|
#define portMISSED_COUNTS_FACTOR ( 45UL )
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
/* The number of SysTick increments that make up one tick period. */
|
||||||
variable. */
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
static uint32_t ulTimerCountsForOneTick = 0;
|
||||||
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
|
/* The maximum number of tick periods that can be suppressed is limited by the
|
||||||
|
24 bit resolution of the SysTick timer. */
|
||||||
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
|
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
||||||
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
|
/* Compensate for the CPU cycles that pass while the SysTick is stopped (low
|
||||||
|
power functionality only. */
|
||||||
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
|
static uint32_t ulStoppedTimerCompensation = 0;
|
||||||
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the timer to generate the tick interrupts.
|
* Setup the timer to generate the tick interrupts. The implementation in this
|
||||||
|
* file is weak to allow application writers to change the timer used to
|
||||||
|
* generate the tick interrupt.
|
||||||
*/
|
*/
|
||||||
static void prvSetupTimerInterrupt( void );
|
#pragma weak vPortSetupTimerInterrupt
|
||||||
|
void vPortSetupTimerInterrupt( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exception handlers.
|
* Exception handlers.
|
||||||
|
|
@ -98,29 +116,6 @@ static void prvTaskExitError( void );
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
|
||||||
* The number of SysTick increments that make up one tick period.
|
|
||||||
*/
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
|
||||||
static unsigned long ulTimerCountsForOneTick = 0;
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The maximum number of tick periods that can be suppressed is limited by the
|
|
||||||
* 24 bit resolution of the SysTick timer.
|
|
||||||
*/
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
|
||||||
static unsigned long xMaximumPossibleSuppressedTicks = 0;
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compensate for the CPU cycles that pass while the SysTick is stopped (low
|
|
||||||
* power functionality only.
|
|
||||||
*/
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
|
||||||
static unsigned long ulStoppedTimerCompensation = 0;
|
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See header file for description.
|
* See header file for description.
|
||||||
*/
|
*/
|
||||||
|
|
@ -162,12 +157,12 @@ static void prvTaskExitError( void )
|
||||||
BaseType_t xPortStartScheduler( void )
|
BaseType_t xPortStartScheduler( void )
|
||||||
{
|
{
|
||||||
/* Make PendSV and SysTick the lowest priority interrupts. */
|
/* Make PendSV and SysTick the lowest priority interrupts. */
|
||||||
portNVIC_SYSPRI2 |= portNVIC_PENDSV_PRI;
|
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
||||||
portNVIC_SYSPRI2 |= portNVIC_SYSTICK_PRI;
|
portNVIC_SYSPRI2_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. */
|
||||||
prvSetupTimerInterrupt();
|
vPortSetupTimerInterrupt();
|
||||||
|
|
||||||
/* Initialise the critical nesting count ready for the first task. */
|
/* Initialise the critical nesting count ready for the first task. */
|
||||||
uxCriticalNesting = 0;
|
uxCriticalNesting = 0;
|
||||||
|
|
@ -191,7 +186,7 @@ void vPortEndScheduler( void )
|
||||||
void vPortYield( void )
|
void vPortYield( void )
|
||||||
{
|
{
|
||||||
/* Set a PendSV to request a context switch. */
|
/* Set a PendSV to request a context switch. */
|
||||||
*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
|
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET;
|
||||||
|
|
||||||
/* Barriers are normally not required but do ensure the code is completely
|
/* Barriers are normally not required but do ensure the code is completely
|
||||||
within the specified behaviour for the architecture. */
|
within the specified behaviour for the architecture. */
|
||||||
|
|
@ -230,187 +225,200 @@ uint32_t ulPreviousMask;
|
||||||
if( xTaskIncrementTick() != pdFALSE )
|
if( xTaskIncrementTick() != pdFALSE )
|
||||||
{
|
{
|
||||||
/* Pend a context switch. */
|
/* Pend a context switch. */
|
||||||
*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
|
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
|
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
|
||||||
|
|
||||||
__weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
|
||||||
{
|
|
||||||
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickCTRL;
|
|
||||||
TickType_t xModifiableIdleTime;
|
|
||||||
|
|
||||||
/* Make sure the SysTick reload value does not overflow the counter. */
|
|
||||||
if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
|
|
||||||
{
|
|
||||||
xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
inevitably result in some tiny drift of the time maintained by the
|
|
||||||
kernel with respect to calendar time. */
|
|
||||||
portNVIC_SYSTICK_CTRL &= ~portNVIC_SYSTICK_ENABLE;
|
|
||||||
|
|
||||||
/* Calculate the reload value required to wait xExpectedIdleTime
|
|
||||||
tick periods. -1 is used because this code will execute part way
|
|
||||||
through one of the tick periods. */
|
|
||||||
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
|
||||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
|
||||||
{
|
|
||||||
ulReloadValue -= ulStoppedTimerCompensation;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
|
||||||
method as that will mask interrupts that should exit sleep mode. */
|
|
||||||
__disable_interrupt();
|
|
||||||
|
|
||||||
/* If a context switch is pending or a task is waiting for the scheduler
|
|
||||||
to be unsuspended then abandon the low power entry. */
|
|
||||||
if( eTaskConfirmSleepModeStatus() == eAbortSleep )
|
|
||||||
{
|
|
||||||
/* Restart from whatever is left in the count register to complete
|
|
||||||
this tick period. */
|
|
||||||
portNVIC_SYSTICK_LOAD = portNVIC_SYSTICK_CURRENT_VALUE;
|
|
||||||
|
|
||||||
/* Restart SysTick. */
|
|
||||||
portNVIC_SYSTICK_CTRL |= portNVIC_SYSTICK_ENABLE;
|
|
||||||
|
|
||||||
/* Reset the reload register to the value required for normal tick
|
|
||||||
periods. */
|
|
||||||
portNVIC_SYSTICK_LOAD = ulTimerCountsForOneTick - 1UL;
|
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above __disable_interrupt()
|
|
||||||
call above. */
|
|
||||||
__enable_interrupt();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Set the new reload value. */
|
|
||||||
portNVIC_SYSTICK_LOAD = ulReloadValue;
|
|
||||||
|
|
||||||
/* Clear the SysTick count flag and set the count value back to
|
|
||||||
zero. */
|
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE = 0UL;
|
|
||||||
|
|
||||||
/* Restart SysTick. */
|
|
||||||
portNVIC_SYSTICK_CTRL |= portNVIC_SYSTICK_ENABLE;
|
|
||||||
|
|
||||||
/* Sleep until something happens. configPRE_SLEEP_PROCESSING() can
|
|
||||||
set its parameter to 0 to indicate that its implementation contains
|
|
||||||
its own wait for interrupt or wait for event instruction, and so wfi
|
|
||||||
should not be executed again. However, the original expected idle
|
|
||||||
time variable must remain unmodified, so a copy is taken. */
|
|
||||||
xModifiableIdleTime = xExpectedIdleTime;
|
|
||||||
configPRE_SLEEP_PROCESSING( &xModifiableIdleTime );
|
|
||||||
if( xModifiableIdleTime > 0 )
|
|
||||||
{
|
|
||||||
__DSB();
|
|
||||||
__WFI();
|
|
||||||
__ISB();
|
|
||||||
}
|
|
||||||
configPOST_SLEEP_PROCESSING( &xExpectedIdleTime );
|
|
||||||
|
|
||||||
/* Stop SysTick. Again, 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 drift of the time maintained by the
|
|
||||||
kernel with respect to calendar time. */
|
|
||||||
ulSysTickCTRL = portNVIC_SYSTICK_CTRL;
|
|
||||||
portNVIC_SYSTICK_CTRL = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE );
|
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above __disable_interrupt()
|
|
||||||
call above. */
|
|
||||||
__enable_interrupt();
|
|
||||||
|
|
||||||
if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG ) != 0 )
|
|
||||||
{
|
|
||||||
uint32_t ulCalculatedLoadValue;
|
|
||||||
|
|
||||||
/* The tick interrupt has already executed, and the SysTick
|
|
||||||
count reloaded with ulReloadValue. Reset the
|
|
||||||
portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
|
||||||
period. */
|
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE );
|
|
||||||
|
|
||||||
/* Don't allow a tiny value, or values that have somehow
|
|
||||||
underflowed because the post sleep hook did something
|
|
||||||
that took too long. */
|
|
||||||
if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
|
|
||||||
{
|
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
|
||||||
}
|
|
||||||
|
|
||||||
portNVIC_SYSTICK_LOAD = ulCalculatedLoadValue;
|
|
||||||
|
|
||||||
/* The tick interrupt handler will already have pended the tick
|
|
||||||
processing in the kernel. As the pending tick will be
|
|
||||||
processed as soon as this function exits, the tick value
|
|
||||||
maintained by the tick is stepped forward by one less than the
|
|
||||||
time spent waiting. */
|
|
||||||
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Something other than the tick interrupt ended the sleep.
|
|
||||||
Work out how long the sleep lasted rounded to complete tick
|
|
||||||
periods (not the ulReload value which accounted for part
|
|
||||||
ticks). */
|
|
||||||
ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE;
|
|
||||||
|
|
||||||
/* How many complete tick periods passed while the processor
|
|
||||||
was waiting? */
|
|
||||||
ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
|
|
||||||
|
|
||||||
/* The reload value is set to whatever fraction of a single tick
|
|
||||||
period remains. */
|
|
||||||
portNVIC_SYSTICK_LOAD = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
|
||||||
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
|
||||||
value. The critical section is used to ensure the tick interrupt
|
|
||||||
can only execute once in the case that the reload register is near
|
|
||||||
zero. */
|
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE = 0UL;
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
portNVIC_SYSTICK_CTRL |= portNVIC_SYSTICK_ENABLE;
|
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
|
||||||
portNVIC_SYSTICK_LOAD = ulTimerCountsForOneTick - 1UL;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* #if configUSE_TICKLESS_IDLE */
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the systick timer to generate the tick interrupts at the required
|
* Setup the systick timer to generate the tick interrupts at the required
|
||||||
* frequency.
|
* frequency.
|
||||||
*/
|
*/
|
||||||
static void prvSetupTimerInterrupt( void )
|
void vPortSetupTimerInterrupt( void )
|
||||||
{
|
{
|
||||||
/* Calculate the constants required to configure the tick interrupt. */
|
/* Calculate the constants required to configure the tick interrupt. */
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
{
|
{
|
||||||
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
|
ulTimerCountsForOneTick = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ );
|
||||||
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
|
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
|
||||||
ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
|
ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR;
|
||||||
}
|
}
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
/* Stop and reset the SysTick. */
|
/* Stop and reset the SysTick. */
|
||||||
portNVIC_SYSTICK_CTRL = 0UL;
|
portNVIC_SYSTICK_CTRL_REG = 0UL;
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE = 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 = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
||||||
portNVIC_SYSTICK_CTRL = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;
|
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
|
|
||||||
|
__weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
||||||
|
{
|
||||||
|
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements;
|
||||||
|
TickType_t xModifiableIdleTime;
|
||||||
|
|
||||||
|
/* Make sure the SysTick reload value does not overflow the counter. */
|
||||||
|
if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
|
||||||
|
{
|
||||||
|
xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
inevitably result in some tiny drift of the time maintained by the
|
||||||
|
kernel with respect to calendar time. */
|
||||||
|
portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
|
/* Calculate the reload value required to wait xExpectedIdleTime
|
||||||
|
tick periods. -1 is used because this code will execute part way
|
||||||
|
through one of the tick periods. */
|
||||||
|
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
||||||
|
if( ulReloadValue > ulStoppedTimerCompensation )
|
||||||
|
{
|
||||||
|
ulReloadValue -= ulStoppedTimerCompensation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
||||||
|
method as that will mask interrupts that should exit sleep mode. */
|
||||||
|
__disable_interrupt();
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
/* If a context switch is pending or a task is waiting for the scheduler
|
||||||
|
to be unsuspended then abandon the low power entry. */
|
||||||
|
if( eTaskConfirmSleepModeStatus() == eAbortSleep )
|
||||||
|
{
|
||||||
|
/* Restart from whatever is left in the count register to complete
|
||||||
|
this tick period. */
|
||||||
|
portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
|
||||||
|
|
||||||
|
/* Restart SysTick. */
|
||||||
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
|
/* Reset the reload register to the value required for normal tick
|
||||||
|
periods. */
|
||||||
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
|
/* Re-enable interrupts - see comments above __disable_interrupt()
|
||||||
|
call above. */
|
||||||
|
__enable_interrupt();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Set the new reload value. */
|
||||||
|
portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
|
||||||
|
|
||||||
|
/* Clear the SysTick count flag and set the count value back to
|
||||||
|
zero. */
|
||||||
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
|
||||||
|
/* Restart SysTick. */
|
||||||
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
|
||||||
|
/* Sleep until something happens. configPRE_SLEEP_PROCESSING() can
|
||||||
|
set its parameter to 0 to indicate that its implementation contains
|
||||||
|
its own wait for interrupt or wait for event instruction, and so wfi
|
||||||
|
should not be executed again. However, the original expected idle
|
||||||
|
time variable must remain unmodified, so a copy is taken. */
|
||||||
|
xModifiableIdleTime = xExpectedIdleTime;
|
||||||
|
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||||
|
if( xModifiableIdleTime > 0 )
|
||||||
|
{
|
||||||
|
__DSB();
|
||||||
|
__WFI();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
|
out of sleep mode to execute immediately. see comments above
|
||||||
|
__disable_interrupt() call above. */
|
||||||
|
__enable_interrupt();
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
/* Disable interrupts again because the clock is about to be stopped
|
||||||
|
and interrupts that execute while the clock is stopped will increase
|
||||||
|
any slippage between the time maintained by the RTOS and calendar
|
||||||
|
time. */
|
||||||
|
__disable_interrupt();
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
/* Disable the SysTick clock without reading the
|
||||||
|
portNVIC_SYSTICK_CTRL_REG register to ensure the
|
||||||
|
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
|
||||||
|
be, but using the tickless mode will inevitably result in some tiny
|
||||||
|
drift of the time maintained by the kernel with respect to calendar
|
||||||
|
time*/
|
||||||
|
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );
|
||||||
|
|
||||||
|
/* Determine if the SysTick clock has already counted to zero and
|
||||||
|
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
|
||||||
|
to count to zero (in which case an interrupt other than the SysTick
|
||||||
|
must have brought the system out of sleep mode). */
|
||||||
|
if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
||||||
|
{
|
||||||
|
uint32_t ulCalculatedLoadValue;
|
||||||
|
|
||||||
|
/* The tick interrupt is already pending, and the SysTick count
|
||||||
|
reloaded with ulReloadValue. Reset the
|
||||||
|
portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
||||||
|
period. */
|
||||||
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
||||||
|
|
||||||
|
/* Don't allow a tiny value, or values that have somehow
|
||||||
|
underflowed because the post sleep hook did something
|
||||||
|
that took too long. */
|
||||||
|
if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
|
||||||
|
{
|
||||||
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );
|
||||||
|
}
|
||||||
|
|
||||||
|
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
||||||
|
|
||||||
|
/* As the pending tick will be processed as soon as this
|
||||||
|
function exits, the tick value maintained by the tick is stepped
|
||||||
|
forward by one less than the time spent waiting. */
|
||||||
|
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Something other than the tick interrupt ended the sleep.
|
||||||
|
Work out how long the sleep lasted rounded to complete tick
|
||||||
|
periods (not the ulReload value which accounted for part
|
||||||
|
ticks). */
|
||||||
|
ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG ;
|
||||||
|
|
||||||
|
/* How many complete tick periods passed while the processor
|
||||||
|
was waiting? */
|
||||||
|
ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;
|
||||||
|
|
||||||
|
/* The reload value is set to whatever fraction of a single tick
|
||||||
|
period remains. */
|
||||||
|
portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
||||||
|
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
||||||
|
value. */
|
||||||
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
|
/* Exit with interrpts enabled. */
|
||||||
|
__enable_interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS Kernel V10.0.1
|
* FreeRTOS Kernel V10.3.1
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
@ -109,6 +109,7 @@ extern void vClearInterruptMaskFromISR( uint32_t ulMask );
|
||||||
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
||||||
#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 )
|
||||||
|
|
|
||||||
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/port.c
vendored
Normal file
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/port.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
113
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/portasm.h
vendored
Normal file
113
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/portasm.h
vendored
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* 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 __PORT_ASM_H__
|
||||||
|
#define __PORT_ASM_H__
|
||||||
|
|
||||||
|
/* Scheduler includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
|
/* MPU wrappers includes. */
|
||||||
|
#include "mpu_wrappers.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restore the context of the first task so that the first task starts
|
||||||
|
* executing.
|
||||||
|
*/
|
||||||
|
void vRestoreContextOfFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raises the privilege level by clearing the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* @note This is a privileged function and should only be called from the kenrel
|
||||||
|
* code.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vRaisePrivilege( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the first task.
|
||||||
|
*/
|
||||||
|
void vStartFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables interrupts.
|
||||||
|
*/
|
||||||
|
uint32_t ulSetInterruptMask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables interrupts.
|
||||||
|
*/
|
||||||
|
void vClearInterruptMask( uint32_t ulMask ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PendSV Exception handler.
|
||||||
|
*/
|
||||||
|
void PendSV_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC Handler.
|
||||||
|
*/
|
||||||
|
void SVC_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a Secure context for the calling task.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the stack to be allocated on the
|
||||||
|
* secure side for the calling task.
|
||||||
|
*/
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free the task's secure context.
|
||||||
|
*
|
||||||
|
* @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
|
||||||
|
*/
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
#endif /* __PORT_ASM_H__ */
|
||||||
377
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/portasm.s
vendored
Normal file
377
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/portasm.s
vendored
Normal file
|
|
@ -0,0 +1,377 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
EXTERN pxCurrentTCB
|
||||||
|
EXTERN xSecureContext
|
||||||
|
EXTERN vTaskSwitchContext
|
||||||
|
EXTERN vPortSVCHandler_C
|
||||||
|
EXTERN SecureContext_SaveContext
|
||||||
|
EXTERN SecureContext_LoadContext
|
||||||
|
|
||||||
|
PUBLIC xIsPrivileged
|
||||||
|
PUBLIC vResetPrivilege
|
||||||
|
PUBLIC vPortAllocateSecureContext
|
||||||
|
PUBLIC vRestoreContextOfFirstTask
|
||||||
|
PUBLIC vRaisePrivilege
|
||||||
|
PUBLIC vStartFirstTask
|
||||||
|
PUBLIC ulSetInterruptMask
|
||||||
|
PUBLIC vClearInterruptMask
|
||||||
|
PUBLIC PendSV_Handler
|
||||||
|
PUBLIC SVC_Handler
|
||||||
|
PUBLIC vPortFreeSecureContext
|
||||||
|
|
||||||
|
#if ( configENABLE_FPU == 1 )
|
||||||
|
#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*---------------- Unprivileged Functions -------------------*/
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SECTION .text:CODE:NOROOT(2)
|
||||||
|
THUMB
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
xIsPrivileged:
|
||||||
|
mrs r0, control /* r0 = CONTROL. */
|
||||||
|
movs r1, #1 /* r1 = 1. */
|
||||||
|
tst r0, r1 /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
beq running_privileged /* If the result of previous AND operation was 0, branch. */
|
||||||
|
movs r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
|
bx lr /* Return. */
|
||||||
|
running_privileged:
|
||||||
|
movs r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
|
bx lr /* Return. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vResetPrivilege:
|
||||||
|
mrs r0, control /* r0 = CONTROL. */
|
||||||
|
movs r1, #1 /* r1 = 1. */
|
||||||
|
orrs r0, r1 /* r0 = r0 | r1. */
|
||||||
|
msr control, r0 /* CONTROL = r0. */
|
||||||
|
bx lr /* Return to the caller. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vPortAllocateSecureContext:
|
||||||
|
svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */
|
||||||
|
bx lr /* Return. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*----------------- Privileged Functions --------------------*/
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SECTION privileged_functions:CODE:NOROOT(2)
|
||||||
|
THUMB
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vRestoreContextOfFirstTask:
|
||||||
|
ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
ldr r3, [r2] /* Read pxCurrentTCB. */
|
||||||
|
ldr r0, [r3] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
dmb /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r4, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r5, #1 /* r5 = 1. */
|
||||||
|
bics r4, r5 /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */
|
||||||
|
str r4, [r2] /* Disable MPU. */
|
||||||
|
|
||||||
|
adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
|
||||||
|
ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */
|
||||||
|
ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
str r4, [r2] /* Program MAIR0. */
|
||||||
|
ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
|
||||||
|
movs r5, #4 /* r5 = 4. */
|
||||||
|
str r5, [r2] /* Program RNR = 4. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write first set of RBAR/RLAR registers. */
|
||||||
|
movs r5, #5 /* r5 = 5. */
|
||||||
|
str r5, [r2] /* Program RNR = 5. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write second set of RBAR/RLAR registers. */
|
||||||
|
movs r5, #6 /* r5 = 6. */
|
||||||
|
str r5, [r2] /* Program RNR = 6. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write third set of RBAR/RLAR registers. */
|
||||||
|
movs r5, #7 /* r5 = 7. */
|
||||||
|
str r5, [r2] /* Program RNR = 7. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r4, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r5, #1 /* r5 = 1. */
|
||||||
|
orrs r4, r5 /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */
|
||||||
|
str r4, [r2] /* Enable MPU. */
|
||||||
|
dsb /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
ldm r0!, {r1-r4} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */
|
||||||
|
ldr r5, =xSecureContext
|
||||||
|
str r1, [r5] /* Set xSecureContext to this task's value for the same. */
|
||||||
|
msr psplim, r2 /* Set this task's PSPLIM value. */
|
||||||
|
msr control, r3 /* Set this task's CONTROL value. */
|
||||||
|
adds r0, #32 /* Discard everything up to r0. */
|
||||||
|
msr psp, r0 /* This is now the new top of stack to use in the task. */
|
||||||
|
isb
|
||||||
|
bx r4 /* Finally, branch to EXC_RETURN. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
ldm r0!, {r1-r3} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
|
ldr r4, =xSecureContext
|
||||||
|
str r1, [r4] /* Set xSecureContext to this task's value for the same. */
|
||||||
|
msr psplim, r2 /* Set this task's PSPLIM value. */
|
||||||
|
movs r1, #2 /* r1 = 2. */
|
||||||
|
msr CONTROL, r1 /* Switch to use PSP in the thread mode. */
|
||||||
|
adds r0, #32 /* Discard everything up to r0. */
|
||||||
|
msr psp, r0 /* This is now the new top of stack to use in the task. */
|
||||||
|
isb
|
||||||
|
bx r3 /* Finally, branch to EXC_RETURN. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vRaisePrivilege:
|
||||||
|
mrs r0, control /* Read the CONTROL register. */
|
||||||
|
movs r1, #1 /* r1 = 1. */
|
||||||
|
bics r0, r1 /* Clear the bit 0. */
|
||||||
|
msr control, r0 /* Write back the new CONTROL value. */
|
||||||
|
bx lr /* Return to the caller. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vStartFirstTask:
|
||||||
|
ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */
|
||||||
|
ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */
|
||||||
|
ldr r0, [r0] /* The first entry in vector table is stack pointer. */
|
||||||
|
msr msp, r0 /* Set the MSP back to the start of the stack. */
|
||||||
|
cpsie i /* Globally enable interrupts. */
|
||||||
|
dsb
|
||||||
|
isb
|
||||||
|
svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
ulSetInterruptMask:
|
||||||
|
mrs r0, PRIMASK
|
||||||
|
cpsid i
|
||||||
|
bx lr
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vClearInterruptMask:
|
||||||
|
msr PRIMASK, r0
|
||||||
|
bx lr
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
PendSV_Handler:
|
||||||
|
mrs r1, psp /* Read PSP in r1. */
|
||||||
|
ldr r2, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
ldr r0, [r2] /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */
|
||||||
|
|
||||||
|
cbz r0, save_ns_context /* No secure context to save. */
|
||||||
|
push {r0-r2, r14}
|
||||||
|
bl SecureContext_SaveContext
|
||||||
|
pop {r0-r3} /* LR is now in r3. */
|
||||||
|
mov lr, r3 /* LR = r3. */
|
||||||
|
lsls r2, r3, #25 /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
bpl save_ns_context /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
ldr r2, [r3] /* Read pxCurrentTCB. */
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
subs r1, r1, #16 /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
str r1, [r2] /* Save the new top of stack in TCB. */
|
||||||
|
mrs r2, psplim /* r2 = PSPLIM. */
|
||||||
|
mrs r3, control /* r3 = CONTROL. */
|
||||||
|
mov r4, lr /* r4 = LR/EXC_RETURN. */
|
||||||
|
stmia r1!, {r0, r2-r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
subs r1, r1, #12 /* Make space for xSecureContext, PSPLIM and LR on the stack. */
|
||||||
|
str r1, [r2] /* Save the new top of stack in TCB. */
|
||||||
|
mrs r2, psplim /* r2 = PSPLIM. */
|
||||||
|
mov r3, lr /* r3 = LR/EXC_RETURN. */
|
||||||
|
stmia r1!, {r0, r2-r3} /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
b select_next_task
|
||||||
|
|
||||||
|
save_ns_context:
|
||||||
|
ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
ldr r2, [r3] /* Read pxCurrentTCB. */
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
subs r1, r1, #48 /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */
|
||||||
|
str r1, [r2] /* Save the new top of stack in TCB. */
|
||||||
|
adds r1, r1, #16 /* r1 = r1 + 16. */
|
||||||
|
stmia r1!, {r4-r7} /* Store the low registers that are not saved automatically. */
|
||||||
|
mov r4, r8 /* r4 = r8. */
|
||||||
|
mov r5, r9 /* r5 = r9. */
|
||||||
|
mov r6, r10 /* r6 = r10. */
|
||||||
|
mov r7, r11 /* r7 = r11. */
|
||||||
|
stmia r1!, {r4-r7} /* Store the high registers that are not saved automatically. */
|
||||||
|
mrs r2, psplim /* r2 = PSPLIM. */
|
||||||
|
mrs r3, control /* r3 = CONTROL. */
|
||||||
|
mov r4, lr /* r4 = LR/EXC_RETURN. */
|
||||||
|
subs r1, r1, #48 /* r1 = r1 - 48. */
|
||||||
|
stmia r1!, {r0, r2-r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
subs r1, r1, #44 /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */
|
||||||
|
str r1, [r2] /* Save the new top of stack in TCB. */
|
||||||
|
mrs r2, psplim /* r2 = PSPLIM. */
|
||||||
|
mov r3, lr /* r3 = LR/EXC_RETURN. */
|
||||||
|
stmia r1!, {r0, r2-r7} /* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */
|
||||||
|
mov r4, r8 /* r4 = r8. */
|
||||||
|
mov r5, r9 /* r5 = r9. */
|
||||||
|
mov r6, r10 /* r6 = r10. */
|
||||||
|
mov r7, r11 /* r7 = r11. */
|
||||||
|
stmia r1!, {r4-r7} /* Store the high registers that are not saved automatically. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
select_next_task:
|
||||||
|
cpsid i
|
||||||
|
bl vTaskSwitchContext
|
||||||
|
cpsie i
|
||||||
|
|
||||||
|
ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
ldr r3, [r2] /* Read pxCurrentTCB. */
|
||||||
|
ldr r1, [r3] /* The first item in pxCurrentTCB is the task top of stack. r1 now points to the top of stack. */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
dmb /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r4, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r5, #1 /* r5 = 1. */
|
||||||
|
bics r4, r5 /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */
|
||||||
|
str r4, [r2] /* Disable MPU. */
|
||||||
|
|
||||||
|
adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */
|
||||||
|
ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */
|
||||||
|
ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
str r4, [r2] /* Program MAIR0. */
|
||||||
|
ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */
|
||||||
|
movs r5, #4 /* r5 = 4. */
|
||||||
|
str r5, [r2] /* Program RNR = 4. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write first set of RBAR/RLAR registers. */
|
||||||
|
movs r5, #5 /* r5 = 5. */
|
||||||
|
str r5, [r2] /* Program RNR = 5. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write second set of RBAR/RLAR registers. */
|
||||||
|
movs r5, #6 /* r5 = 6. */
|
||||||
|
str r5, [r2] /* Program RNR = 6. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write third set of RBAR/RLAR registers. */
|
||||||
|
movs r5, #7 /* r5 = 7. */
|
||||||
|
str r5, [r2] /* Program RNR = 7. */
|
||||||
|
ldmia r3!, {r6,r7} /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r4!, {r6,r7} /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r4, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r5, #1 /* r5 = 1. */
|
||||||
|
orrs r4, r5 /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */
|
||||||
|
str r4, [r2] /* Enable MPU. */
|
||||||
|
dsb /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
ldmia r1!, {r0, r2-r4} /* Read from stack - r0 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = LR. */
|
||||||
|
msr psplim, r2 /* Restore the PSPLIM register value for the task. */
|
||||||
|
msr control, r3 /* Restore the CONTROL register value for the task. */
|
||||||
|
mov lr, r4 /* LR = r4. */
|
||||||
|
ldr r2, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
str r0, [r2] /* Restore the task's xSecureContext. */
|
||||||
|
cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */
|
||||||
|
push {r1,r4}
|
||||||
|
bl SecureContext_LoadContext /* Restore the secure context. */
|
||||||
|
pop {r1,r4}
|
||||||
|
mov lr, r4 /* LR = r4. */
|
||||||
|
lsls r2, r4, #25 /* r2 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
bpl restore_ns_context /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
msr psp, r1 /* Remember the new top of stack for the task. */
|
||||||
|
bx lr
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
ldmia r1!, {r0, r2-r3} /* Read from stack - r0 = xSecureContext, r2 = PSPLIM and r3 = LR. */
|
||||||
|
msr psplim, r2 /* Restore the PSPLIM register value for the task. */
|
||||||
|
mov lr, r3 /* LR = r3. */
|
||||||
|
ldr r2, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
str r0, [r2] /* Restore the task's xSecureContext. */
|
||||||
|
cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */
|
||||||
|
push {r1,r3}
|
||||||
|
bl SecureContext_LoadContext /* Restore the secure context. */
|
||||||
|
pop {r1,r3}
|
||||||
|
mov lr, r3 /* LR = r3. */
|
||||||
|
lsls r2, r3, #25 /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */
|
||||||
|
bpl restore_ns_context /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */
|
||||||
|
msr psp, r1 /* Remember the new top of stack for the task. */
|
||||||
|
bx lr
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
restore_ns_context:
|
||||||
|
adds r1, r1, #16 /* Move to the high registers. */
|
||||||
|
ldmia r1!, {r4-r7} /* Restore the high registers that are not automatically restored. */
|
||||||
|
mov r8, r4 /* r8 = r4. */
|
||||||
|
mov r9, r5 /* r9 = r5. */
|
||||||
|
mov r10, r6 /* r10 = r6. */
|
||||||
|
mov r11, r7 /* r11 = r7. */
|
||||||
|
msr psp, r1 /* Remember the new top of stack for the task. */
|
||||||
|
subs r1, r1, #32 /* Go back to the low registers. */
|
||||||
|
ldmia r1!, {r4-r7} /* Restore the low registers that are not automatically restored. */
|
||||||
|
bx lr
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SVC_Handler:
|
||||||
|
movs r0, #4
|
||||||
|
mov r1, lr
|
||||||
|
tst r0, r1
|
||||||
|
beq stacking_used_msp
|
||||||
|
mrs r0, psp
|
||||||
|
b vPortSVCHandler_C
|
||||||
|
stacking_used_msp:
|
||||||
|
mrs r0, msp
|
||||||
|
b vPortSVCHandler_C
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vPortFreeSecureContext:
|
||||||
|
ldr r1, [r0] /* The first item in the TCB is the top of the stack. */
|
||||||
|
ldr r0, [r1] /* The first item on the stack is the task's xSecureContext. */
|
||||||
|
cmp r0, #0 /* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
beq free_secure_context
|
||||||
|
bx lr /* There is no secure context (xSecureContext is NULL). */
|
||||||
|
free_secure_context:
|
||||||
|
svc 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */
|
||||||
|
bx lr /* Return. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
END
|
||||||
317
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/portmacro.h
vendored
Normal file
317
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/non_secure/portmacro.h
vendored
Normal file
|
|
@ -0,0 +1,317 @@
|
||||||
|
/*
|
||||||
|
* 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 PORTMACRO_H
|
||||||
|
#define PORTMACRO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Port specific definitions.
|
||||||
|
*
|
||||||
|
* The settings in this file configure FreeRTOS correctly for the given hardware
|
||||||
|
* and compiler.
|
||||||
|
*
|
||||||
|
* These settings should not be altered.
|
||||||
|
*------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef configENABLE_FPU
|
||||||
|
#error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU.
|
||||||
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_MPU
|
||||||
|
#error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU.
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#ifndef configENABLE_TRUSTZONE
|
||||||
|
#error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone.
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type definitions.
|
||||||
|
*/
|
||||||
|
#define portCHAR char
|
||||||
|
#define portFLOAT float
|
||||||
|
#define portDOUBLE double
|
||||||
|
#define portLONG long
|
||||||
|
#define portSHORT short
|
||||||
|
#define portSTACK_TYPE uint32_t
|
||||||
|
#define portBASE_TYPE long
|
||||||
|
|
||||||
|
typedef portSTACK_TYPE StackType_t;
|
||||||
|
typedef long BaseType_t;
|
||||||
|
typedef unsigned long UBaseType_t;
|
||||||
|
|
||||||
|
#if( configUSE_16_BIT_TICKS == 1 )
|
||||||
|
typedef uint16_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffff
|
||||||
|
#else
|
||||||
|
typedef uint32_t TickType_t;
|
||||||
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
#define portTICK_TYPE_IS_ATOMIC 1
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Architecture specifics.
|
||||||
|
*/
|
||||||
|
#define portARCH_NAME "Cortex-M23"
|
||||||
|
#define portSTACK_GROWTH ( -1 )
|
||||||
|
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
|
||||||
|
#define portBYTE_ALIGNMENT 8
|
||||||
|
#define portNOP()
|
||||||
|
#define portINLINE __inline
|
||||||
|
#ifndef portFORCE_INLINE
|
||||||
|
#define portFORCE_INLINE inline __attribute__(( always_inline ))
|
||||||
|
#endif
|
||||||
|
#define portHAS_STACK_OVERFLOW_CHECKING 1
|
||||||
|
#define portDONT_DISCARD __root
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extern declarations.
|
||||||
|
*/
|
||||||
|
extern BaseType_t xPortIsInsideInterrupt( void );
|
||||||
|
|
||||||
|
extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */
|
||||||
|
extern void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */;
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */;
|
||||||
|
extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU specific constants.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
#define portUSING_MPU_WRAPPERS 1
|
||||||
|
#define portPRIVILEGE_BIT ( 0x80000000UL )
|
||||||
|
#else
|
||||||
|
#define portPRIVILEGE_BIT ( 0x0UL )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
|
||||||
|
/* MPU regions. */
|
||||||
|
#define portPRIVILEGED_FLASH_REGION ( 0UL )
|
||||||
|
#define portUNPRIVILEGED_FLASH_REGION ( 1UL )
|
||||||
|
#define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL )
|
||||||
|
#define portPRIVILEGED_RAM_REGION ( 3UL )
|
||||||
|
#define portSTACK_REGION ( 4UL )
|
||||||
|
#define portFIRST_CONFIGURABLE_REGION ( 5UL )
|
||||||
|
#define portLAST_CONFIGURABLE_REGION ( 7UL )
|
||||||
|
#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )
|
||||||
|
#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */
|
||||||
|
|
||||||
|
/* Device memory attributes used in MPU_MAIR registers.
|
||||||
|
*
|
||||||
|
* 8-bit values encoded as follows:
|
||||||
|
* Bit[7:4] - 0000 - Device Memory
|
||||||
|
* Bit[3:2] - 00 --> Device-nGnRnE
|
||||||
|
* 01 --> Device-nGnRE
|
||||||
|
* 10 --> Device-nGRE
|
||||||
|
* 11 --> Device-GRE
|
||||||
|
* Bit[1:0] - 00, Reserved.
|
||||||
|
*/
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */
|
||||||
|
#define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */
|
||||||
|
|
||||||
|
/* Normal memory attributes used in MPU_MAIR registers. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */
|
||||||
|
#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */
|
||||||
|
|
||||||
|
/* Attributes used in MPU_RBAR registers. */
|
||||||
|
#define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL )
|
||||||
|
#define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL )
|
||||||
|
#define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_WRITE ( 1UL << 1UL )
|
||||||
|
#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL )
|
||||||
|
#define portMPU_REGION_READ_ONLY ( 3UL << 1UL )
|
||||||
|
|
||||||
|
#define portMPU_REGION_EXECUTE_NEVER ( 1UL )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Settings to define an MPU region.
|
||||||
|
*/
|
||||||
|
typedef struct MPURegionSettings
|
||||||
|
{
|
||||||
|
uint32_t ulRBAR; /**< RBAR for the region. */
|
||||||
|
uint32_t ulRLAR; /**< RLAR for the region. */
|
||||||
|
} MPURegionSettings_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MPU settings as stored in the TCB.
|
||||||
|
*/
|
||||||
|
typedef struct MPU_SETTINGS
|
||||||
|
{
|
||||||
|
uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */
|
||||||
|
MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */
|
||||||
|
} xMPU_SETTINGS;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC numbers.
|
||||||
|
*/
|
||||||
|
#define portSVC_ALLOCATE_SECURE_CONTEXT 0
|
||||||
|
#define portSVC_FREE_SECURE_CONTEXT 1
|
||||||
|
#define portSVC_START_SCHEDULER 2
|
||||||
|
#define portSVC_RAISE_PRIVILEGE 3
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Scheduler utilities.
|
||||||
|
*/
|
||||||
|
#define portYIELD() vPortYield()
|
||||||
|
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
|
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||||
|
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
|
||||||
|
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Tickless idle/low power functionality.
|
||||||
|
*/
|
||||||
|
#ifndef portSUPPRESS_TICKS_AND_SLEEP
|
||||||
|
extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );
|
||||||
|
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Critical section management.
|
||||||
|
*/
|
||||||
|
#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask()
|
||||||
|
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMask( x )
|
||||||
|
#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" )
|
||||||
|
#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" )
|
||||||
|
#define portENTER_CRITICAL() vPortEnterCritical()
|
||||||
|
#define portEXIT_CRITICAL() vPortExitCritical()
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Task function macros as described on the FreeRTOS.org WEB site.
|
||||||
|
*/
|
||||||
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_TRUSTZONE == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Allocate a secure context for the task.
|
||||||
|
*
|
||||||
|
* Tasks are not created with a secure context. Any task that is going to call
|
||||||
|
* secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a
|
||||||
|
* secure context before it calls any secure function.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the secure stack to be allocated.
|
||||||
|
*/
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a task is deleted to delete the task's secure context,
|
||||||
|
* if it has one.
|
||||||
|
*
|
||||||
|
* @param[in] pxTCB The TCB of the task being deleted.
|
||||||
|
*/
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB )
|
||||||
|
#else
|
||||||
|
#define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )
|
||||||
|
#define portCLEAN_UP_TCB( pxTCB )
|
||||||
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
#define portIS_PRIVILEGED() xIsPrivileged()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raise an SVC request to raise privilege.
|
||||||
|
*
|
||||||
|
* The SVC handler checks that the SVC was raised from a system call and only
|
||||||
|
* then it raises the privilege. If this is called from any other place,
|
||||||
|
* the privilege is not raised.
|
||||||
|
*/
|
||||||
|
#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
#define portRESET_PRIVILEGE() vResetPrivilege()
|
||||||
|
#else
|
||||||
|
#define portIS_PRIVILEGED()
|
||||||
|
#define portRAISE_PRIVILEGE()
|
||||||
|
#define portRESET_PRIVILEGE()
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Barriers.
|
||||||
|
*/
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in
|
||||||
|
* the source code because to do so would cause other compilers to generate
|
||||||
|
* warnings. */
|
||||||
|
#pragma diag_suppress=Be006
|
||||||
|
#pragma diag_suppress=Pa082
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PORTMACRO_H */
|
||||||
204
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context.c
vendored
Normal file
204
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context.c
vendored
Normal file
|
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Secure context includes. */
|
||||||
|
#include "secure_context.h"
|
||||||
|
|
||||||
|
/* Secure heap includes. */
|
||||||
|
#include "secure_heap.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief CONTROL value for privileged tasks.
|
||||||
|
*
|
||||||
|
* Bit[0] - 0 --> Thread mode is privileged.
|
||||||
|
* Bit[1] - 1 --> Thread mode uses PSP.
|
||||||
|
*/
|
||||||
|
#define securecontextCONTROL_VALUE_PRIVILEGED 0x02
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief CONTROL value for un-privileged tasks.
|
||||||
|
*
|
||||||
|
* Bit[0] - 1 --> Thread mode is un-privileged.
|
||||||
|
* Bit[1] - 1 --> Thread mode uses PSP.
|
||||||
|
*/
|
||||||
|
#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure to represent secure context.
|
||||||
|
*
|
||||||
|
* @note Since stack grows down, pucStackStart is the highest address while
|
||||||
|
* pucStackLimit is the first addess of the allocated memory.
|
||||||
|
*/
|
||||||
|
typedef struct SecureContext
|
||||||
|
{
|
||||||
|
uint8_t *pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */
|
||||||
|
uint8_t *pucStackLimit; /**< Last location of the stack memory (PSPLIM). */
|
||||||
|
uint8_t *pucStackStart; /**< First location of the stack memory. */
|
||||||
|
} SecureContext_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_Init( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* No stack for thread mode until a task's context is loaded. */
|
||||||
|
secureportSET_PSPLIM( securecontextNO_STACK );
|
||||||
|
secureportSET_PSP( securecontextNO_STACK );
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
{
|
||||||
|
/* Configure thread mode to use PSP and to be unprivileged. */
|
||||||
|
secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED );
|
||||||
|
}
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
/* Configure thread mode to use PSP and to be privileged.. */
|
||||||
|
secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED );
|
||||||
|
}
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged )
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize )
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
uint8_t *pucStackMemory = NULL;
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
SecureContextHandle_t xSecureContextHandle = NULL;
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
uint32_t *pulCurrentStackPointer = NULL;
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* Allocate the context structure. */
|
||||||
|
xSecureContextHandle = ( SecureContextHandle_t ) pvPortMalloc( sizeof( SecureContext_t ) );
|
||||||
|
|
||||||
|
if( xSecureContextHandle != NULL )
|
||||||
|
{
|
||||||
|
/* Allocate the stack space. */
|
||||||
|
pucStackMemory = pvPortMalloc( ulSecureStackSize );
|
||||||
|
|
||||||
|
if( pucStackMemory != NULL )
|
||||||
|
{
|
||||||
|
/* Since stack grows down, the starting point will be the last
|
||||||
|
* location. Note that this location is next to the last
|
||||||
|
* allocated byte because the hardware decrements the stack
|
||||||
|
* pointer before writing i.e. if stack pointer is 0x2, a push
|
||||||
|
* operation will decrement the stack pointer to 0x1 and then
|
||||||
|
* write at 0x1. */
|
||||||
|
xSecureContextHandle->pucStackStart = pucStackMemory + ulSecureStackSize;
|
||||||
|
|
||||||
|
/* The stack cannot go beyond this location. This value is
|
||||||
|
* programmed in the PSPLIM register on context switch.*/
|
||||||
|
xSecureContextHandle->pucStackLimit = pucStackMemory;
|
||||||
|
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
{
|
||||||
|
/* Store the correct CONTROL value for the task on the stack.
|
||||||
|
* This value is programmed in the CONTROL register on
|
||||||
|
* context switch. */
|
||||||
|
pulCurrentStackPointer = ( uint32_t * ) xSecureContextHandle->pucStackStart;
|
||||||
|
pulCurrentStackPointer--;
|
||||||
|
if( ulIsTaskPrivileged )
|
||||||
|
{
|
||||||
|
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store the current stack pointer. This value is programmed in
|
||||||
|
* the PSP register on context switch. */
|
||||||
|
xSecureContextHandle->pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer;
|
||||||
|
}
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
{
|
||||||
|
/* Current SP is set to the starting of the stack. This
|
||||||
|
* value programmed in the PSP register on context switch. */
|
||||||
|
xSecureContextHandle->pucCurrentStackPointer = xSecureContextHandle->pucStackStart;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Free the context to avoid memory leak and make sure to return
|
||||||
|
* NULL to indicate failure. */
|
||||||
|
vPortFree( xSecureContextHandle );
|
||||||
|
xSecureContextHandle = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xSecureContextHandle;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* Ensure that valid parameters are passed. */
|
||||||
|
secureportASSERT( xSecureContextHandle != NULL );
|
||||||
|
|
||||||
|
/* Free the stack space. */
|
||||||
|
vPortFree( xSecureContextHandle->pucStackLimit );
|
||||||
|
|
||||||
|
/* Free the context itself. */
|
||||||
|
vPortFree( xSecureContextHandle );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
111
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context.h
vendored
Normal file
111
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context.h
vendored
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_CONTEXT_H__
|
||||||
|
#define __SECURE_CONTEXT_H__
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOSConfig.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PSP value when no task's context is loaded.
|
||||||
|
*/
|
||||||
|
#define securecontextNO_STACK 0x0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Opaque handle.
|
||||||
|
*/
|
||||||
|
struct SecureContext;
|
||||||
|
typedef struct SecureContext* SecureContextHandle_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the secure context management system.
|
||||||
|
*
|
||||||
|
* PSP is set to NULL and therefore a task must allocate and load a context
|
||||||
|
* before calling any secure side function in the thread mode.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureContext_Init( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocates a context on the secure side.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize Size of the stack to allocate on secure side.
|
||||||
|
* @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise.
|
||||||
|
*
|
||||||
|
* @return Opaque context handle if context is successfully allocated, NULL
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
#if( configENABLE_MPU == 1 )
|
||||||
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged );
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize );
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the
|
||||||
|
* context to be freed.
|
||||||
|
*/
|
||||||
|
void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the context
|
||||||
|
* to be loaded.
|
||||||
|
*/
|
||||||
|
void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Saves the given context.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*
|
||||||
|
* @param[in] xSecureContextHandle Context handle corresponding to the context
|
||||||
|
* to be saved.
|
||||||
|
*/
|
||||||
|
void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
#endif /* __SECURE_CONTEXT_H__ */
|
||||||
48
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context_port.c
vendored
Normal file
48
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context_port.c
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Secure context includes. */
|
||||||
|
#include "secure_context.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/* Functions implemented in assembler file. */
|
||||||
|
extern void SecureContext_LoadContextAsm( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
extern void SecureContext_SaveContextAsm( SecureContextHandle_t xSecureContextHandle );
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
SecureContext_LoadContextAsm( xSecureContextHandle );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle )
|
||||||
|
{
|
||||||
|
SecureContext_SaveContextAsm( xSecureContextHandle );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
76
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s
vendored
Normal file
76
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s
vendored
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
SECTION .text:CODE:NOROOT(2)
|
||||||
|
THUMB
|
||||||
|
|
||||||
|
PUBLIC SecureContext_LoadContextAsm
|
||||||
|
PUBLIC SecureContext_SaveContextAsm
|
||||||
|
|
||||||
|
#if ( configENABLE_FPU == 1 )
|
||||||
|
#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SecureContext_LoadContextAsm:
|
||||||
|
/* xSecureContextHandle value is in r0. */
|
||||||
|
mrs r1, ipsr /* r1 = IPSR. */
|
||||||
|
cbz r1, load_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */
|
||||||
|
ldmia r0!, {r1, r2} /* r1 = xSecureContextHandle->pucCurrentStackPointer, r2 = xSecureContextHandle->pucStackLimit. */
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
ldmia r1!, {r3} /* Read CONTROL register value from task's stack. r3 = CONTROL. */
|
||||||
|
msr control, r3 /* CONTROL = r3. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
msr psplim, r2 /* PSPLIM = r2. */
|
||||||
|
msr psp, r1 /* PSP = r1. */
|
||||||
|
|
||||||
|
load_ctx_therad_mode:
|
||||||
|
bx lr
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SecureContext_SaveContextAsm:
|
||||||
|
/* xSecureContextHandle value is in r0. */
|
||||||
|
mrs r1, ipsr /* r1 = IPSR. */
|
||||||
|
cbz r1, save_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */
|
||||||
|
mrs r1, psp /* r1 = PSP. */
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
mrs r2, control /* r2 = CONTROL. */
|
||||||
|
subs r1, r1, #4 /* Make space for the CONTROL value on the stack. */
|
||||||
|
str r1, [r0] /* Save the top of stack in context. xSecureContextHandle->pucCurrentStackPointer = r1. */
|
||||||
|
stmia r1!, {r2} /* Store CONTROL value on the stack. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
str r1, [r0] /* Save the top of stack in context. xSecureContextHandle->pucCurrentStackPointer = r1. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
movs r1, #0 /* r1 = securecontextNO_STACK. */
|
||||||
|
msr psplim, r1 /* PSPLIM = securecontextNO_STACK. */
|
||||||
|
msr psp, r1 /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */
|
||||||
|
|
||||||
|
save_ctx_therad_mode:
|
||||||
|
bx lr
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
END
|
||||||
450
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_heap.c
vendored
Normal file
450
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_heap.c
vendored
Normal file
|
|
@ -0,0 +1,450 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Secure context heap includes. */
|
||||||
|
#include "secure_heap.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Total heap size.
|
||||||
|
*/
|
||||||
|
#define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) )
|
||||||
|
|
||||||
|
/* No test marker by default. */
|
||||||
|
#ifndef mtCOVERAGE_TEST_MARKER
|
||||||
|
#define mtCOVERAGE_TEST_MARKER()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* No tracing by default. */
|
||||||
|
#ifndef traceMALLOC
|
||||||
|
#define traceMALLOC( pvReturn, xWantedSize )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* No tracing by default. */
|
||||||
|
#ifndef traceFREE
|
||||||
|
#define traceFREE( pv, xBlockSize )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Block sizes must not get too small. */
|
||||||
|
#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) )
|
||||||
|
|
||||||
|
/* Assumes 8bit bytes! */
|
||||||
|
#define secureheapBITS_PER_BYTE ( ( size_t ) 8 )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Allocate the memory for the heap. */
|
||||||
|
#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
|
||||||
|
/* 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. */
|
||||||
|
extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
||||||
|
#else /* configAPPLICATION_ALLOCATED_HEAP */
|
||||||
|
static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ];
|
||||||
|
#endif /* configAPPLICATION_ALLOCATED_HEAP */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The linked list structure.
|
||||||
|
*
|
||||||
|
* This is used to link free blocks in order of their memory address.
|
||||||
|
*/
|
||||||
|
typedef struct A_BLOCK_LINK
|
||||||
|
{
|
||||||
|
struct A_BLOCK_LINK *pxNextFreeBlock; /**< The next free block in the list. */
|
||||||
|
size_t xBlockSize; /**< The size of the free block. */
|
||||||
|
} BlockLink_t;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called automatically to setup the required heap structures the first
|
||||||
|
* time pvPortMalloc() is called.
|
||||||
|
*/
|
||||||
|
static void prvHeapInit( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inserts a block of memory that is being freed into the correct
|
||||||
|
* position in the list of free memory blocks.
|
||||||
|
*
|
||||||
|
* The block being freed will be merged with the block in front it and/or the
|
||||||
|
* block behind it if the memory blocks are adjacent to each other.
|
||||||
|
*
|
||||||
|
* @param[in] pxBlockToInsert The block being freed.
|
||||||
|
*/
|
||||||
|
static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert );
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The size of the structure placed at the beginning of each allocated
|
||||||
|
* memory block must by correctly byte aligned.
|
||||||
|
*/
|
||||||
|
static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a couple of list links to mark the start and end of the list.
|
||||||
|
*/
|
||||||
|
static BlockLink_t xStart, *pxEnd = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Keeps track of the number of free bytes remaining, but says nothing
|
||||||
|
* about fragmentation.
|
||||||
|
*/
|
||||||
|
static size_t xFreeBytesRemaining = 0U;
|
||||||
|
static size_t xMinimumEverFreeBytesRemaining = 0U;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets set to the top bit of an size_t type.
|
||||||
|
*
|
||||||
|
* When this bit in the xBlockSize member of an BlockLink_t structure is set
|
||||||
|
* then the block belongs to the application. When the bit is free the block is
|
||||||
|
* still part of the free heap space.
|
||||||
|
*/
|
||||||
|
static size_t xBlockAllocatedBit = 0;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvHeapInit( void )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxFirstFreeBlock;
|
||||||
|
uint8_t *pucAlignedHeap;
|
||||||
|
size_t uxAddress;
|
||||||
|
size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE;
|
||||||
|
|
||||||
|
/* Ensure the heap starts on a correctly aligned boundary. */
|
||||||
|
uxAddress = ( size_t ) ucHeap;
|
||||||
|
|
||||||
|
if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 )
|
||||||
|
{
|
||||||
|
uxAddress += ( secureportBYTE_ALIGNMENT - 1 );
|
||||||
|
uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
|
||||||
|
}
|
||||||
|
|
||||||
|
pucAlignedHeap = ( uint8_t * ) uxAddress;
|
||||||
|
|
||||||
|
/* xStart is used to hold a pointer to the first item in the list of free
|
||||||
|
* blocks. The void cast is used to prevent compiler warnings. */
|
||||||
|
xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap;
|
||||||
|
xStart.xBlockSize = ( size_t ) 0;
|
||||||
|
|
||||||
|
/* pxEnd is used to mark the end of the list of free blocks and is inserted
|
||||||
|
* at the end of the heap space. */
|
||||||
|
uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
|
||||||
|
uxAddress -= xHeapStructSize;
|
||||||
|
uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK );
|
||||||
|
pxEnd = ( void * ) uxAddress;
|
||||||
|
pxEnd->xBlockSize = 0;
|
||||||
|
pxEnd->pxNextFreeBlock = NULL;
|
||||||
|
|
||||||
|
/* To start with there is a single free block that is sized to take up the
|
||||||
|
* entire heap space, minus the space taken by pxEnd. */
|
||||||
|
pxFirstFreeBlock = ( void * ) pucAlignedHeap;
|
||||||
|
pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
|
||||||
|
pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
|
||||||
|
|
||||||
|
/* Only one block exists - and it covers the entire usable heap space. */
|
||||||
|
xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
|
||||||
|
xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
|
||||||
|
|
||||||
|
/* Work out the position of the top bit in a size_t variable. */
|
||||||
|
xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxIterator;
|
||||||
|
uint8_t *puc;
|
||||||
|
|
||||||
|
/* Iterate through the list until a block is found that has a higher address
|
||||||
|
* than the block being inserted. */
|
||||||
|
for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
|
||||||
|
{
|
||||||
|
/* Nothing to do here, just iterate to the right position. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do the block being inserted, and the block it is being inserted after
|
||||||
|
* make a contiguous block of memory? */
|
||||||
|
puc = ( uint8_t * ) pxIterator;
|
||||||
|
if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
|
||||||
|
{
|
||||||
|
pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;
|
||||||
|
pxBlockToInsert = pxIterator;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do the block being inserted, and the block it is being inserted before
|
||||||
|
* make a contiguous block of memory? */
|
||||||
|
puc = ( uint8_t * ) pxBlockToInsert;
|
||||||
|
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock )
|
||||||
|
{
|
||||||
|
if( pxIterator->pxNextFreeBlock != pxEnd )
|
||||||
|
{
|
||||||
|
/* Form one big block from the two blocks. */
|
||||||
|
pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize;
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxEnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the block being inserted plugged a gab, so was merged with the block
|
||||||
|
* before and the block after, then it's pxNextFreeBlock pointer will have
|
||||||
|
* already been set, and should not be set here as that would make it point
|
||||||
|
* to itself. */
|
||||||
|
if( pxIterator != pxBlockToInsert )
|
||||||
|
{
|
||||||
|
pxIterator->pxNextFreeBlock = pxBlockToInsert;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void *pvPortMalloc( size_t xWantedSize )
|
||||||
|
{
|
||||||
|
BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
|
||||||
|
void *pvReturn = NULL;
|
||||||
|
|
||||||
|
/* If this is the first call to malloc then the heap will require
|
||||||
|
* initialisation to setup the list of free blocks. */
|
||||||
|
if( pxEnd == NULL )
|
||||||
|
{
|
||||||
|
prvHeapInit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the requested block size is not so large that the top bit is set.
|
||||||
|
* The top bit of the block size member of the BlockLink_t structure is used
|
||||||
|
* to determine who owns the block - the application or the kernel, so it
|
||||||
|
* must be free. */
|
||||||
|
if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
|
||||||
|
{
|
||||||
|
/* The wanted size is increased so it can contain a BlockLink_t
|
||||||
|
* structure in addition to the requested amount of bytes. */
|
||||||
|
if( xWantedSize > 0 )
|
||||||
|
{
|
||||||
|
xWantedSize += xHeapStructSize;
|
||||||
|
|
||||||
|
/* Ensure that blocks are always aligned to the required number of
|
||||||
|
* bytes. */
|
||||||
|
if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 )
|
||||||
|
{
|
||||||
|
/* Byte alignment required. */
|
||||||
|
xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) );
|
||||||
|
secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
|
||||||
|
{
|
||||||
|
/* Traverse the list from the start (lowest address) block until
|
||||||
|
* one of adequate size is found. */
|
||||||
|
pxPreviousBlock = &xStart;
|
||||||
|
pxBlock = xStart.pxNextFreeBlock;
|
||||||
|
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
|
||||||
|
{
|
||||||
|
pxPreviousBlock = pxBlock;
|
||||||
|
pxBlock = pxBlock->pxNextFreeBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the end marker was reached then a block of adequate size was
|
||||||
|
* not found. */
|
||||||
|
if( pxBlock != pxEnd )
|
||||||
|
{
|
||||||
|
/* Return the memory space pointed to - jumping over the
|
||||||
|
* BlockLink_t structure at its start. */
|
||||||
|
pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize );
|
||||||
|
|
||||||
|
/* This block is being returned for use so must be taken out
|
||||||
|
* of the list of free blocks. */
|
||||||
|
pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
|
||||||
|
|
||||||
|
/* If the block is larger than required it can be split into
|
||||||
|
* two. */
|
||||||
|
if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE )
|
||||||
|
{
|
||||||
|
/* This block is to be split into two. Create a new
|
||||||
|
* block following the number of bytes requested. The void
|
||||||
|
* cast is used to prevent byte alignment warnings from the
|
||||||
|
* compiler. */
|
||||||
|
pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
|
||||||
|
secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
|
||||||
|
/* Calculate the sizes of two blocks split from the single
|
||||||
|
* block. */
|
||||||
|
pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
|
||||||
|
pxBlock->xBlockSize = xWantedSize;
|
||||||
|
|
||||||
|
/* Insert the new block into the list of free blocks. */
|
||||||
|
prvInsertBlockIntoFreeList( pxNewBlockLink );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
xFreeBytesRemaining -= pxBlock->xBlockSize;
|
||||||
|
|
||||||
|
if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
|
||||||
|
{
|
||||||
|
xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The block is being returned - it is allocated and owned by
|
||||||
|
* the application and has no "next" block. */
|
||||||
|
pxBlock->xBlockSize |= xBlockAllocatedBit;
|
||||||
|
pxBlock->pxNextFreeBlock = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
traceMALLOC( pvReturn, xWantedSize );
|
||||||
|
|
||||||
|
#if( secureconfigUSE_MALLOC_FAILED_HOOK == 1 )
|
||||||
|
{
|
||||||
|
if( pvReturn == NULL )
|
||||||
|
{
|
||||||
|
extern void vApplicationMallocFailedHook( void );
|
||||||
|
vApplicationMallocFailedHook();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 );
|
||||||
|
return pvReturn;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortFree( void *pv )
|
||||||
|
{
|
||||||
|
uint8_t *puc = ( uint8_t * ) pv;
|
||||||
|
BlockLink_t *pxLink;
|
||||||
|
|
||||||
|
if( pv != NULL )
|
||||||
|
{
|
||||||
|
/* The memory being freed will have an BlockLink_t structure immediately
|
||||||
|
* before it. */
|
||||||
|
puc -= xHeapStructSize;
|
||||||
|
|
||||||
|
/* This casting is to keep the compiler from issuing warnings. */
|
||||||
|
pxLink = ( void * ) puc;
|
||||||
|
|
||||||
|
/* Check the block is actually allocated. */
|
||||||
|
secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
|
||||||
|
secureportASSERT( pxLink->pxNextFreeBlock == NULL );
|
||||||
|
|
||||||
|
if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
|
||||||
|
{
|
||||||
|
if( pxLink->pxNextFreeBlock == NULL )
|
||||||
|
{
|
||||||
|
/* The block is being returned to the heap - it is no longer
|
||||||
|
* allocated. */
|
||||||
|
pxLink->xBlockSize &= ~xBlockAllocatedBit;
|
||||||
|
|
||||||
|
secureportDISABLE_NON_SECURE_INTERRUPTS();
|
||||||
|
{
|
||||||
|
/* Add this block to the list of free blocks. */
|
||||||
|
xFreeBytesRemaining += pxLink->xBlockSize;
|
||||||
|
traceFREE( pv, pxLink->xBlockSize );
|
||||||
|
prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
|
||||||
|
}
|
||||||
|
secureportENABLE_NON_SECURE_INTERRUPTS();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
size_t xPortGetFreeHeapSize( void )
|
||||||
|
{
|
||||||
|
return xFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
size_t xPortGetMinimumEverFreeHeapSize( void )
|
||||||
|
{
|
||||||
|
return xMinimumEverFreeBytesRemaining;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
void vPortInitialiseBlocks( void )
|
||||||
|
{
|
||||||
|
/* This just exists to keep the linker quiet. */
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
51
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_heap.h
vendored
Normal file
51
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_heap.h
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_HEAP_H__
|
||||||
|
#define __SECURE_HEAP_H__
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocates memory from heap.
|
||||||
|
*
|
||||||
|
* @param[in] xWantedSize The size of the memory to be allocated.
|
||||||
|
*
|
||||||
|
* @return Pointer to the memory region if the allocation is successful, NULL
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
void *pvPortMalloc( size_t xWantedSize );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees the previously allocated memory.
|
||||||
|
*
|
||||||
|
* @param[in] pv Pointer to the memory to be freed.
|
||||||
|
*/
|
||||||
|
void vPortFree( void *pv );
|
||||||
|
|
||||||
|
#endif /* __SECURE_HEAP_H__ */
|
||||||
105
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_init.c
vendored
Normal file
105
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_init.c
vendored
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Standard includes. */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Secure init includes. */
|
||||||
|
#include "secure_init.h"
|
||||||
|
|
||||||
|
/* Secure port macros. */
|
||||||
|
#include "secure_port_macros.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constants required to manipulate the SCB.
|
||||||
|
*/
|
||||||
|
#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */
|
||||||
|
#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL )
|
||||||
|
#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS )
|
||||||
|
#define secureinitSCB_AIRCR_PRIS_POS ( 14UL )
|
||||||
|
#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constants required to manipulate the FPU.
|
||||||
|
*/
|
||||||
|
#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */
|
||||||
|
#define secureinitFPCCR_LSPENS_POS ( 29UL )
|
||||||
|
#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS )
|
||||||
|
#define secureinitFPCCR_TS_POS ( 26UL )
|
||||||
|
#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS )
|
||||||
|
|
||||||
|
#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */
|
||||||
|
#define secureinitNSACR_CP10_POS ( 10UL )
|
||||||
|
#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS )
|
||||||
|
#define secureinitNSACR_CP11_POS ( 11UL )
|
||||||
|
#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS )
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
*( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) |
|
||||||
|
( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) |
|
||||||
|
( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void )
|
||||||
|
{
|
||||||
|
uint32_t ulIPSR;
|
||||||
|
|
||||||
|
/* Read the Interrupt Program Status Register (IPSR) value. */
|
||||||
|
secureportREAD_IPSR( ulIPSR );
|
||||||
|
|
||||||
|
/* Do nothing if the processor is running in the Thread Mode. IPSR is zero
|
||||||
|
* when the processor is running in the Thread Mode. */
|
||||||
|
if( ulIPSR != 0 )
|
||||||
|
{
|
||||||
|
/* CP10 = 1 ==> Non-secure access to the Floating Point Unit is
|
||||||
|
* permitted. CP11 should be programmed to the same value as CP10. */
|
||||||
|
*( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK );
|
||||||
|
|
||||||
|
/* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures
|
||||||
|
* that we can enable/disable lazy stacking in port.c file. */
|
||||||
|
*( secureinitFPCCR ) &= ~ ( secureinitFPCCR_LSPENS_MASK );
|
||||||
|
|
||||||
|
/* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP
|
||||||
|
* registers (S16-S31) are also pushed to stack on exception entry and
|
||||||
|
* restored on exception return. */
|
||||||
|
*( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
53
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_init.h
vendored
Normal file
53
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_init.h
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* 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 __SECURE_INIT_H__
|
||||||
|
#define __SECURE_INIT_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief De-prioritizes the non-secure exceptions.
|
||||||
|
*
|
||||||
|
* This is needed to ensure that the non-secure PendSV runs at the lowest
|
||||||
|
* priority. Context switch is done in the non-secure PendSV handler.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureInit_DePrioritizeNSExceptions( void );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets up the Floating Point Unit (FPU) for Non-Secure access.
|
||||||
|
*
|
||||||
|
* Also sets FPCCR.TS=1 to ensure that the content of the Floating Point
|
||||||
|
* Registers are not leaked to the non-secure side.
|
||||||
|
*
|
||||||
|
* @note This function must be called in the handler mode. It is no-op if called
|
||||||
|
* in the thread mode.
|
||||||
|
*/
|
||||||
|
void SecureInit_EnableNSFPUAccess( void );
|
||||||
|
|
||||||
|
#endif /* __SECURE_INIT_H__ */
|
||||||
133
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_port_macros.h
vendored
Normal file
133
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23/secure/secure_port_macros.h
vendored
Normal file
|
|
@ -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 __SECURE_PORT_MACROS_H__
|
||||||
|
#define __SECURE_PORT_MACROS_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Byte alignment requirements.
|
||||||
|
*/
|
||||||
|
#define secureportBYTE_ALIGNMENT 8
|
||||||
|
#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to declare a function as non-secure callable.
|
||||||
|
*/
|
||||||
|
#if defined( __IAR_SYSTEMS_ICC__ )
|
||||||
|
#define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root
|
||||||
|
#else
|
||||||
|
#define secureportNON_SECURE_CALLABLE __attribute__((cmse_nonsecure_entry)) __attribute__((used))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the secure PRIMASK value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \
|
||||||
|
__asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the non-secure PRIMASK value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \
|
||||||
|
__asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the PSP value in the given variable.
|
||||||
|
*/
|
||||||
|
#define secureportREAD_PSP( pucOutCurrentStackPointer ) \
|
||||||
|
__asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the PSP to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_PSP( pucCurrentStackPointer ) \
|
||||||
|
__asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the PSPLIM to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_PSPLIM( pucStackLimit ) \
|
||||||
|
__asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the NonSecure MSP to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_MSP_NS( pucMainStackPointer ) \
|
||||||
|
__asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the CONTROL register to the given value.
|
||||||
|
*/
|
||||||
|
#define secureportSET_CONTROL( ulControl ) \
|
||||||
|
__asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the Interrupt Program Status Register (IPSR) value in the given
|
||||||
|
* variable.
|
||||||
|
*/
|
||||||
|
#define secureportREAD_IPSR( ulIPSR ) \
|
||||||
|
__asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PRIMASK value to enable interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PRIMASK value to disable interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable secure interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable non-secure interrupts.
|
||||||
|
*
|
||||||
|
* This effectively disables context switches.
|
||||||
|
*/
|
||||||
|
#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable non-secure interrupts.
|
||||||
|
*/
|
||||||
|
#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assert definition.
|
||||||
|
*/
|
||||||
|
#define secureportASSERT( x ) \
|
||||||
|
if( ( x ) == 0 ) \
|
||||||
|
{ \
|
||||||
|
secureportDISABLE_SECURE_INTERRUPTS(); \
|
||||||
|
secureportDISABLE_NON_SECURE_INTERRUPTS(); \
|
||||||
|
for( ;; ); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __SECURE_PORT_MACROS_H__ */
|
||||||
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23_NTZ/non_secure/port.c
vendored
Normal file
1149
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23_NTZ/non_secure/port.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
113
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h
vendored
Normal file
113
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h
vendored
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* 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 __PORT_ASM_H__
|
||||||
|
#define __PORT_ASM_H__
|
||||||
|
|
||||||
|
/* Scheduler includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
|
/* MPU wrappers includes. */
|
||||||
|
#include "mpu_wrappers.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Restore the context of the first task so that the first task starts
|
||||||
|
* executing.
|
||||||
|
*/
|
||||||
|
void vRestoreContextOfFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether or not the processor is privileged.
|
||||||
|
*
|
||||||
|
* @return 1 if the processor is already privileged, 0 otherwise.
|
||||||
|
*/
|
||||||
|
BaseType_t xIsPrivileged( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raises the privilege level by clearing the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* @note This is a privileged function and should only be called from the kenrel
|
||||||
|
* code.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vRaisePrivilege( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lowers the privilege level by setting the bit 0 of the CONTROL
|
||||||
|
* register.
|
||||||
|
*
|
||||||
|
* Bit 0 of the CONTROL register defines the privilege level of Thread Mode.
|
||||||
|
* Bit[0] = 0 --> The processor is running privileged
|
||||||
|
* Bit[0] = 1 --> The processor is running unprivileged.
|
||||||
|
*/
|
||||||
|
void vResetPrivilege( void ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the first task.
|
||||||
|
*/
|
||||||
|
void vStartFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables interrupts.
|
||||||
|
*/
|
||||||
|
uint32_t ulSetInterruptMask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables interrupts.
|
||||||
|
*/
|
||||||
|
void vClearInterruptMask( uint32_t ulMask ) __attribute__(( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PendSV Exception handler.
|
||||||
|
*/
|
||||||
|
void PendSV_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVC Handler.
|
||||||
|
*/
|
||||||
|
void SVC_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a Secure context for the calling task.
|
||||||
|
*
|
||||||
|
* @param[in] ulSecureStackSize The size of the stack to be allocated on the
|
||||||
|
* secure side for the calling task.
|
||||||
|
*/
|
||||||
|
void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__ (( naked ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free the task's secure context.
|
||||||
|
*
|
||||||
|
* @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.
|
||||||
|
*/
|
||||||
|
void vPortFreeSecureContext( uint32_t *pulTCB ) __attribute__ (( naked )) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
|
#endif /* __PORT_ASM_H__ */
|
||||||
303
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s
vendored
Normal file
303
Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s
vendored
Normal file
|
|
@ -0,0 +1,303 @@
|
||||||
|
/*
|
||||||
|
* 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!
|
||||||
|
*/
|
||||||
|
|
||||||
|
EXTERN pxCurrentTCB
|
||||||
|
EXTERN vTaskSwitchContext
|
||||||
|
EXTERN vPortSVCHandler_C
|
||||||
|
|
||||||
|
PUBLIC xIsPrivileged
|
||||||
|
PUBLIC vResetPrivilege
|
||||||
|
PUBLIC vRestoreContextOfFirstTask
|
||||||
|
PUBLIC vRaisePrivilege
|
||||||
|
PUBLIC vStartFirstTask
|
||||||
|
PUBLIC ulSetInterruptMask
|
||||||
|
PUBLIC vClearInterruptMask
|
||||||
|
PUBLIC PendSV_Handler
|
||||||
|
PUBLIC SVC_Handler
|
||||||
|
|
||||||
|
#if ( configENABLE_FPU == 1 )
|
||||||
|
#error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0.
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*---------------- Unprivileged Functions -------------------*/
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SECTION .text:CODE:NOROOT(2)
|
||||||
|
THUMB
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
xIsPrivileged:
|
||||||
|
mrs r0, control /* r0 = CONTROL. */
|
||||||
|
movs r1, #1 /* r1 = 1. */
|
||||||
|
tst r0, r1 /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
beq running_privileged /* If the result of previous AND operation was 0, branch. */
|
||||||
|
movs r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */
|
||||||
|
bx lr /* Return. */
|
||||||
|
running_privileged:
|
||||||
|
movs r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */
|
||||||
|
bx lr /* Return. */
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vResetPrivilege:
|
||||||
|
mrs r0, control /* r0 = CONTROL. */
|
||||||
|
movs r1, #1 /* r1 = 1. */
|
||||||
|
orrs r0, r1 /* r0 = r0 | r1. */
|
||||||
|
msr control, r0 /* CONTROL = r0. */
|
||||||
|
bx lr /* Return to the caller. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*----------------- Privileged Functions --------------------*/
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SECTION privileged_functions:CODE:NOROOT(2)
|
||||||
|
THUMB
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vRestoreContextOfFirstTask:
|
||||||
|
ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
ldr r1, [r2] /* Read pxCurrentTCB. */
|
||||||
|
ldr r0, [r1] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
dmb /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r3, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r4, #1 /* r4 = 1. */
|
||||||
|
bics r3, r4 /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */
|
||||||
|
str r3, [r2] /* Disable MPU. */
|
||||||
|
|
||||||
|
adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
|
||||||
|
ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */
|
||||||
|
ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
str r4, [r2] /* Program MAIR0. */
|
||||||
|
ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
|
||||||
|
movs r4, #4 /* r4 = 4. */
|
||||||
|
str r4, [r2] /* Program RNR = 4. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write first set of RBAR/RLAR registers. */
|
||||||
|
movs r4, #5 /* r4 = 5. */
|
||||||
|
str r4, [r2] /* Program RNR = 5. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write second set of RBAR/RLAR registers. */
|
||||||
|
movs r4, #6 /* r4 = 6. */
|
||||||
|
str r4, [r2] /* Program RNR = 6. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write third set of RBAR/RLAR registers. */
|
||||||
|
movs r4, #7 /* r4 = 7. */
|
||||||
|
str r4, [r2] /* Program RNR = 7. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r3, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r4, #1 /* r4 = 1. */
|
||||||
|
orrs r3, r4 /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */
|
||||||
|
str r3, [r2] /* Enable MPU. */
|
||||||
|
dsb /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
ldm r0!, {r1-r3} /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */
|
||||||
|
msr psplim, r1 /* Set this task's PSPLIM value. */
|
||||||
|
msr control, r2 /* Set this task's CONTROL value. */
|
||||||
|
adds r0, #32 /* Discard everything up to r0. */
|
||||||
|
msr psp, r0 /* This is now the new top of stack to use in the task. */
|
||||||
|
isb
|
||||||
|
bx r3 /* Finally, branch to EXC_RETURN. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
ldm r0!, {r1-r2} /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
|
msr psplim, r1 /* Set this task's PSPLIM value. */
|
||||||
|
movs r1, #2 /* r1 = 2. */
|
||||||
|
msr CONTROL, r1 /* Switch to use PSP in the thread mode. */
|
||||||
|
adds r0, #32 /* Discard everything up to r0. */
|
||||||
|
msr psp, r0 /* This is now the new top of stack to use in the task. */
|
||||||
|
isb
|
||||||
|
bx r2 /* Finally, branch to EXC_RETURN. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vRaisePrivilege:
|
||||||
|
mrs r0, control /* Read the CONTROL register. */
|
||||||
|
movs r1, #1 /* r1 = 1. */
|
||||||
|
bics r0, r1 /* Clear the bit 0. */
|
||||||
|
msr control, r0 /* Write back the new CONTROL value. */
|
||||||
|
bx lr /* Return to the caller. */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vStartFirstTask:
|
||||||
|
ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */
|
||||||
|
ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */
|
||||||
|
ldr r0, [r0] /* The first entry in vector table is stack pointer. */
|
||||||
|
msr msp, r0 /* Set the MSP back to the start of the stack. */
|
||||||
|
cpsie i /* Globally enable interrupts. */
|
||||||
|
dsb
|
||||||
|
isb
|
||||||
|
svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
|
||||||
|
nop
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
ulSetInterruptMask:
|
||||||
|
mrs r0, PRIMASK
|
||||||
|
cpsid i
|
||||||
|
bx lr
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
vClearInterruptMask:
|
||||||
|
msr PRIMASK, r0
|
||||||
|
bx lr
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
PendSV_Handler:
|
||||||
|
mrs r0, psp /* Read PSP in r0. */
|
||||||
|
ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
ldr r1, [r2] /* Read pxCurrentTCB. */
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
subs r0, r0, #44 /* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */
|
||||||
|
str r0, [r1] /* Save the new top of stack in TCB. */
|
||||||
|
mrs r1, psplim /* r1 = PSPLIM. */
|
||||||
|
mrs r2, control /* r2 = CONTROL. */
|
||||||
|
mov r3, lr /* r3 = LR/EXC_RETURN. */
|
||||||
|
stmia r0!, {r1-r7} /* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */
|
||||||
|
mov r4, r8 /* r4 = r8. */
|
||||||
|
mov r5, r9 /* r5 = r9. */
|
||||||
|
mov r6, r10 /* r6 = r10. */
|
||||||
|
mov r7, r11 /* r7 = r11. */
|
||||||
|
stmia r0!, {r4-r7} /* Store the high registers that are not saved automatically. */
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
subs r0, r0, #40 /* Make space for PSPLIM, LR and the remaining registers on the stack. */
|
||||||
|
str r0, [r1] /* Save the new top of stack in TCB. */
|
||||||
|
mrs r2, psplim /* r2 = PSPLIM. */
|
||||||
|
mov r3, lr /* r3 = LR/EXC_RETURN. */
|
||||||
|
stmia r0!, {r2-r7} /* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */
|
||||||
|
mov r4, r8 /* r4 = r8. */
|
||||||
|
mov r5, r9 /* r5 = r9. */
|
||||||
|
mov r6, r10 /* r6 = r10. */
|
||||||
|
mov r7, r11 /* r7 = r11. */
|
||||||
|
stmia r0!, {r4-r7} /* Store the high registers that are not saved automatically. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
cpsid i
|
||||||
|
bl vTaskSwitchContext
|
||||||
|
cpsie i
|
||||||
|
|
||||||
|
ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
|
ldr r1, [r2] /* Read pxCurrentTCB. */
|
||||||
|
ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
dmb /* Complete outstanding transfers before disabling MPU. */
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r3, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r4, #1 /* r4 = 1. */
|
||||||
|
bics r3, r4 /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */
|
||||||
|
str r3, [r2] /* Disable MPU. */
|
||||||
|
|
||||||
|
adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */
|
||||||
|
ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */
|
||||||
|
ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */
|
||||||
|
str r4, [r2] /* Program MAIR0. */
|
||||||
|
ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */
|
||||||
|
adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */
|
||||||
|
movs r4, #4 /* r4 = 4. */
|
||||||
|
str r4, [r2] /* Program RNR = 4. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read first set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write first set of RBAR/RLAR registers. */
|
||||||
|
movs r4, #5 /* r4 = 5. */
|
||||||
|
str r4, [r2] /* Program RNR = 5. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read second set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write second set of RBAR/RLAR registers. */
|
||||||
|
movs r4, #6 /* r4 = 6. */
|
||||||
|
str r4, [r2] /* Program RNR = 6. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read third set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write third set of RBAR/RLAR registers. */
|
||||||
|
movs r4, #7 /* r4 = 7. */
|
||||||
|
str r4, [r2] /* Program RNR = 7. */
|
||||||
|
ldmia r1!, {r5,r6} /* Read fourth set of RBAR/RLAR from TCB. */
|
||||||
|
ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */
|
||||||
|
stmia r3!, {r5,r6} /* Write fourth set of RBAR/RLAR registers. */
|
||||||
|
|
||||||
|
ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
|
ldr r3, [r2] /* Read the value of MPU_CTRL. */
|
||||||
|
movs r4, #1 /* r4 = 1. */
|
||||||
|
orrs r3, r4 /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */
|
||||||
|
str r3, [r2] /* Enable MPU. */
|
||||||
|
dsb /* Force memory writes before continuing. */
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
adds r0, r0, #28 /* Move to the high registers. */
|
||||||
|
ldmia r0!, {r4-r7} /* Restore the high registers that are not automatically restored. */
|
||||||
|
mov r8, r4 /* r8 = r4. */
|
||||||
|
mov r9, r5 /* r9 = r5. */
|
||||||
|
mov r10, r6 /* r10 = r6. */
|
||||||
|
mov r11, r7 /* r11 = r7. */
|
||||||
|
msr psp, r0 /* Remember the new top of stack for the task. */
|
||||||
|
subs r0, r0, #44 /* Move to the starting of the saved context. */
|
||||||
|
ldmia r0!, {r1-r7} /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */
|
||||||
|
msr psplim, r1 /* Restore the PSPLIM register value for the task. */
|
||||||
|
msr control, r2 /* Restore the CONTROL register value for the task. */
|
||||||
|
bx r3
|
||||||
|
#else /* configENABLE_MPU */
|
||||||
|
adds r0, r0, #24 /* Move to the high registers. */
|
||||||
|
ldmia r0!, {r4-r7} /* Restore the high registers that are not automatically restored. */
|
||||||
|
mov r8, r4 /* r8 = r4. */
|
||||||
|
mov r9, r5 /* r9 = r5. */
|
||||||
|
mov r10, r6 /* r10 = r6. */
|
||||||
|
mov r11, r7 /* r11 = r7. */
|
||||||
|
msr psp, r0 /* Remember the new top of stack for the task. */
|
||||||
|
subs r0, r0, #40 /* Move to the starting of the saved context. */
|
||||||
|
ldmia r0!, {r2-r7} /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */
|
||||||
|
msr psplim, r2 /* Restore the PSPLIM register value for the task. */
|
||||||
|
bx r3
|
||||||
|
#endif /* configENABLE_MPU */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
SVC_Handler:
|
||||||
|
movs r0, #4
|
||||||
|
mov r1, lr
|
||||||
|
tst r0, r1
|
||||||
|
beq stacking_used_msp
|
||||||
|
mrs r0, psp
|
||||||
|
b vPortSVCHandler_C
|
||||||
|
stacking_used_msp:
|
||||||
|
mrs r0, msp
|
||||||
|
b vPortSVCHandler_C
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
END
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue