* Furi: remove CMSIS thread api, migrate to FuriThread, remove unused CMSIS APIs * Furi: magic thread catcher validating thread completion; backtrace improver * Furi: allow furi_thread_get_current_id outside of thread context * Furi: use IRQ instead of ISR for core primitives
		
			
				
	
	
		
			320 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			320 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* --------------------------------------------------------------------------
 | 
						|
 * Copyright (c) 2013-2021 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
 | 
						|
 | 
						|
#if defined(_RTE_)
 | 
						|
#include "RTE_Components.h"             // Component selection
 | 
						|
#include CMSIS_device_header
 | 
						|
 | 
						|
/* Configuration and component setup check */
 | 
						|
#if defined(RTE_Compiler_EventRecorder)
 | 
						|
  #if !defined(EVR_FREERTOS_DISABLE)
 | 
						|
    #define USE_TRACE_EVENT_RECORDER
 | 
						|
    /*
 | 
						|
      FreeRTOS provides functions and hooks to support execution tracing. This
 | 
						|
      functionality is only enabled if configUSE_TRACE_FACILITY == 1.
 | 
						|
      Set #define configUSE_TRACE_FACILITY 1 in FreeRTOSConfig.h to enable trace events.
 | 
						|
    */
 | 
						|
    #if (configUSE_TRACE_FACILITY == 0)
 | 
						|
      #error "Definition configUSE_TRACE_FACILITY must equal 1 to enable FreeRTOS trace events."
 | 
						|
    #endif
 | 
						|
  #endif
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(RTE_RTOS_FreeRTOS_HEAP_1)
 | 
						|
  #define USE_FreeRTOS_HEAP_1
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(RTE_RTOS_FreeRTOS_HEAP_5)
 | 
						|
  #define USE_FreeRTOS_HEAP_5
 | 
						|
#endif
 | 
						|
#endif /* _RTE_ */
 | 
						|
 | 
						|
/*
 | 
						|
  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 furi_thread_enumerate 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_xTaskDelayUntil == 0)
 | 
						|
  /*
 | 
						|
    CMSIS-RTOS2 function osDelayUntil uses FreeRTOS function xTaskDelayUntil. In case if
 | 
						|
    osDelayUntil is not used in the application image, compiler will optimize it away.
 | 
						|
    Set #define INCLUDE_xTaskDelayUntil 1 to fix this error.
 | 
						|
  */
 | 
						|
  #error "Definition INCLUDE_xTaskDelayUntil 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, furi_thread_flags_clear and furi_thread_flags_get. 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 furi_thread_get_stack_space uses FreeRTOS function uxTaskGetStackHighWaterMark.
 | 
						|
    In case if furi_thread_get_stack_space 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 furi_thread_enumerate 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 furi_thread_enumerate 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 furi_thread_enumerate."
 | 
						|
  #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
 | 
						|
 | 
						|
#endif /* FREERTOS_OS2_H_ */
 |