/*! * \file OSAL.h * * \brief The header of OSAL.c * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * * _ __ _ ________ _ * | |/ /(_)___ / ____/ /_ (_)___ * | // / __ \/ / / __ \/ / __ \ * / |/ / / / / /___/ / / / / /_/ / * /_/|_/_/_/ /_/\____/_/ /_/_/ .___/ * /_/ * (C) 2022-2025 XinChip * * \endcode * * \author ( XinChip ) Alex-J * * \author ( XinChip ) */ #ifndef OSAL_H #define OSAL_H #ifdef __cplusplus extern "C" { #endif /********************************************************************* * INCLUDES */ #include #include "comdef.h" #include "OSAL_Memory.h" #include "OSAL_Timers.h" #ifdef USE_ICALL #include #endif /* USE_ICALL */ /********************************************************************* * MACROS */ #if ( UINT_MAX == 65535 ) /* 8-bit and 16-bit devices */ #define osal_offsetof(type, member) ((uint16) &(((type *) 0)->member)) #else /* 32-bit devices */ #define osal_offsetof(type, member) ((uint32) &(((type *) 0)->member)) #endif #define OSAL_MSG_NEXT(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->next #define OSAL_MSG_Q_INIT(q_ptr) *(q_ptr) = NULL #define OSAL_MSG_Q_EMPTY(q_ptr) (*(q_ptr) == NULL) #define OSAL_MSG_Q_HEAD(q_ptr) (*(q_ptr)) #define OSAL_MSG_LEN(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->len #define OSAL_MSG_ID(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id /********************************************************************* * CONSTANTS */ /*** Interrupts ***/ #define INTS_ALL 0xFF /********************************************************************* * TYPEDEFS */ #ifdef USE_ICALL typedef ICall_MsgHdr osal_msg_hdr_t; #else /* USE_ICALL */ typedef struct { void *next; #ifdef OSAL_PORT2TIRTOS /* Limited OSAL port to TI-RTOS requires compatibility with ROM * code compiled with USE_ICALL compile flag. */ uint32 reserved; #endif /* OSAL_PORT2TIRTOS */ uint16 len; uint8 dest_id; } osal_msg_hdr_t; #endif /* USE_ICALL */ typedef struct { uint8 event; uint8 status; } osal_event_hdr_t; typedef void * osal_msg_q_t; #ifdef USE_ICALL /* High resolution timer callback function type */ typedef void (*osal_highres_timer_cback_t)(void *arg); #endif /* USE_ICALL */ /********************************************************************* * GLOBAL VARIABLES */ #ifdef USE_ICALL extern ICall_Semaphore osal_semaphore; extern ICall_EntityID osal_entity; extern uint_least32_t osal_tickperiod; extern void (*osal_eventloop_hook)(void); #endif /* USE_ICALL */ /********************************************************************* * FUNCTIONS */ /*** Message Management ***/ /* * Task Message Allocation */ extern uint8 * osal_msg_allocate(uint16 len ); /* * Task Message Deallocation */ extern uint8 osal_msg_deallocate( uint8 *msg_ptr ); /* * Send a Task Message */ extern uint8 osal_msg_send( uint8 destination_task, uint8 *msg_ptr ); /* * Push a Task Message to head of queue */ extern uint8 osal_msg_push_front( uint8 destination_task, uint8 *msg_ptr ); /* * Receive a Task Message */ extern uint8 *osal_msg_receive( uint8 task_id ); /* * Find in place a matching Task Message / Event. */ extern osal_event_hdr_t *osal_msg_find(uint8 task_id, uint8 event); /* * Count the number of queued OSAL messages matching Task ID / Event. */ extern uint8 osal_msg_count(uint8 task_id, uint8 event); /* * Enqueue a Task Message */ extern void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr ); /* * Enqueue a Task Message Up to Max */ extern uint8 osal_msg_enqueue_max( osal_msg_q_t *q_ptr, void *msg_ptr, uint8 max ); /* * Dequeue a Task Message */ extern void *osal_msg_dequeue( osal_msg_q_t *q_ptr ); /* * Push a Task Message to head of queue */ extern void osal_msg_push( osal_msg_q_t *q_ptr, void *msg_ptr ); /* * Extract and remove a Task Message from queue */ extern void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr ); #ifdef USE_ICALL extern ICall_Errno osal_service_entry(ICall_FuncArgsHdr *args); #endif /* USE_ICALL */ /*** Task Synchronization ***/ /* * Set a Task Event */ extern uint8 osal_set_event( uint8 task_id, uint16 event_flag ); /* * Clear a Task Event */ extern uint8 osal_clear_event( uint8 task_id, uint16 event_flag ); /*** Interrupt Management ***/ /* * Register Interrupt Service Routine (ISR) */ extern uint8 osal_isr_register( uint8 interrupt_id, void (*isr_ptr)( uint8* ) ); /* * Enable Interrupt */ extern uint8 osal_int_enable( uint8 interrupt_id ); /* * Disable Interrupt */ extern uint8 osal_int_disable( uint8 interrupt_id ); /*** Task Management ***/ #ifdef USE_ICALL /* * Enroll dispatcher registered entity ID */ extern void osal_enroll_dispatchid(uint8 taskid, ICall_EntityID dispatchid); /* * Enroll an OSAL task to use another OSAL task's enrolled entity ID * when sending a message. */ extern void osal_enroll_senderid(uint8 taskid, ICall_EntityID dispatchid); /* * Enroll entity ID to be used as sender entity ID for non OSAL task */ extern void osal_enroll_notasksender(ICall_EntityID dispatchid); #endif /* USE_ICALL */ /* * Initialize the Task System */ extern uint8 osal_init_system( void ); /* * System Processing Loop */ #if defined (ZBIT) extern __declspec(dllexport) void osal_start_system( void ); #else extern void osal_start_system( void ); #endif /* * One Pass Throu the OSAL Processing Loop */ extern void osal_run_system( void ); /* * Get the active task ID */ extern uint8 osal_self( void ); /*** Helper Functions ***/ /* * String Length */ extern int osal_strlen( char *pString ); /* * Memory copy */ extern void *osal_memcpy( void*, const void GENERIC *, unsigned int ); /* * Memory Duplicate - allocates and copies */ extern void *osal_memdup( const void GENERIC *src, unsigned int len ); /* * Reverse Memory copy */ extern void *osal_revmemcpy( void*, const void GENERIC *, unsigned int ); /* * Memory compare */ extern uint8 osal_memcmp( const void GENERIC *src1, const void GENERIC *src2, unsigned int len ); /* * Memory set */ extern void *osal_memset( void *dest, uint8 value, int len ); /* * Build a uint16 out of 2 bytes (0 then 1). */ extern uint16 osal_build_uint16( uint8 *swapped ); /* * Build a uint32 out of sequential bytes. */ extern uint32 osal_build_uint32( uint8 *swapped, uint8 len ); /* * Convert long to ascii string */ #if !defined ( ZBIT ) && !defined ( ZBIT2 ) && !defined (UBIT) extern uint8 *_ltoa( uint32 l, uint8 * buf, uint8 radix ); #endif /* * Random number generator */ extern uint16 osal_rand( void ); /* * Buffer an uint32 value - LSB first. */ extern uint8* osal_buffer_uint32( uint8 *buf, uint32 val ); /* * Buffer an uint24 value - LSB first */ extern uint8* osal_buffer_uint24( uint8 *buf, uint24 val ); /* * Is all of the array elements set to a value? */ extern uint8 osal_isbufset( uint8 *buf, uint8 val, uint8 len ); /********************************************************************* *********************************************************************/ #ifdef __cplusplus } #endif #endif /* OSAL_H */