* 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
		
			
				
	
	
		
			303 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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.
 | 
						|
 *
 | 
						|
 * ----------------------------------------------------------------------
 | 
						|
 *
 | 
						|
 * $Date:        12. June 2020
 | 
						|
 * $Revision:    V2.1.3
 | 
						|
 *
 | 
						|
 * Project:      CMSIS-RTOS2 API
 | 
						|
 * Title:        cmsis_os2.h header file
 | 
						|
 *
 | 
						|
 * Version 2.1.3
 | 
						|
 *    Additional functions allowed to be called from Interrupt Service Routines:
 | 
						|
 *    - osThreadGetId
 | 
						|
 * Version 2.1.2
 | 
						|
 *    Additional functions allowed to be called from Interrupt Service Routines:
 | 
						|
 *    - osKernelGetInfo, osKernelGetState
 | 
						|
 * Version 2.1.1
 | 
						|
 *    Additional functions allowed to be called from Interrupt Service Routines:
 | 
						|
 *    - osKernelGetTickCount, osKernelGetTickFreq
 | 
						|
 *    Changed Kernel Tick type to uint32_t:
 | 
						|
 *    - updated: osKernelGetTickCount, osDelayUntil
 | 
						|
 * Version 2.1.0
 | 
						|
 *    Support for critical and uncritical sections (nesting safe):
 | 
						|
 *    - updated: osKernelLock, osKernelUnlock
 | 
						|
 *    - added: osKernelRestoreLock
 | 
						|
 *    Updated Thread and Event Flags:
 | 
						|
 *    - changed flags parameter and return type from int32_t to uint32_t
 | 
						|
 * Version 2.0.0
 | 
						|
 *    Initial Release
 | 
						|
 *---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
#ifndef CMSIS_OS2_H_
 | 
						|
#define CMSIS_OS2_H_
 | 
						|
 | 
						|
#ifndef __NO_RETURN
 | 
						|
#if   defined(__CC_ARM)
 | 
						|
#define __NO_RETURN __declspec(noreturn)
 | 
						|
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
 | 
						|
#define __NO_RETURN __attribute__((__noreturn__))
 | 
						|
#elif defined(__GNUC__)
 | 
						|
#define __NO_RETURN __attribute__((__noreturn__))
 | 
						|
#elif defined(__ICCARM__)
 | 
						|
#define __NO_RETURN __noreturn
 | 
						|
#else
 | 
						|
#define __NO_RETURN
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#include <furi/base.h>
 | 
						|
 | 
						|
#ifdef  __cplusplus
 | 
						|
