| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562 |
- /***************************************************************************
- * Copyright (c) 2024 Microsoft Corporation
- *
- * This program and the accompanying materials are made available under the
- * terms of the MIT License which is available at
- * https://opensource.org/licenses/MIT.
- *
- * SPDX-License-Identifier: MIT
- **************************************************************************/
- /**************************************************************************/
- /**************************************************************************/
- /** */
- /** ThreadX Component */
- /** */
- /** Trace */
- /** */
- /**************************************************************************/
- /**************************************************************************/
- /**************************************************************************/
- /* */
- /* COMPONENT DEFINITION RELEASE */
- /* */
- /* tx_trace.h PORTABLE SMP */
- /* 6.1 */
- /* AUTHOR */
- /* */
- /* William E. Lamie, Microsoft Corporation */
- /* */
- /* DESCRIPTION */
- /* */
- /* This file defines the ThreadX trace component, including constants */
- /* and structure definitions as well as external references. It is */
- /* assumed that tx_api.h and tx_port.h have already been included. */
- /* */
- /* RELEASE HISTORY */
- /* */
- /* DATE NAME DESCRIPTION */
- /* */
- /* 05-19-2020 William E. Lamie Initial Version 6.0 */
- /* 09-30-2020 Yuxin Zhou Modified comment(s), */
- /* resulting in version 6.1 */
- /* */
- /**************************************************************************/
- /* Include necessary system files. */
- #ifndef TX_TRACE_H
- #define TX_TRACE_H
- /* Determine if tracing is enabled. If not, simply define the in-line trace
- macros to whitespace. */
- #ifndef TX_ENABLE_EVENT_TRACE
- #define TX_TRACE_INITIALIZE
- #define TX_TRACE_OBJECT_REGISTER(t,p,n,a,b)
- #define TX_TRACE_OBJECT_UNREGISTER(o)
- #define TX_TRACE_IN_LINE_INSERT(i,a,b,c,d,f)
- #else
- /* Event tracing is enabled. */
- /* Ensure that the thread component information is included. */
- #include "tx_thread.h"
- /* Define trace port-specfic extension to white space if it isn't defined
- already. */
- #ifndef TX_TRACE_PORT_EXTENSION
- #define TX_TRACE_PORT_EXTENSION
- #endif
- /* Define the default clock source for trace event entry time stamp. The following two item are port specific.
- For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock
- source constants would be:
- #define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024)
- #define TX_TRACE_TIME_MASK 0x0000FFFFUL
- */
- #ifndef TX_TRACE_TIME_SOURCE
- #define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time
- #endif
- #ifndef TX_TRACE_TIME_MASK
- #define TX_TRACE_TIME_MASK 0xFFFFFFFFUL
- #endif
- /* Define the ID showing the event trace buffer is valid. */
- #define TX_TRACE_VALID 0x54585442UL
- /* ThreadX Trace Description. The ThreadX Trace feature is designed to capture
- events in real-time in a circular event buffer. This buffer may be analyzed by other
- tools. The high-level format of the Trace structure is:
- [Trace Control Header ]
- [Trace Object Registry - Entry 0 ]
- ...
- [Trace Object Registry - Entry "n" ]
- [Trace Buffer - Entry 0 ]
- ...
- [Trace Buffer - Entry "n" ]
- */
- /* Trace Control Header. The Trace Control Header contains information that
- defines the format of the Trace Object Registry as well as the location and
- current entry of the Trace Buffer itself. The high-level format of the
- Trace Control Header is:
- Entry Size Description
- [Trace ID] 4 This 4-byte field contains the ThreadX Trace
- Identification. If the trace buffer is valid, the
- contents are 0x54585442 (TXTB). Since it is written as
- a 32-bit unsigned word, this value is also used to
- determine if the event trace information is in
- little or big endian format.
- [Timer Valid Mask] 4 Mask of valid bits in the 32-bit time stamp. This
- enables use of 32, 24, 16, or event 8-bit timers.
- If the time source is 32-bits, the mask is
- 0xFFFFFFFF. If the time source is 16-bits, the
- mask is 0x0000FFFF.
- [Trace Base Address] 4 The base address for all trace pointer. Subtracting
- the pointer and this address will yield the proper
- offset into the trace buffer.
- [Trace Object Registry Start Pointer] 4 Pointer to the start of Trace Object Registry
- [Reserved] 2 Reserved two bytes - should be 0x0000
- [Trace Object Object Name Size] 2 Number of bytes in object name
- [Trace Object Registry End Pointer] 4 Pointer to the end of Trace Object Registry
- [Trace Buffer Start Pointer] 4 Pointer to the start of the Trace Buffer Area
- [Trace Buffer End Pointer] 4 Pointer to the end of the Trace Buffer Area
- [Trace Buffer Current Pointer] 4 Pointer to the oldest entry in the Trace Buffer.
- This entry will be overwritten on the next event and
- incremented to the next event (wrapping to the top
- if the buffer end pointer is exceeded).
- [Reserved] 4 Reserved 4 bytes, should be 0xAAAAAAAA
- [Reserved] 4 Reserved 4 bytes, should be 0xBBBBBBBB
- [Reserved] 4 Reserved 4 bytes, should be 0xCCCCCCCC
- */
- /* Define the Trace Control Header. */
- typedef struct TX_TRACE_HEADER_STRUCT
- {
- ULONG tx_trace_header_id;
- ULONG tx_trace_header_timer_valid_mask;
- ULONG tx_trace_header_trace_base_address;
- ULONG tx_trace_header_registry_start_pointer;
- USHORT tx_trace_header_reserved1;
- USHORT tx_trace_header_object_name_size;
- ULONG tx_trace_header_registry_end_pointer;
- ULONG tx_trace_header_buffer_start_pointer;
- ULONG tx_trace_header_buffer_end_pointer;
- ULONG tx_trace_header_buffer_current_pointer;
- ULONG tx_trace_header_reserved2;
- ULONG tx_trace_header_reserved3;
- ULONG tx_trace_header_reserved4;
- } TX_TRACE_HEADER;
- /* Trace Object Registry. The Trace Object Registry is used to map the object pointer in the trace buffer to
- the application's name for the object (defined during object creation in ThreadX). */
- #ifndef TX_TRACE_OBJECT_REGISTRY_NAME
- #define TX_TRACE_OBJECT_REGISTRY_NAME 32
- #endif
- /* Define the object name types as well as the contents of any additional parameters that might be useful in
- trace analysis. */
- #define TX_TRACE_OBJECT_TYPE_NOT_VALID ((UCHAR) 0) /* Object is not valid */
- #define TX_TRACE_OBJECT_TYPE_THREAD ((UCHAR) 1) /* P1 = stack start address, P2 = stack size */
- #define TX_TRACE_OBJECT_TYPE_TIMER ((UCHAR) 2) /* P1 = initial ticks, P2 = reschedule ticks */
- #define TX_TRACE_OBJECT_TYPE_QUEUE ((UCHAR) 3) /* P1 = queue size, P2 = message size */
- #define TX_TRACE_OBJECT_TYPE_SEMAPHORE ((UCHAR) 4) /* P1 = initial instances */
- #define TX_TRACE_OBJECT_TYPE_MUTEX ((UCHAR) 5) /* P1 = priority inheritance flag */
- #define TX_TRACE_OBJECT_TYPE_EVENT_FLAGS ((UCHAR) 6) /* none */
- #define TX_TRACE_OBJECT_TYPE_BLOCK_POOL ((UCHAR) 7) /* P1 = total blocks, P2 = block size */
- #define TX_TRACE_OBJECT_TYPE_BYTE_POOL ((UCHAR) 8) /* P1 = total bytes */
- typedef struct TX_TRACE_OBJECT_ENTRY_STRUCT
- {
- UCHAR tx_trace_object_entry_available; /* TX_TRUE -> available */
- UCHAR tx_trace_object_entry_type; /* Types defined above */
- UCHAR tx_trace_object_entry_reserved1; /* Should be zero - except for thread */
- UCHAR tx_trace_object_entry_reserved2; /* Should be zero - except for thread */
- ULONG tx_trace_object_entry_thread_pointer; /* ThreadX object pointer */
- ULONG tx_trace_object_entry_param_1; /* Parameter value defined */
- ULONG tx_trace_object_entry_param_2; /* according to type above */
- UCHAR tx_trace_object_entry_name[TX_TRACE_OBJECT_REGISTRY_NAME]; /* Object name */
- } TX_TRACE_OBJECT_ENTRY;
- /* Trace Buffer Entry. The Trace Buffer Entry contains information about a particular
- event in the system. The high-level format of the Trace Buffer Entry is:
- Entry Size Description
- [Thread Pointer] 4 This 4-byte field contains the pointer to the
- ThreadX thread running that caused the event.
- If this field is NULL, the entry hasn't been used
- yet. If this field is 0xFFFFFFFF, the event occurred
- from within an ISR. If this entry is 0xF0F0F0F0, the
- event occurred during initialization.
- [Thread Priority or 4 This 4-byte field contains the current thread pointer for interrupt
- Current Thread events or the thread preemption-threshold/priority for thread events.
- Preemption-Threshold/
- Priority]
- [Event ID] 4 This 4-byte field contains the Event ID of the event. A value of
- 0xFFFFFFFF indicates the event is invalid. All events are marked
- as invalid during initialization.
- [Time Stamp] 4 This 4-byte field contains the time stamp of the event.
- [Information Field 1] 4 This 4-byte field contains the first 4-bytes of information
- specific to the event.
- [Information Field 2] 4 This 4-byte field contains the second 4-bytes of information
- specific to the event.
- [Information Field 3] 4 This 4-byte field contains the third 4-bytes of information
- specific to the event.
- [Information Field 4] 4 This 4-byte field contains the fourth 4-bytes of information
- specific to the event.
- */
- #define TX_TRACE_INVALID_EVENT 0xFFFFFFFFUL
- /* Define ThreadX Trace Events, along with a brief description of the additional information fields,
- where I1 -> Information Field 1, I2 -> Information Field 2, etc. */
- /* Event numbers 0 through 4095 are reserved by Azure RTOS. Specific event assignments are:
- ThreadX events: 1-199
- FileX events: 200-299
- NetX events: 300-599
- USBX events: 600-999
- User-defined event numbers start at 4096 and continue through 65535, as defined by the constants
- TX_TRACE_USER_EVENT_START and TX_TRACE_USER_EVENT_END, respectively. User events should be based
- on these constants in case the user event number assignment is changed in future releases. */
- /* Define the basic ThreadX thread scheduling events first. */
- #define TX_TRACE_THREAD_RESUME 1 /* I1 = thread ptr, I2 = previous_state, I3 = stack ptr, I4 = next thread */
- #define TX_TRACE_THREAD_SUSPEND 2 /* I1 = thread ptr, I2 = new_state, I3 = stack ptr I4 = next thread */
- #define TX_TRACE_ISR_ENTER 3 /* I1 = stack_ptr, I2 = ISR number, I3 = system state, I4 = preempt disable */
- #define TX_TRACE_ISR_EXIT 4 /* I1 = stack_ptr, I2 = ISR number, I3 = system state, I4 = preempt disable */
- #define TX_TRACE_TIME_SLICE 5 /* I1 = next thread ptr, I2 = system state, I3 = preempt disable, I4 = stack*/
- #define TX_TRACE_RUNNING 6 /* None */
- /* Define the rest of the ThreadX system events. */
- #define TX_TRACE_BLOCK_ALLOCATE 10 /* I1 = pool ptr, I2 = memory ptr, I3 = wait option, I4 = remaining blocks */
- #define TX_TRACE_BLOCK_POOL_CREATE 11 /* I1 = pool ptr, I2 = pool_start, I3 = total blocks, I4 = block size */
- #define TX_TRACE_BLOCK_POOL_DELETE 12 /* I1 = pool ptr, I2 = stack ptr */
- #define TX_TRACE_BLOCK_POOL_INFO_GET 13 /* I1 = pool ptr */
- #define TX_TRACE_BLOCK_POOL_PERFORMANCE_INFO_GET 14 /* I1 = pool ptr */
- #define TX_TRACE_BLOCK_POOL__PERFORMANCE_SYSTEM_INFO_GET 15 /* None */
- #define TX_TRACE_BLOCK_POOL_PRIORITIZE 16 /* I1 = pool ptr, I2 = suspended count, I3 = stack ptr */
- #define TX_TRACE_BLOCK_RELEASE 17 /* I1 = pool ptr, I2 = memory ptr, I3 = suspended, I4 = stack ptr */
- #define TX_TRACE_BYTE_ALLOCATE 20 /* I1 = pool ptr, I2 = memory ptr, I3 = size requested, I4 = wait option */
- #define TX_TRACE_BYTE_POOL_CREATE 21 /* I1 = pool ptr, I2 = start ptr, I3 = pool size, I4 = stack ptr */
- #define TX_TRACE_BYTE_POOL_DELETE 22 /* I1 = pool ptr, I2 = stack ptr */
- #define TX_TRACE_BYTE_POOL_INFO_GET 23 /* I1 = pool ptr */
- #define TX_TRACE_BYTE_POOL_PERFORMANCE_INFO_GET 24 /* I1 = pool ptr */
- #define TX_TRACE_BYTE_POOL__PERFORMANCE_SYSTEM_INFO_GET 25 /* None */
- #define TX_TRACE_BYTE_POOL_PRIORITIZE 26 /* I1 = pool ptr, I2 = suspended count, I3 = stack ptr */
- #define TX_TRACE_BYTE_RELEASE 27 /* I1 = pool ptr, I2 = memory ptr, I3 = suspended, I4 = available bytes */
- #define TX_TRACE_EVENT_FLAGS_CREATE 30 /* I1 = group ptr, I2 = stack ptr */
- #define TX_TRACE_EVENT_FLAGS_DELETE 31 /* I1 = group ptr, I2 = stack ptr */
- #define TX_TRACE_EVENT_FLAGS_GET 32 /* I1 = group ptr, I2 = requested flags, I3 = current flags, I4 = get option*/
- #define TX_TRACE_EVENT_FLAGS_INFO_GET 33 /* I1 = group ptr */
- #define TX_TRACE_EVENT_FLAGS_PERFORMANCE_INFO_GET 34 /* I1 = group ptr */
- #define TX_TRACE_EVENT_FLAGS__PERFORMANCE_SYSTEM_INFO_GET 35 /* None */
- #define TX_TRACE_EVENT_FLAGS_SET 36 /* I1 = group ptr, I2 = flags to set, I3 = set option, I4= suspended count */
- #define TX_TRACE_EVENT_FLAGS_SET_NOTIFY 37 /* I1 = group ptr */
- #define TX_TRACE_INTERRUPT_CONTROL 40 /* I1 = new interrupt posture, I2 = stack ptr */
- #define TX_TRACE_MUTEX_CREATE 50 /* I1 = mutex ptr, I2 = inheritance, I3 = stack ptr */
- #define TX_TRACE_MUTEX_DELETE 51 /* I1 = mutex ptr, I2 = stack ptr */
- #define TX_TRACE_MUTEX_GET 52 /* I1 = mutex ptr, I2 = wait option, I3 = owning thread, I4 = own count */
- #define TX_TRACE_MUTEX_INFO_GET 53 /* I1 = mutex ptr */
- #define TX_TRACE_MUTEX_PERFORMANCE_INFO_GET 54 /* I1 = mutex ptr */
- #define TX_TRACE_MUTEX_PERFORMANCE_SYSTEM_INFO_GET 55 /* None */
- #define TX_TRACE_MUTEX_PRIORITIZE 56 /* I1 = mutex ptr, I2 = suspended count, I3 = stack ptr */
- #define TX_TRACE_MUTEX_PUT 57 /* I1 = mutex ptr, I2 = owning thread, I3 = own count, I4 = stack ptr */
- #define TX_TRACE_QUEUE_CREATE 60 /* I1 = queue ptr, I2 = message size, I3 = queue start, I4 = queue size */
- #define TX_TRACE_QUEUE_DELETE 61 /* I1 = queue ptr, I2 = stack ptr */
- #define TX_TRACE_QUEUE_FLUSH 62 /* I1 = queue ptr, I2 = stack ptr */
- #define TX_TRACE_QUEUE_FRONT_SEND 63 /* I1 = queue ptr, I2 = source ptr, I3 = wait option, I4 = enqueued */
- #define TX_TRACE_QUEUE_INFO_GET 64 /* I1 = queue ptr */
- #define TX_TRACE_QUEUE_PERFORMANCE_INFO_GET 65 /* I1 = queue ptr */
- #define TX_TRACE_QUEUE_PERFORMANCE_SYSTEM_INFO_GET 66 /* None */
- #define TX_TRACE_QUEUE_PRIORITIZE 67 /* I1 = queue ptr, I2 = suspended count, I3 = stack ptr */
- #define TX_TRACE_QUEUE_RECEIVE 68 /* I1 = queue ptr, I2 = destination ptr, I3 = wait option, I4 = enqueued */
- #define TX_TRACE_QUEUE_SEND 69 /* I1 = queue ptr, I2 = source ptr, I3 = wait option, I4 = enqueued */
- #define TX_TRACE_QUEUE_SEND_NOTIFY 70 /* I1 = queue ptr */
- #define TX_TRACE_SEMAPHORE_CEILING_PUT 80 /* I1 = semaphore ptr, I2 = current count, I3 = suspended count,I4 =ceiling */
- #define TX_TRACE_SEMAPHORE_CREATE 81 /* I1 = semaphore ptr, I2 = initial count, I3 = stack ptr */
- #define TX_TRACE_SEMAPHORE_DELETE 82 /* I1 = semaphore ptr, I2 = stack ptr */
- #define TX_TRACE_SEMAPHORE_GET 83 /* I1 = semaphore ptr, I2 = wait option, I3 = current count, I4 = stack ptr */
- #define TX_TRACE_SEMAPHORE_INFO_GET 84 /* I1 = semaphore ptr */
- #define TX_TRACE_SEMAPHORE_PERFORMANCE_INFO_GET 85 /* I1 = semaphore ptr */
- #define TX_TRACE_SEMAPHORE__PERFORMANCE_SYSTEM_INFO_GET 86 /* None */
- #define TX_TRACE_SEMAPHORE_PRIORITIZE 87 /* I1 = semaphore ptr, I2 = suspended count, I2 = stack ptr */
- #define TX_TRACE_SEMAPHORE_PUT 88 /* I1 = semaphore ptr, I2 = current count, I3 = suspended count,I4=stack ptr*/
- #define TX_TRACE_SEMAPHORE_PUT_NOTIFY 89 /* I1 = semaphore ptr */
- #define TX_TRACE_THREAD_CREATE 100 /* I1 = thread ptr, I2 = priority, I3 = stack ptr, I4 = stack_size */
- #define TX_TRACE_THREAD_DELETE 101 /* I1 = thread ptr, I2 = stack ptr */
- #define TX_TRACE_THREAD_ENTRY_EXIT_NOTIFY 102 /* I1 = thread ptr, I2 = thread state, I3 = stack ptr */
- #define TX_TRACE_THREAD_IDENTIFY 103 /* None */
- #define TX_TRACE_THREAD_INFO_GET 104 /* I1 = thread ptr, I2 = thread state */
- #define TX_TRACE_THREAD_PERFORMANCE_INFO_GET 105 /* I1 = thread ptr, I2 = thread state */
- #define TX_TRACE_THREAD_PERFORMANCE_SYSTEM_INFO_GET 106 /* None */
- #define TX_TRACE_THREAD_PREEMPTION_CHANGE 107 /* I1 = thread ptr, I2 = new threshold, I3 = old threshold, I4 =thread state*/
- #define TX_TRACE_THREAD_PRIORITY_CHANGE 108 /* I1 = thread ptr, I2 = new priority, I3 = old priority, I4 = thread state */
- #define TX_TRACE_THREAD_RELINQUISH 109 /* I1 = stack ptr, I2 = next thread ptr */
- #define TX_TRACE_THREAD_RESET 110 /* I1 = thread ptr, I2 = thread state */
- #define TX_TRACE_THREAD_RESUME_API 111 /* I1 = thread ptr, I2 = thread state, I3 = stack ptr */
- #define TX_TRACE_THREAD_SLEEP 112 /* I1 = sleep value, I2 = thread state, I3 = stack ptr */
- #define TX_TRACE_THREAD_STACK_ERROR_NOTIFY 113 /* None */
- #define TX_TRACE_THREAD_SUSPEND_API 114 /* I1 = thread ptr, I2 = thread state, I3 = stack ptr */
- #define TX_TRACE_THREAD_TERMINATE 115 /* I1 = thread ptr, I2 = thread state, I3 = stack ptr */
- #define TX_TRACE_THREAD_TIME_SLICE_CHANGE 116 /* I1 = thread ptr, I2 = new timeslice, I3 = old timeslice */
- #define TX_TRACE_THREAD_WAIT_ABORT 117 /* I1 = thread ptr, I2 = thread state, I3 = stack ptr */
- #define TX_TRACE_TIME_GET 120 /* I1 = current time, I2 = stack ptr */
- #define TX_TRACE_TIME_SET 121 /* I1 = new time */
- #define TX_TRACE_TIMER_ACTIVATE 122 /* I1 = timer ptr */
- #define TX_TRACE_TIMER_CHANGE 123 /* I1 = timer ptr, I2 = initial ticks, I3= reschedule ticks */
- #define TX_TRACE_TIMER_CREATE 124 /* I1 = timer ptr, I2 = initial ticks, I3= reschedule ticks, I4 = enable */
- #define TX_TRACE_TIMER_DEACTIVATE 125 /* I1 = timer ptr, I2 = stack ptr */
- #define TX_TRACE_TIMER_DELETE 126 /* I1 = timer ptr */
- #define TX_TRACE_TIMER_INFO_GET 127 /* I1 = timer ptr, I2 = stack ptr */
- #define TX_TRACE_TIMER_PERFORMANCE_INFO_GET 128 /* I1 = timer ptr */
- #define TX_TRACE_TIMER_PERFORMANCE_SYSTEM_INFO_GET 129 /* None */
- /* Define the an Trace Buffer Entry. */
- typedef struct TX_TRACE_BUFFER_ENTRY_STRUCT
- {
- ULONG tx_trace_buffer_entry_thread_pointer;
- ULONG tx_trace_buffer_entry_thread_priority;
- ULONG tx_trace_buffer_entry_event_id;
- ULONG tx_trace_buffer_entry_time_stamp;
- #ifdef TX_MISRA_ENABLE
- ULONG tx_trace_buffer_entry_info_1;
- ULONG tx_trace_buffer_entry_info_2;
- ULONG tx_trace_buffer_entry_info_3;
- ULONG tx_trace_buffer_entry_info_4;
- #else
- ULONG tx_trace_buffer_entry_information_field_1;
- ULONG tx_trace_buffer_entry_information_field_2;
- ULONG tx_trace_buffer_entry_information_field_3;
- ULONG tx_trace_buffer_entry_information_field_4;
- #endif
- } TX_TRACE_BUFFER_ENTRY;
- /* Trace management component data declarations follow. */
- /* Determine if the initialization function of this component is including
- this file. If so, make the data definitions really happen. Otherwise,
- make them extern so other functions in the component can access them. */
- #ifdef TX_TRACE_INIT
- #define TRACE_DECLARE
- #else
- #define TRACE_DECLARE extern
- #endif
- /* Define the pointer to the start of the trace buffer control structure. */
- TRACE_DECLARE TX_TRACE_HEADER *_tx_trace_header_ptr;
- /* Define the pointer to the start of the trace object registry area in the trace buffer. */
- TRACE_DECLARE TX_TRACE_OBJECT_ENTRY *_tx_trace_registry_start_ptr;
- /* Define the pointer to the end of the trace object registry area in the trace buffer. */
- TRACE_DECLARE TX_TRACE_OBJECT_ENTRY *_tx_trace_registry_end_ptr;
- /* Define the pointer to the starting entry of the actual trace event area of the trace buffer. */
- TRACE_DECLARE TX_TRACE_BUFFER_ENTRY *_tx_trace_buffer_start_ptr;
- /* Define the pointer to the ending entry of the actual trace event area of the trace buffer. */
- TRACE_DECLARE TX_TRACE_BUFFER_ENTRY *_tx_trace_buffer_end_ptr;
- /* Define the pointer to the current entry of the actual trace event area of the trace buffer. */
- TRACE_DECLARE TX_TRACE_BUFFER_ENTRY *_tx_trace_buffer_current_ptr;
- /* Define the trace event enable bits, where each bit represents a type of event that can be enabled
- or disabled dynamically by the application. */
- TRACE_DECLARE ULONG _tx_trace_event_enable_bits;
- /* Define a counter that is used in environments that don't have a timer source. This counter
- is incremented on each use giving each event a unique timestamp. */
- TRACE_DECLARE ULONG _tx_trace_simulated_time;
- /* Define the function pointer used to call the application when the trace buffer wraps. If NULL,
- the application has not registered a callback function. */
- TRACE_DECLARE VOID (*_tx_trace_full_notify_function)(VOID *buffer);
- /* Define the total number of registry entries. */
- TRACE_DECLARE ULONG _tx_trace_total_registry_entries;
- /* Define a counter that is used to track the number of available registry entries. */
- TRACE_DECLARE ULONG _tx_trace_available_registry_entries;
- /* Define an index that represents the start of the registry search. */
- TRACE_DECLARE ULONG _tx_trace_registry_search_start;
- /* Define the event trace macros that are expanded in-line when event tracing is enabled. */
- #ifdef TX_MISRA_ENABLE
- #define TX_TRACE_INFO_FIELD_ASSIGNMENT(a,b,c,d) trace_event_ptr -> tx_trace_buffer_entry_info_1 = (ULONG) (a); trace_event_ptr -> tx_trace_buffer_entry_info_2 = (ULONG) (b); trace_event_ptr -> tx_trace_buffer_entry_info_3 = (ULONG) (c); trace_event_ptr -> tx_trace_buffer_entry_info_4 = (ULONG) (d);
- #else
- #define TX_TRACE_INFO_FIELD_ASSIGNMENT(a,b,c,d) trace_event_ptr -> tx_trace_buffer_entry_information_field_1 = (ULONG) (a); trace_event_ptr -> tx_trace_buffer_entry_information_field_2 = (ULONG) (b); trace_event_ptr -> tx_trace_buffer_entry_information_field_3 = (ULONG) (c); trace_event_ptr -> tx_trace_buffer_entry_information_field_4 = (ULONG) (d);
- #endif
- #define TX_TRACE_INITIALIZE _tx_trace_initialize();
- #define TX_TRACE_OBJECT_REGISTER(t,p,n,a,b) _tx_trace_object_register((UCHAR) (t), (VOID *) (p), (CHAR *) (n), (ULONG) (a), (ULONG) (b));
- #define TX_TRACE_OBJECT_UNREGISTER(o) _tx_trace_object_unregister((VOID *) (o));
- #ifndef TX_TRACE_IN_LINE_INSERT
- #define TX_TRACE_IN_LINE_INSERT(i,a,b,c,d,e) \
- { \
- TX_TRACE_BUFFER_ENTRY *trace_event_ptr; \
- ULONG trace_system_state; \
- ULONG trace_priority; \
- TX_THREAD *trace_thread_ptr; \
- ULONG core; \
- trace_event_ptr = _tx_trace_buffer_current_ptr; \
- if ((trace_event_ptr) && (_tx_trace_event_enable_bits & ((ULONG) (e)))) \
- { \
- TX_TRACE_PORT_EXTENSION \
- trace_system_state = (ULONG) _tx_thread_smp_current_state_get(); \
- TX_THREAD_GET_CURRENT(trace_thread_ptr) \
- \
- if (trace_system_state == ((ULONG) 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 = (ULONG) 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; \
- core = _tx_thread_smp_core_get(); \
- trace_event_ptr -> tx_trace_buffer_entry_event_id = (ULONG) (core << 24) | (i); \
- trace_event_ptr -> tx_trace_buffer_entry_time_stamp = (ULONG) TX_TRACE_TIME_SOURCE; \
- TX_TRACE_INFO_FIELD_ASSIGNMENT((a),(b),(c),(d)) \
- 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; \
- } \
- } \
- }
- #endif
- #endif
- #ifdef TX_SOURCE_CODE
- /* Define internal function prototypes of the trace component, only if compiling ThreadX source code. */
- VOID _tx_trace_initialize(VOID);
- VOID _tx_trace_object_register(UCHAR object_type, VOID *object_ptr, CHAR *object_name, ULONG parameter_1, ULONG parameter_2);
- VOID _tx_trace_object_unregister(VOID *object_ptr);
- #ifdef TX_ENABLE_EVENT_TRACE
- /* Check for MISRA compliance requirements. */
- #ifdef TX_MISRA_ENABLE
- /* Define MISRA-specific routines. */
- UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer);
- TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer);
- TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer);
- TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer);
- UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer);
- #define TX_OBJECT_TO_UCHAR_POINTER_CONVERT(a) _tx_misra_object_to_uchar_pointer_convert((a))
- #define TX_UCHAR_TO_OBJECT_POINTER_CONVERT(a) _tx_misra_uchar_to_object_pointer_convert((a))
- #define TX_UCHAR_TO_HEADER_POINTER_CONVERT(a) _tx_misra_uchar_to_header_pointer_convert((a))
- #define TX_UCHAR_TO_ENTRY_POINTER_CONVERT(a) _tx_misra_uchar_to_entry_pointer_convert((a))
- #define TX_ENTRY_TO_UCHAR_POINTER_CONVERT(a) _tx_misra_entry_to_uchar_pointer_convert((a))
- #else
- #define TX_OBJECT_TO_UCHAR_POINTER_CONVERT(a) ((UCHAR *) ((VOID *) (a)))
- #define TX_UCHAR_TO_OBJECT_POINTER_CONVERT(a) ((TX_TRACE_OBJECT_ENTRY *) ((VOID *) (a)))
- #define TX_UCHAR_TO_HEADER_POINTER_CONVERT(a) ((TX_TRACE_HEADER *) ((VOID *) (a)))
- #define TX_UCHAR_TO_ENTRY_POINTER_CONVERT(a) ((TX_TRACE_BUFFER_ENTRY *) ((VOID *) (a)))
- #define TX_ENTRY_TO_UCHAR_POINTER_CONVERT(a) ((UCHAR *) ((VOID *) (a)))
- #endif
- #endif
- #endif
- #endif
|