/**************************************************************************/ /* */ /* Copyright (c) Microsoft Corporation. All rights reserved. */ /* */ /* This software is licensed under the Microsoft Software License */ /* Terms for Microsoft Azure RTOS. Full text of the license can be */ /* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ /* and in the root directory of this software. */ /* */ /**************************************************************************/ /**************************************************************************/ /**************************************************************************/ /** */ /** ThreadX Component */ /** */ /** ThreadX MISRA Compliance */ /** */ /**************************************************************************/ /**************************************************************************/ /**************************************************************************/ /**************************************************************************/ /** */ /** _tx_version_id */ /** */ /**************************************************************************/ /**************************************************************************/ #ifndef TX_MISRA_ENABLE #include "tx_api.h" #else #define TX_THREAD_INIT //CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.1 MISRA C Compliant *"; #include "tx_api.h" #include "tx_thread.h" #include "tx_trace.h" /**************************************************************************/ /**************************************************************************/ /** */ /** VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size); */ /** */ /**************************************************************************/ /**************************************************************************/ VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size) { memset(ptr, (INT)value, size); } /**************************************************************************/ /**************************************************************************/ /** */ /** UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount); */ /** */ /**************************************************************************/ /**************************************************************************/ UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount) { ptr = ptr + amount; return(ptr); } /**************************************************************************/ /**************************************************************************/ /** */ /** UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount); */ /** */ /**************************************************************************/ /**************************************************************************/ UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount) { ptr = ptr - amount; return(ptr); } /**************************************************************************/ /**************************************************************************/ /** */ /** ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2); */ /** */ /**************************************************************************/ /**************************************************************************/ ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2) { ULONG value; value = (ULONG)(ptr1 - ptr2); return(value); } /**************************************************************************/ /**************************************************************************/ /** */ /** ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr); */ /** */ /**************************************************************************/ /**************************************************************************/ ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr) { return((ULONG) ptr); } /**************************************************************************/ /**************************************************************************/ /** */ /** ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount); */ /** */ /**************************************************************************/ /**************************************************************************/ ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount) { ptr = ptr + amount; return(ptr); } /**************************************************************************/ /**************************************************************************/ /** */ /** ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount); */ /** */ /**************************************************************************/ /**************************************************************************/ ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount) { ptr = ptr - amount; return(ptr); } /**************************************************************************/ /**************************************************************************/ /** */ /** ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2); */ /** */ /**************************************************************************/ /**************************************************************************/ ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2) { ULONG value; value = (ULONG)(ptr1 - ptr2); return(value); } /**************************************************************************/ /**************************************************************************/ /** */ /** VOID *_tx_misra_ulong_to_pointer_convert(ULONG input); */ /** */ /**************************************************************************/ /**************************************************************************/ VOID *_tx_misra_ulong_to_pointer_convert(ULONG input) { return((VOID *) input); } /**************************************************************************/ /**************************************************************************/ /** */ /** VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, */ /** UINT size); */ /** */ /**************************************************************************/ /**************************************************************************/ VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, UINT size) { ULONG *s, *d; UINT z; s = *source; d = *destination; z = size; *(d) = *(s); (d)++; (s)++; if ((z) > ((UINT) 1)) { (z)--; while ((z)) { *(d) = *(s); (d)++; (s)++; (z)--; } } *source = s; *destination = d; } /**************************************************************************/ /**************************************************************************/ /** */ /** ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, */ /** TX_TIMER_INTERNAL **ptr2); */ /** */ /**************************************************************************/ /**************************************************************************/ ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, TX_TIMER_INTERNAL **ptr2) { ULONG value; value = (ULONG)(ptr1 - ptr2); return(value); } /**************************************************************************/ /**************************************************************************/ /** */ /** TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL */ /** **ptr1, ULONG size); */ /** */ /**************************************************************************/ /**************************************************************************/ TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL **ptr1, ULONG amount) { ptr1 = ptr1 + amount; return(ptr1); } /**************************************************************************/ /**************************************************************************/ /** */ /** VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL */ /** *internal_timer, TX_TIMER **user_timer); */ /** */ /**************************************************************************/ /**************************************************************************/ VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL *internal_timer, TX_TIMER **user_timer) { UCHAR *working_ptr; TX_TIMER *temp_timer; working_ptr = (UCHAR *) internal_timer; temp_timer = (TX_TIMER *) working_ptr; working_ptr = working_ptr - (((UCHAR *) &temp_timer -> tx_timer_internal) - ((UCHAR *) &temp_timer -> tx_timer_id)); *user_timer = (TX_TIMER *) working_ptr; } /**************************************************************************/ /**************************************************************************/ /** */ /** VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, */ /** VOID **highest_stack); */ /** */ /**************************************************************************/ /**************************************************************************/ VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, VOID **highest_stack) { TX_INTERRUPT_SAVE_AREA TX_DISABLE if (((thread_ptr)) && ((thread_ptr) -> tx_thread_id == TX_THREAD_ID)) { if (((ULONG *) (thread_ptr) -> tx_thread_stack_ptr) < ((ULONG *) *highest_stack)) { *highest_stack = (thread_ptr) -> tx_thread_stack_ptr; } if ((*((ULONG *) (thread_ptr) -> tx_thread_stack_start) != TX_STACK_FILL) || (*((ULONG *) (((UCHAR *) (thread_ptr) -> tx_thread_stack_end) + 1)) != TX_STACK_FILL) || (((ULONG *) *highest_stack) < ((ULONG *) (thread_ptr) -> tx_thread_stack_start))) { TX_RESTORE _tx_thread_stack_error_handler((thread_ptr)); TX_DISABLE } if (*(((ULONG *) *highest_stack) - 1) != TX_STACK_FILL) { TX_RESTORE _tx_thread_stack_analyze((thread_ptr)); TX_DISABLE } } TX_RESTORE } #ifdef TX_ENABLE_EVENT_TRACE /**************************************************************************/ /**************************************************************************/ /** */ /** VOID _tx_misra_trace_event_insert(ULONG event_id, */ /** VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, */ /** ULONG info_field_4, ULONG filter, ULONG time_stamp); */ /** */ /**************************************************************************/ /**************************************************************************/ VOID _tx_misra_trace_event_insert(ULONG event_id, VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, ULONG info_field_4, ULONG filter, ULONG time_stamp) { TX_TRACE_BUFFER_ENTRY *trace_event_ptr; ULONG trace_system_state; ULONG trace_priority; TX_THREAD *trace_thread_ptr; trace_event_ptr = _tx_trace_buffer_current_ptr; if ((trace_event_ptr) && (_tx_trace_event_enable_bits & ((ULONG) (filter)))) { TX_TRACE_PORT_EXTENSION trace_system_state = (ULONG) _tx_thread_system_state; trace_thread_ptr = _tx_thread_current_ptr; if (trace_system_state == 0) { trace_priority = trace_thread_ptr -> tx_thread_priority; trace_priority = trace_priority | 0x80000000UL | (trace_thread_ptr -> tx_thread_preempt_threshold << 16); } else if (trace_system_state < 0xF0F0F0F0UL) { trace_priority = (ULONG) trace_thread_ptr; trace_thread_ptr = (TX_THREAD *) 0xFFFFFFFFUL; } else { trace_thread_ptr = (TX_THREAD *) 0xF0F0F0F0UL; trace_priority = 0; } trace_event_ptr -> tx_trace_buffer_entry_thread_pointer = (ULONG) trace_thread_ptr; trace_event_ptr -> tx_trace_buffer_entry_thread_priority = (ULONG) trace_priority; trace_event_ptr -> tx_trace_buffer_entry_event_id = (ULONG) (event_id); trace_event_ptr -> tx_trace_buffer_entry_time_stamp = (ULONG) (time_stamp); #ifdef TX_MISRA_ENABLE trace_event_ptr -> tx_trace_buffer_entry_info_1 = (ULONG) (info_field_1); trace_event_ptr -> tx_trace_buffer_entry_info_2 = (ULONG) (info_field_2); trace_event_ptr -> tx_trace_buffer_entry_info_3 = (ULONG) (info_field_3); trace_event_ptr -> tx_trace_buffer_entry_info_4 = (ULONG) (info_field_4); #else trace_event_ptr -> tx_trace_buffer_entry_information_field_1 = (ULONG) (info_field_1); trace_event_ptr -> tx_trace_buffer_entry_information_field_2 = (ULONG) (info_field_2); trace_event_ptr -> tx_trace_buffer_entry_information_field_3 = (ULONG) (info_field_3); trace_event_ptr -> tx_trace_buffer_entry_information_field_4 = (ULONG) (info_field_4); #endif trace_event_ptr++; if (trace_event_ptr >= _tx_trace_buffer_end_ptr) { trace_event_ptr = _tx_trace_buffer_start_ptr; _tx_trace_buffer_current_ptr = trace_event_ptr; _tx_trace_header_ptr -> tx_trace_header_buffer_current_pointer = (ULONG) trace_event_ptr; if (_tx_trace_full_notify_function) (_tx_trace_full_notify_function)((VOID *) _tx_trace_header_ptr); } else { _tx_trace_buffer_current_ptr = trace_event_ptr; _tx_trace_header_ptr -> tx_trace_header_buffer_current_pointer = (ULONG) trace_event_ptr; } } } /**************************************************************************/ /**************************************************************************/ /** */ /** ULONG _tx_misra_time_stamp_get(VOID); */ /** */ /**************************************************************************/ /**************************************************************************/ ULONG _tx_misra_time_stamp_get(VOID) { /* Return time stamp. */ return(0); } #endif /**************************************************************************/ /**************************************************************************/ /** */ /** UINT _tx_misra_always_true(void); */ /** */ /**************************************************************************/ /**************************************************************************/ UINT _tx_misra_always_true(void) { return(TX_TRUE); } /******************************************************************************************/ /******************************************************************************************/ /** */ /** UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr); */ /** */ /******************************************************************************************/ /******************************************************************************************/ UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr) { /* Return an indirect UCHAR pointer. */ return((UCHAR **) ((VOID *) return_ptr)); } /***************************************************************************************/ /***************************************************************************************/ /** */ /** UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer); */ /** */ /***************************************************************************************/ /***************************************************************************************/ UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer) { /* Return an indirect UCHAR pointer. */ return((UCHAR **) ((VOID *) pointer)); } /***********************************************************************************/ /***********************************************************************************/ /** */ /** UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool); */ /** */ /***********************************************************************************/ /***********************************************************************************/ UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool) { /* Return a UCHAR pointer. */ return((UCHAR *) ((VOID *) pool)); } /******************************************************************************************/ /******************************************************************************************/ /** */ /** TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer); */ /** */ /******************************************************************************************/ /******************************************************************************************/ TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer) { /* Return a block pool pointer. */ return((TX_BLOCK_POOL *) ((VOID *) pointer)); } /*****************************************************************************/ /*****************************************************************************/ /** */ /** UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer); */ /** */ /*****************************************************************************/ /*****************************************************************************/ UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer) { /* Return a UCHAR pointer. */ return((UCHAR *) ((VOID *) pointer)); } /************************************************************************************/ /************************************************************************************/ /** */ /** TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer); */ /** */ /************************************************************************************/ /************************************************************************************/ TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer) { /* Return a UCHAR pointer. */ return((TX_BLOCK_POOL *) ((VOID *) pointer)); } /**************************************************************************************/ /**************************************************************************************/ /** */ /** UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer); */ /** */ /**************************************************************************************/ /**************************************************************************************/ UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer) { /* Return a UCHAR pointer. */ return((UCHAR **) ((VOID *) pointer)); } /*****************************************************************************************/ /*****************************************************************************************/ /** */ /** TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer); */ /** */ /*****************************************************************************************/ /*****************************************************************************************/ TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer) { /* Return a byte pool pointer. */ return((TX_BYTE_POOL *) ((VOID *) pointer)); } /***************************************************************************************/ /***************************************************************************************/ /** */ /** UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool); */ /** */ /***************************************************************************************/ /***************************************************************************************/ UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool) { /* Return a UCHAR pointer. */ return((UCHAR *) ((VOID *) pool)); } /*****************************************************************************************/ /*****************************************************************************************/ /** */ /** ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer); */ /** */ /*****************************************************************************************/ /*****************************************************************************************/ ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer) { /* Return an align time pointer. */ return((ALIGN_TYPE *) ((VOID *) pointer)); } /****************************************************************************************************/ /****************************************************************************************************/ /** */ /** TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer); */ /** */ /****************************************************************************************************/ /****************************************************************************************************/ TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer) { /* Return a byte pool pointer. */ return((TX_BYTE_POOL **) ((VOID *) pointer)); } /**************************************************************************************************/ /**************************************************************************************************/ /** */ /** TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer); */ /** */ /**************************************************************************************************/ /**************************************************************************************************/ TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer) { /* Return event flags pointer. */ return((TX_EVENT_FLAGS_GROUP *) ((VOID *) pointer)); } /*****************************************************************************/ /*****************************************************************************/ /** */ /** ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer); */ /** */ /*****************************************************************************/ /*****************************************************************************/ ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer) { /* Return a ULONG pointer. */ return((ULONG *) ((VOID *) pointer)); } /********************************************************************************/ /********************************************************************************/ /** */ /** TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer); */ /** */ /********************************************************************************/ /********************************************************************************/ TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer) { /* Return a mutex pointer. */ return((TX_MUTEX *) ((VOID *) pointer)); } /**************************************************************************/ /**************************************************************************/ /** */ /** UINT _tx_misra_status_get(UINT status); */ /** */ /**************************************************************************/ /**************************************************************************/ UINT _tx_misra_status_get(UINT status) { (VOID)status; /* Return a successful status. */ return(TX_SUCCESS); } /********************************************************************************/ /********************************************************************************/ /** */ /** TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer); */ /** */ /********************************************************************************/ /********************************************************************************/ TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer) { /* Return queue pointer. */ return((TX_QUEUE *) ((VOID *) pointer)); } /****************************************************************************************/ /****************************************************************************************/ /** */ /** TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer); */ /** */ /****************************************************************************************/ /****************************************************************************************/ TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer) { /* Return semaphore pointer. */ return((TX_SEMAPHORE *) ((VOID *) pointer)); } /**************************************************************************/ /**************************************************************************/ /** */ /** VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer); */ /** */ /**************************************************************************/ /**************************************************************************/ VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer) { /* Return a VOID pointer. */ return((VOID *) ((VOID *) pointer)); } /*********************************************************************************/ /*********************************************************************************/ /** */ /** TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value); */ /** */ /*********************************************************************************/ /*********************************************************************************/ TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value) { /* Return a thread pointer. */ return((TX_THREAD *) ((VOID *) value)); } /***************************************************************************************************/ /***************************************************************************************************/ /** */ /** VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer); */ /** */ /***************************************************************************************************/ /***************************************************************************************************/ VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer) { /* Return a void pointer. */ return((VOID *) ((VOID *) pointer)); } /***************************************************************************************/ /***************************************************************************************/ /** */ /** CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer); */ /** */ /***************************************************************************************/ /***************************************************************************************/ CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer) { /* Return a CHAR pointer. */ return((CHAR *) ((VOID *) pointer)); } /**********************************************************************************/ /**********************************************************************************/ /** */ /** TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer); */ /** */ /**********************************************************************************/ /**********************************************************************************/ TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer) { /* Return thread pointer. */ return((TX_THREAD *) ((VOID *) pointer)); } #ifdef TX_ENABLE_EVENT_TRACE /************************************************************************************************/ /************************************************************************************************/ /** */ /** UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer); */ /** */ /************************************************************************************************/ /************************************************************************************************/ UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer) { /* Return a UCHAR pointer. */ return((UCHAR *) ((VOID *) pointer)); } /************************************************************************************************/ /************************************************************************************************/ /** */ /** TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer); */ /** */ /************************************************************************************************/ /************************************************************************************************/ TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer) { /* Return an object entry pointer. */ return((TX_TRACE_OBJECT_ENTRY *) ((VOID *) pointer)); } /******************************************************************************************/ /******************************************************************************************/ /** */ /** TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer); */ /** */ /******************************************************************************************/ /******************************************************************************************/ TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer) { /* Return a trace header pointer. */ return((TX_TRACE_HEADER *) ((VOID *) pointer)); } /***********************************************************************************************/ /***********************************************************************************************/ /** */ /** TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer); */ /** */ /***********************************************************************************************/ /***********************************************************************************************/ TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer) { /* Return a trace buffer entry pointer. */ return((TX_TRACE_BUFFER_ENTRY *) ((VOID *) pointer)); } /***********************************************************************************************/ /***********************************************************************************************/ /** */ /** UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer); */ /** */ /***********************************************************************************************/ /***********************************************************************************************/ UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer) { /* Return a UCHAR pointer. */ return((UCHAR *) ((VOID *) pointer)); } #endif /***********************************************************************************************/ /***********************************************************************************************/ /** */ /** UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer); */ /** */ /***********************************************************************************************/ /***********************************************************************************************/ UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer) { /* Return a UCHAR pointer. */ return((UCHAR *) ((VOID *) pointer)); } #endif