extern "C"
 | 
						|
{
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
//  ==== Enumerations, structures, defines ====
 | 
						|
 | 
						|
/// Version information.
 | 
						|
typedef struct {
 | 
						|
  uint32_t                       api;   ///< API version (major.minor.rev: mmnnnrrrr dec).
 | 
						|
  uint32_t                    kernel;   ///< Kernel version (major.minor.rev: mmnnnrrrr dec).
 | 
						|
} osVersion_t;
 | 
						|
 | 
						|
/// Kernel state.
 | 
						|
typedef enum {
 | 
						|
  osKernelInactive        =  0,         ///< Inactive.
 | 
						|
  osKernelReady           =  1,         ///< Ready.
 | 
						|
  osKernelRunning         =  2,         ///< Running.
 | 
						|
  osKernelLocked          =  3,         ///< Locked.
 | 
						|
  osKernelSuspended       =  4,         ///< Suspended.
 | 
						|
  osKernelError           = -1,         ///< Error.
 | 
						|
  osKernelReserved        = 0x7FFFFFFF  ///< Prevents enum down-size compiler optimization.
 | 
						|
} osKernelState_t;
 | 
						|
 | 
						|
/// Timer callback function.
 | 
						|
typedef void (*osTimerFunc_t) (void *argument);
 | 
						|
 | 
						|
/// Timer type.
 | 
						|
typedef enum {
 | 
						|
  osTimerOnce               = 0,          ///< One-shot timer.
 | 
						|
  osTimerPeriodic           = 1           ///< Repeating timer.
 | 
						|
} osTimerType_t;
 | 
						|
 | 
						|
 | 
						|
/// \details Timer ID identifies the timer.
 | 
						|
typedef void *osTimerId_t;
 | 
						|
 | 
						|
/// \details Message Queue ID identifies the message queue.
 | 
						|
typedef void *osMessageQueueId_t;
 | 
						|
 | 
						|
 | 
						|
#ifndef TZ_MODULEID_T
 | 
						|
#define TZ_MODULEID_T
 | 
						|
/// \details Data type that identifies secure software modules called by a process.
 | 
						|
typedef uint32_t TZ_ModuleId_t;
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
/// Attributes structure for timer.
 | 
						|
typedef struct {
 | 
						|
  const char                   *name;   ///< name of the timer
 | 
						|
  uint32_t                 attr_bits;   ///< attribute bits
 | 
						|
  void                      *cb_mem;    ///< memory for control block
 | 
						|
  uint32_t                   cb_size;   ///< size of provided memory for control block
 | 
						|
} osTimerAttr_t;
 | 
						|
 | 
						|
/// Attributes structure for message queue.
 | 
						|
typedef struct {
 | 
						|
  const char                   *name;   ///< name of the message queue
 | 
						|
  uint32_t                 attr_bits;   ///< attribute bits
 | 
						|
  void                      *cb_mem;    ///< memory for control block
 | 
						|
  uint32_t                   cb_size;   ///< size of provided memory for control block
 | 
						|
  void                      *mq_mem;    ///< memory for data storage
 | 
						|
  uint32_t                   mq_size;   ///< size of provided memory for data storage
 | 
						|
} osMessageQueueAttr_t;
 | 
						|
 | 
						|
 | 
						|
//  ==== Kernel Management Functions ====
 | 
						|
 | 
						|
/// Initialize the RTOS Kernel.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osKernelInitialize (void);
 | 
						|
 | 
						|
///  Get RTOS Kernel Information.
 | 
						|
/// \param[out]    version       pointer to buffer for retrieving version information.
 | 
						|
/// \param[out]    id_buf        pointer to buffer for retrieving kernel identification string.
 | 
						|
/// \param[in]     id_size       size of buffer for kernel identification string.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size);
 | 
						|
 | 
						|
/// Get the current RTOS Kernel state.
 | 
						|
/// \return current RTOS Kernel state.
 | 
						|
osKernelState_t osKernelGetState (void);
 | 
						|
 | 
						|
/// Start the RTOS Kernel scheduler.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osKernelStart (void);
 | 
						|
 | 
						|
/// Lock the RTOS Kernel scheduler.
 | 
						|
/// \return previous lock state (1 - locked, 0 - not locked, error code if negative).
 | 
						|
int32_t osKernelLock (void);
 | 
						|
 | 
						|
/// Unlock the RTOS Kernel scheduler.
 | 
						|
/// \return previous lock state (1 - locked, 0 - not locked, error code if negative).
 | 
						|
int32_t osKernelUnlock (void);
 | 
						|
 | 
						|
/// Restore the RTOS Kernel scheduler lock state.
 | 
						|
/// \param[in]     lock          lock state obtained by \ref osKernelLock or \ref osKernelUnlock.
 | 
						|
/// \return new lock state (1 - locked, 0 - not locked, error code if negative).
 | 
						|
int32_t osKernelRestoreLock (int32_t lock);
 | 
						|
 | 
						|
/// Suspend the RTOS Kernel scheduler.
 | 
						|
/// \return time in ticks, for how long the system can sleep or power-down.
 | 
						|
uint32_t osKernelSuspend (void);
 | 
						|
 | 
						|
/// Resume the RTOS Kernel scheduler.
 | 
						|
/// \param[in]     sleep_ticks   time in ticks for how long the system was in sleep or power-down mode.
 | 
						|
void osKernelResume (uint32_t sleep_ticks);
 | 
						|
 | 
						|
/// Get the RTOS kernel tick count.
 | 
						|
/// \return RTOS kernel current tick count.
 | 
						|
uint32_t osKernelGetTickCount (void);
 | 
						|
 | 
						|
/// Get the RTOS kernel tick frequency.
 | 
						|
/// \return frequency of the kernel tick in hertz, i.e. kernel ticks per second.
 | 
						|
uint32_t osKernelGetTickFreq (void);
 | 
						|
 | 
						|
/// Get the RTOS kernel system timer frequency.
 | 
						|
/// \return frequency of the system timer in hertz, i.e. timer ticks per second.
 | 
						|
uint32_t osKernelGetSysTimerFreq (void);
 | 
						|
 | 
						|
//  ==== Generic Wait Functions ====
 | 
						|
 | 
						|
/// Wait for Timeout (Time Delay).
 | 
						|
/// \param[in]     ticks         \ref CMSIS_RTOS_TimeOutValue "time ticks" value
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osDelay (uint32_t ticks);
 | 
						|
 | 
						|
/// Wait until specified time.
 | 
						|
/// \param[in]     ticks         absolute time in ticks
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osDelayUntil (uint32_t ticks);
 | 
						|
 | 
						|
 | 
						|
//  ==== Timer Management Functions ====
 | 
						|
 | 
						|
/// Create and Initialize a timer.
 | 
						|
/// \param[in]     func          function pointer to callback function.
 | 
						|
/// \param[in]     type          \ref osTimerOnce for one-shot or \ref osTimerPeriodic for periodic behavior.
 | 
						|
/// \param[in]     argument      argument to the timer callback function.
 | 
						|
/// \param[in]     attr          timer attributes; NULL: default values.
 | 
						|
/// \return timer ID for reference by other functions or NULL in case of error.
 | 
						|
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);
 | 
						|
 | 
						|
