/*
 * Copyright (c) 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.
 */
/* Please refer to http://www.freertos.org/a00110.html for refernce. */
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/******************************************************************************
 * Defines
 ******************************************************************************/
/* Hardware features */
#define configENABLE_MPU                                0
#define configENABLE_FPU                                0
#define configENABLE_TRUSTZONE                          0
/* Scheduling */
#define configCPU_CLOCK_HZ                              @SYSTEM_CORE_CLOCK@
#define configUSE_PORT_OPTIMISED_TASK_SELECTION         0
#define configUSE_PREEMPTION                            1
#define configUSE_TIME_SLICING                          0
#define configMAX_PRIORITIES                            5
#define configIDLE_SHOULD_YIELD                         1
#define configUSE_16_BIT_TICKS                          0
#define configRUN_FREERTOS_SECURE_ONLY                  1
/* Stack and heap */
#define configMINIMAL_STACK_SIZE                        (uint16_t)128
#define configMINIMAL_SECURE_STACK_SIZE                 1024
#define configTOTAL_HEAP_SIZE                           (size_t)(50 * 1024)
#define configMAX_TASK_NAME_LEN                         12
/* OS features */
#define configUSE_MUTEXES                               1
#define configUSE_TICKLESS_IDLE                         1
#define configUSE_APPLICATION_TASK_TAG                  0
#define configUSE_NEWLIB_REENTRANT                      0
#define configUSE_CO_ROUTINES                           0
#define configUSE_COUNTING_SEMAPHORES                   1
#define configUSE_RECURSIVE_MUTEXES                     1
#define configUSE_QUEUE_SETS                            0
#define configUSE_TASK_NOTIFICATIONS                    1
#define configUSE_TRACE_FACILITY                        1
/* Hooks */
#define configUSE_IDLE_HOOK                             0
#define configUSE_TICK_HOOK                             0
#define configUSE_MALLOC_FAILED_HOOK                    0
/* Debug features */
#define configCHECK_FOR_STACK_OVERFLOW                  0
#define configASSERT(x)                                 if ((x) == 0) { taskDISABLE_INTERRUPTS(); for( ;; ); }
#define configQUEUE_REGISTRY_SIZE                       0
/* Timers and queues */
#define configUSE_TIMERS                                0
#define configTIMER_TASK_PRIORITY                       3
#define configTIMER_TASK_STACK_DEPTH                    configMINIMAL_STACK_SIZE
#define configTIMER_QUEUE_LENGTH                        5
/* Task settings */
#define INCLUDE_vTaskPrioritySet                        1
#define INCLUDE_uxTaskPriorityGet                       1
#define INCLUDE_vTaskDelete                             1
#define INCLUDE_vTaskCleanUpResources                   0
#define INCLUDE_vTaskSuspend                            1
#define INCLUDE_vTaskDelayUntil                         1
#define INCLUDE_vTaskDelay                              1
#define INCLUDE_uxTaskGetStackHighWaterMark             0
#define INCLUDE_xTaskGetIdleTaskHandle                  0
#define INCLUDE_eTaskGetState                           1
#define INCLUDE_xTaskResumeFromISR                      0
#define INCLUDE_xTaskGetCurrentTaskHandle               1
#define INCLUDE_xTaskGetSchedulerState                  0
#define INCLUDE_xSemaphoreGetMutexHolder                0
#define INCLUDE_xTimerPendFunctionCall                  1
#define configUSE_STATS_FORMATTING_FUNCTIONS            1
#define configCOMMAND_INT_MAX_OUTPUT_SIZE               2048
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS                                 __NVIC_PRIO_BITS
#else
#define configPRIO_BITS                                 3
#endif
/* Interrupt settings */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         0x07
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5
#define configKERNEL_INTERRUPT_PRIORITY                 (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
#ifndef __IASMARM__
    #define configGENERATE_RUN_TIME_STATS               0
    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
    #define portGET_RUN_TIME_COUNTER_VALUE()            0
    #define configTICK_RATE_HZ                          (TickType_t)10000
#endif /* __IASMARM__ */
#if defined(CPU_CORTEX_M3) || defined(CPU_CORTEX_M4) || defined(CPU_CORTEX_M7)
#define xPortPendSVHandler                              PendSV_Handler
#define vPortSVCHandler                                 SVC_Handler
#define xPortSysTickHandler                             SysTick_Handler
#endif
#endif /* FREERTOS_CONFIG_H */