/// Get name of a timer.
 | 
						|
/// \param[in]     timer_id      timer ID obtained by \ref osTimerNew.
 | 
						|
/// \return name as null-terminated string.
 | 
						|
const char *osTimerGetName (osTimerId_t timer_id);
 | 
						|
 | 
						|
/// Start or restart a timer.
 | 
						|
/// \param[in]     timer_id      timer ID obtained by \ref osTimerNew.
 | 
						|
/// \param[in]     ticks         \ref CMSIS_RTOS_TimeOutValue "time ticks" value of the timer.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks);
 | 
						|
 | 
						|
/// Stop a timer.
 | 
						|
/// \param[in]     timer_id      timer ID obtained by \ref osTimerNew.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osTimerStop (osTimerId_t timer_id);
 | 
						|
 | 
						|
/// Check if a timer is running.
 | 
						|
/// \param[in]     timer_id      timer ID obtained by \ref osTimerNew.
 | 
						|
/// \return 0 not running, 1 running.
 | 
						|
uint32_t osTimerIsRunning (osTimerId_t timer_id);
 | 
						|
 | 
						|
/// Delete a timer.
 | 
						|
/// \param[in]     timer_id      timer ID obtained by \ref osTimerNew.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osTimerDelete (osTimerId_t timer_id);
 | 
						|
 | 
						|
//  ==== Message Queue Management Functions ====
 | 
						|
 | 
						|
/// Create and Initialize a Message Queue object.
 | 
						|
/// \param[in]     msg_count     maximum number of messages in queue.
 | 
						|
/// \param[in]     msg_size      maximum message size in bytes.
 | 
						|
/// \param[in]     attr          message queue attributes; NULL: default values.
 | 
						|
/// \return message queue ID for reference by other functions or NULL in case of error.
 | 
						|
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr);
 | 
						|
 | 
						|
/// Get name of a Message Queue object.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \return name as null-terminated string.
 | 
						|
const char *osMessageQueueGetName (osMessageQueueId_t mq_id);
 | 
						|
 | 
						|
/// Put a Message into a Queue or timeout if Queue is full.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \param[in]     msg_ptr       pointer to buffer with message to put into a queue.
 | 
						|
/// \param[in]     msg_prio      message priority.
 | 
						|
/// \param[in]     timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout);
 | 
						|
 | 
						|
/// Get a Message from a Queue or timeout if Queue is empty.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \param[out]    msg_ptr       pointer to buffer for message to get from a queue.
 | 
						|
/// \param[out]    msg_prio      pointer to buffer for message priority or NULL.
 | 
						|
/// \param[in]     timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout);
 | 
						|
 | 
						|
/// Get maximum number of messages in a Message Queue.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \return maximum number of messages.
 | 
						|
uint32_t osMessageQueueGetCapacity (osMessageQueueId_t mq_id);
 | 
						|
 | 
						|
/// Get maximum message size in a Message Queue.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \return maximum message size in bytes.
 | 
						|
uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t mq_id);
 | 
						|
 | 
						|
/// Get number of queued messages in a Message Queue.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \return number of queued messages.
 | 
						|
uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id);
 | 
						|
 | 
						|
/// Get number of available slots for messages in a Message Queue.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \return number of available slots for messages.
 | 
						|
uint32_t osMessageQueueGetSpace (osMessageQueueId_t mq_id);
 | 
						|
 | 
						|
/// Reset a Message Queue to initial empty state.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id);
 | 
						|
 | 
						|
/// Delete a Message Queue object.
 | 
						|
/// \param[in]     mq_id         message queue ID obtained by \ref osMessageQueueNew.
 | 
						|
/// \return status code that indicates the execution status of the function.
 | 
						|
osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id);
 | 
						|
 | 
						|
 | 
						|
#ifdef  __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif  // CMSIS_OS2_H_
 |