Tracealyzer for Azure RTOS ThreadX
Tracealyzer gives an unprecedented insight into the run-time world of Azure RTOS ThreadX systems. Solve problems in a fraction of the time otherwise needed, develop more robust designs and find new ways to improve your software’s performance.
Tracealyzer for Azure RTOS ThreadX visualizes the runtime behavior of your ThreadX system with over 25 graphical views that complements the debugger’s detailed, low-level perspective with the big picture. Tracealyzer gives unprecedented insight that speeds up debugging and provide better means for validation and performance optimization. Issues that otherwise may require many hours, days or even weeks to solve, can with Tracealyzer be understood quickly. See what is really going on in your system and avoid many hours of frustrating trial-and-error troubleshooting!

The visualization is based on traces from a lightweight trace library included in the ThreadX RTOS kernel, so you don’t need a high-end trace debugger. Tracealyzer for Azure RTOS ThreadX displays kernel events like context-switches and ISRs, as well as middleware events from the NetX, FileX and UsbX stacks. You can also log your own custom events, to visualize any event or data in your firmware. Tracealyzer for ThreadX explicitly supports Renesas Synergy and other ports of ThreadX.
All Tracealyzer versions offer an evaluation period with full functionality and also included demo traces, allowing for exploring the features of Tracealyzer without writing a single line of code.
The 25+ views include:
Trace of Tasks, ISRs, RTOS calls and User Events
The main trace view shows you all recorded events visualized on a vertical time-line, including task execution timing, interrupts, system calls and custom user events. The task and interrupt trace are shown as colored rectangles. Events are shown as floating text labels. Zooming is very easy using a click-and-drag selection, which also works as a measurement tool. Tasks and events can be clicked and highlighted for additional information, including timing and event dependencies. The lower right corner contains a powerful filter, and the Finder dialog provides even more powerful filters. When zooming out, this view naturally transforms into an overview where patterns can be studied.
CPU Load
This view presents a horizontal time-line showing the total CPU usage, and also CPU usage per task/interrupt. The CPU Load Graph allows for navigating the main trace view, since a double click in the CPU Load Graph focuses the main trace view on the clicked interval. Zooming is allowed in this view as well, independently of other views, and filters are available for focusing on individual tasks or interrupts.
Task Timing Variations
This is an example of several Actor Instance Graphs, each showing the distributions of a specific timing property for an actor, i.e., a task or interrupt routine. This includes execution time, response time, fragmentation, and several others. Each data point represents one specific execution of a task or interrupt handler. This graph, Response Time, shows the variation in response times for two selected tasks. Tasks instances with high response times may reveal resource conflicts, e.g., where several tasks or interrupts compete for CPU time in a busy interval. This view makes it easier to spot such locations that may indicate problems or possibilities for optimization.
Multiple Views Synchronized
All views with horizontal orientation can be combined in a single parent window, with synchronized scrolling. This allows for spotting patterns that otherwise would be hard to see using individual views, e.g., how the response time depends on other events, and this also allows for greater customization of the user interface.
Communication Flow
Many system calls allow for communication or synchronization between tasks. Tracealyzer understand these dependencies and the Communication Flow graph is a summary of all such dependencies found in the trace, in the form of a directed graph. This is a high-level view of the communication dependencies between tasks and interrupts, including the kernel objects used such as semaphores and message queues. Like in all views, double-clicking on a node opens a related view focused on the particular object. Double-clicking on a kernel object (e.g., a semaphore) opens the Object History view (shown below), a list of all events on the specific kernel object. If double-clicking on a task or interrupt, the Actor History view is opened showing all executions of the actor.
Kernel Object History
This view shows all events on a particular kernel object, such as a message queue, semaphore or mutex. The events are presented as a list, and double-clicking on a list item shows the corresponding system call in the main trace view. For message queues and similar objects with send/receive operations, it is possible to follow a specific message from send to receive, or vice versa, and also to inspect the messages (by sequence number) in the queue at any given time.
Create your own User Events
User-defined events, or User Events, allows you to log any event or data in your embedded application. This gives the flexibility of classic debug “printf” calls, but are much faster as all string formatting is done offline, in the viewer. Since you get the events on the same time-line as the kernel trace, it is easy to correlate the application event with the other views.
Visualize data from your code
When logging “User Events”, data arguments can also be included and plotted to visualize the data over time. By clicking on any data point in the plot, the corresponding User Event is highlighted in the main trace view.
The plotting is highly useful for analysis of control algorithms, as it allows you to correlate the plotted data with the other time-line views to find the cause of any anomalies in the plot.
Most API functions in ThreadX, FileX, NetX and USBX already have trace points that can be recorded just by enabling the general trace support:
ThreadX
tx_event_flags_create
tx_event_flags_delete
tx_event_flags_get
tx_event_flags_info_get
tx_event_flags_performance_info_get
tx_event_flags_performance_system_info_get
tx_event_flags_set
tx_event_flags_set_notify
tx_mutex_create
tx_mutex_delete
tx_mutex_get
tx_mutex_info_get
tx_mutex_performance_info_get
tx_mutex_performance_system_info_get
tx_mutex_prioritize
tx_mutex_put
tx_queue_create
tx_queue_delete
tx_queue_flush
tx_queue_front_send
tx_queue_info_get
tx_queue_performance_info_get
tx_queue_performance_system_info_get
tx_queue_prioritize
tx_queue_receive
tx_queue_send
tx_queue_send_notify
tx_semaphore_ceiling_put
tx_semaphore_create
tx_semaphore_delete
tx_semaphore_get
tx_semaphore_info_get
tx_semaphore_performance_info_get
tx_semaphore_performance_system_info_get
tx_semaphore_prioritize
tx_semaphore_put
tx_semaphore_put_notify
tx_thread_create
tx_thread_delete
tx_thread_entry_exit_notify
tx_thread_identify
tx_thread_info_get
tx_thread_performance_info_get
tx_thread_performance_system_info_get
tx_thread_preemption_change
tx_thread_priority_change
tx_thread_reset
tx_thread_resume
tx_thread_sleep
tx_thread_stack_error_notify
tx_thread_suspend
tx_thread_terminate
tx_thread_time_slice_change
tx_thread_wait_abort
tx_time_get
tx_time_set
tx_timer_activate
tx_timer_change
tx_timer_create
tx_timer_deactivate
tx_timer_delete
tx_timer_info_get
tx_timer_performance_info_get
tx_timer_performance_system_info_get
FileX
fx_directory_attributes_read fx_directory_attributes_set fx_directory_create fx_directory_default_get fx_directory_default_set fx_directory_delete fx_directory_first_entry_find fx_directory_first_full_entry_find fx_directory_information_get fx_directory_local_path_clear fx_directory_local_path_get fx_directory_local_path_restore fx_directory_local_path_set fx_directory_long_name_get fx_directory_name_test fx_directory_next_entry_find fx_directory_next_full_entry_find fx_directory_rename fx_directory_short_name_get fx_file_allocate fx_file_attributes_read fx_file_attributes_set fx_file_best_effort_allocate fx_file_close fx_file_create fx_file_date_time_set fx_file_delete fx_file_open fx_file_read fx_file_relative_seek fx_file_rename fx_file_seek fx_file_truncate fx_file_truncate_release fx_file_write fx_internal_dir_cache_miss fx_internal_dir_entry_read fx_internal_dir_entry_write fx_internal_io_driver_abort fx_internal_io_driver_boot_read fx_internal_io_driver_boot_write fx_internal_io_driver_flush fx_internal_io_driver_init fx_internal_io_driver_read fx_internal_io_driver_release_sectors fx_internal_io_driver_uninit fx_internal_io_driver_write fx_internal_log_sector_cache_miss fx_internal_media_flush fx_media_abort fx_media_cache_invalidate fx_media_check fx_media_close fx_media_flush fx_media_format fx_media_open fx_media_read fx_media_space_available fx_media_volume_get fx_media_volume_set fx_media_write fx_system_date_get fx_system_date_set fx_system_initialize fx_system_time_get fx_system_time_set fx_unicode_directory_create fx_unicode_directory_rename fx_unicode_file_create fx_unicode_file_rename fx_unicode_length_get fx_unicode_name_get fx_unicode_short_name_get
NetX
nx_arp_dynamic_entries_invalidate nx_arp_dynamic_entry_set nx_arp_enable nx_arp_gratuitous_send nx_arp_hardware_address_find nx_arp_info_get nx_arp_ip_address_find nx_arp_static_entries_delete nx_arp_static_entry_create nx_arp_static_entry_delete nx_icmp_enable nx_icmp_info_get nx_icmp_ping nx_igmp_enable nx_igmp_info_get nx_igmp_loopback_disable nx_igmp_loopback_enable nx_igmp_multicast_join nx_igmp_multicast_leave nx_internal_arp_request_receive nx_internal_arp_request_send nx_internal_arp_response_receive nx_internal_arp_response_send nx_internal_icmp_receive nx_internal_icmp_send nx_internal_igmp_receive nx_internal_io_driver_arp_response_send nx_internal_io_driver_arp_send nx_internal_io_driver_deferred_processing nx_internal_io_driver_get_alloc_errors nx_internal_io_driver_get_duplex_type nx_internal_io_driver_get_error_count nx_internal_io_driver_get_rx_count nx_internal_io_driver_get_speed nx_internal_io_driver_get_status nx_internal_io_driver_get_tx_count nx_internal_io_driver_initialize nx_internal_io_driver_link_disable nx_internal_io_driver_link_enable nx_internal_io_driver_multicast_join nx_internal_io_driver_multicast_leave nx_internal_io_driver_packet_broadcast nx_internal_io_driver_packet_send nx_internal_io_driver_rarp_send nx_internal_io_driver_uninitialize nx_internal_ip_receive nx_internal_ip_send nx_internal_rarp_receive nx_internal_rarp_send nx_internal_tcp_data_receive nx_internal_tcp_data_send nx_internal_tcp_fin_receive nx_internal_tcp_fin_send nx_internal_tcp_reset_receive nx_internal_tcp_reset_send nx_internal_tcp_retry nx_internal_tcp_state_change nx_internal_tcp_syn_receive nx_internal_tcp_syn_send nx_internal_udp_receive nx_internal_udp_send nx_ip_address_change_notify nx_ip_address_get nx_ip_address_set nx_ip_create nx_ip_delete nx_ip_driver_direct_command nx_ip_forwarding_disable nx_ip_forwarding_enable nx_ip_fragment_disable nx_ip_fragment_enable nx_ip_gateway_address_set nx_ip_info_get nx_ip_interface_attach nx_ip_interface_info_get nx_ip_raw_packet_disable nx_ip_raw_packet_enable nx_ip_raw_packet_receive nx_ip_raw_packet_send nx_ip_static_route_add nx_ip_static_route_delete nx_ip_status_check nx_packet_allocate nx_packet_copy nx_packet_data_append nx_packet_data_extract_offset nx_packet_data_retrieve nx_packet_length_get nx_packet_pool_create nx_packet_pool_delete nx_packet_pool_info_get nx_packet_release nx_packet_transmit_release nx_rarp_disable nx_rarp_enable nx_rarp_info_get nx_system_initialize nx_tcp_client_socket_bind nx_tcp_client_socket_connect nx_tcp_client_socket_port_get nx_tcp_client_socket_unbind nx_tcp_enable nx_tcp_free_port_find nx_tcp_info_get nx_tcp_server_socket_accept nx_tcp_server_socket_listen nx_tcp_server_socket_relisten nx_tcp_server_socket_unaccept nx_tcp_server_socket_unlisten nx_tcp_socket_bytes_available nx_tcp_socket_create nx_tcp_socket_delete nx_tcp_socket_disconnect nx_tcp_socket_info_get nx_tcp_socket_mss_get nx_tcp_socket_mss_peer_get nx_tcp_socket_mss_set nx_tcp_socket_peer_info_get nx_tcp_socket_receive nx_tcp_socket_receive_notify nx_tcp_socket_send nx_tcp_socket_state_wait nx_tcp_socket_transmit_configure nx_tcp_socket_window_update_notify_set nx_udp_enable nx_udp_free_port_find nx_udp_info_get nx_udp_socket_bind nx_udp_socket_bytes_available nx_udp_socket_checksum_disable nx_udp_socket_checksum_enable nx_udp_socket_create nx_udp_socket_delete nx_udp_socket_info_get nx_udp_socket_interface_set nx_udp_socket_port_get nx_udp_socket_receive nx_udp_socket_receive_notify nx_udp_socket_send nx_udp_socket_unbind nx_udp_source_extract
USBX
ux_device_class_cdc_acm_activate ux_device_class_cdc_acm_deactivate ux_device_class_cdc_acm_read ux_device_class_cdc_acm_write ux_device_class_cdc_ecm_activate ux_device_class_cdc_ecm_change ux_device_class_cdc_ecm_deactivate ux_device_class_cdc_ecm_packet_receive ux_device_class_cdc_ecm_packet_transmit ux_device_class_cdc_ecm_read ux_device_class_cdc_ecm_write ux_device_class_dfu_activate ux_device_class_dfu_deactivate ux_device_class_dpump_activate ux_device_class_dpump_change ux_device_class_dpump_deactivate ux_device_class_dpump_read ux_device_class_dpump_write ux_device_class_events_base ux_device_class_hid_activate ux_device_class_hid_deactivate ux_device_class_hid_descriptor_send ux_device_class_hid_event_get ux_device_class_hid_event_set ux_device_class_hid_report_get ux_device_class_hid_report_set ux_device_class_pima_activate ux_device_class_pima_deactivate ux_device_class_pima_device_info_send ux_device_class_pima_device_reset ux_device_class_pima_event_get ux_device_class_pima_event_set ux_device_class_pima_get_device_prop_desc_get ux_device_class_pima_get_device_prop_value ux_device_class_pima_get_device_prop_value_set ux_device_class_pima_get_object_prop_desc ux_device_class_pima_get_object_prop_value ux_device_class_pima_get_object_references ux_device_class_pima_object_add ux_device_class_pima_object_data_get ux_device_class_pima_object_data_send ux_device_class_pima_object_delete ux_device_class_pima_object_handles_send ux_device_class_pima_object_info_get ux_device_class_pima_object_info_send ux_device_class_pima_objects_number_send ux_device_class_pima_objects_props_supported_get ux_device_class_pima_objects_props_supported_set ux_device_class_pima_partial_object_data_get ux_device_class_pima_response_send ux_device_class_pima_set_object_prop_value ux_device_class_pima_set_object_references ux_device_class_pima_storage_format ux_device_class_pima_storage_id_send ux_device_class_pima_storage_info_send ux_device_class_rndis_activate ux_device_class_rndis_deactivate ux_device_class_rndis_msg_keep_alive ux_device_class_rndis_msg_query ux_device_class_rndis_msg_reset ux_device_class_rndis_msg_set ux_device_class_rndis_packet_receive ux_device_class_rndis_packet_transmit ux_device_class_storage_activate ux_device_class_storage_deactivate ux_device_class_storage_format ux_device_class_storage_inquiry ux_device_class_storage_mode_select ux_device_class_storage_mode_sense ux_device_class_storage_prevent_allow_media_removal ux_device_class_storage_read ux_device_class_storage_read_capacity ux_device_class_storage_read_format_capacity ux_device_class_storage_read_toc ux_device_class_storage_request_sense ux_device_class_storage_start_stop ux_device_class_storage_test_ready ux_device_class_storage_verify ux_device_class_storage_write ux_device_stack_alternate_setting_get ux_device_stack_alternate_setting_set ux_device_stack_class_register ux_device_stack_clear_feature ux_device_stack_configuration_get ux_device_stack_configuration_set ux_device_stack_connect ux_device_stack_descriptor_send ux_device_stack_disconnect ux_device_stack_endpoint_stall ux_device_stack_events_base ux_device_stack_get_status ux_device_stack_host_wakeup ux_device_stack_initialize ux_device_stack_interface_delete ux_device_stack_interface_get ux_device_stack_interface_set ux_device_stack_microsoft_extension_register ux_device_stack_set_feature ux_device_stack_transfer_abort ux_device_stack_transfer_all_request_abort ux_device_stack_transfer_request ux_host_class_asix_activate ux_host_class_asix_deactivate ux_host_class_asix_interrupt_notification ux_host_class_asix_read ux_host_class_asix_write ux_host_class_audio_activate ux_host_class_audio_control_value_get ux_host_class_audio_control_value_set ux_host_class_audio_deactivate ux_host_class_audio_read ux_host_class_audio_streaming_sampling_get ux_host_class_audio_streaming_sampling_set ux_host_class_audio_write ux_host_class_cdc_acm_activate ux_host_class_cdc_acm_deactivate ux_host_class_cdc_acm_ioctl_abort_in_pipe ux_host_class_cdc_acm_ioctl_abort_out_pipe ux_host_class_cdc_acm_ioctl_get_device_status ux_host_class_cdc_acm_ioctl_get_line_coding ux_host_class_cdc_acm_ioctl_notification_callback ux_host_class_cdc_acm_ioctl_send_break ux_host_class_cdc_acm_ioctl_set_line_coding ux_host_class_cdc_acm_ioctl_set_line_state ux_host_class_cdc_acm_read ux_host_class_cdc_acm_reception_start ux_host_class_cdc_acm_reception_stop ux_host_class_cdc_acm_write ux_host_class_dpump_activate ux_host_class_dpump_deactivate ux_host_class_dpump_read ux_host_class_dpump_write ux_host_class_events_base ux_host_class_gser_activate ux_host_class_gser_deactivate ux_host_class_gser_ioctl_abort_in_pipe ux_host_class_gser_ioctl_abort_out_pipe ux_host_class_gser_ioctl_get_device_status ux_host_class_gser_ioctl_get_line_coding ux_host_class_gser_ioctl_notification_callback ux_host_class_gser_ioctl_purge ux_host_class_gser_ioctl_report_device_status_change ux_host_class_gser_ioctl_send_break ux_host_class_gser_ioctl_set_line_coding ux_host_class_gser_ioctl_set_line_state ux_host_class_gser_read ux_host_class_gser_reception_start ux_host_class_gser_reception_stop ux_host_class_gser_write ux_host_class_hid_activate ux_host_class_hid_client_register ux_host_class_hid_deactivate ux_host_class_hid_idle_get ux_host_class_hid_idle_set ux_host_class_hid_keyboard_activate ux_host_class_hid_keyboard_deactivate ux_host_class_hid_mouse_activate ux_host_class_hid_mouse_deactivate ux_host_class_hid_remote_control_activate ux_host_class_hid_remote_control_deactivate ux_host_class_hid_report_get ux_host_class_hid_report_set ux_host_class_hub_activate ux_host_class_hub_change_detect ux_host_class_hub_deactivate ux_host_class_hub_port_change_connection_process ux_host_class_hub_port_change_enable_process ux_host_class_hub_port_change_over_current_process ux_host_class_hub_port_change_reset_process ux_host_class_hub_port_change_suspend_process ux_host_class_pima_activate ux_host_class_pima_deactivate ux_host_class_pima_device_info_get ux_host_class_pima_device_reset ux_host_class_pima_notification ux_host_class_pima_num_objects_get ux_host_class_pima_object_close ux_host_class_pima_object_copy ux_host_class_pima_object_delete ux_host_class_pima_object_get ux_host_class_pima_object_info_get ux_host_class_pima_object_info_send ux_host_class_pima_object_move ux_host_class_pima_object_send ux_host_class_pima_object_transfer_abort ux_host_class_pima_read ux_host_class_pima_request_cancel ux_host_class_pima_session_close ux_host_class_pima_session_open ux_host_class_pima_storage_ids_get ux_host_class_pima_storage_info_get ux_host_class_pima_thumb_get ux_host_class_pima_write ux_host_class_printer_activate ux_host_class_printer_deactivate ux_host_class_printer_name_get ux_host_class_printer_read ux_host_class_printer_soft_reset ux_host_class_printer_status_get ux_host_class_printer_write ux_host_class_prolific_activate ux_host_class_prolific_deactivate ux_host_class_prolific_ioctl_abort_in_pipe ux_host_class_prolific_ioctl_abort_out_pipe ux_host_class_prolific_ioctl_get_device_status ux_host_class_prolific_ioctl_get_line_coding ux_host_class_prolific_ioctl_purge ux_host_class_prolific_ioctl_report_device_status_change ux_host_class_prolific_ioctl_send_break ux_host_class_prolific_ioctl_set_line_coding ux_host_class_prolific_ioctl_set_line_state ux_host_class_prolific_read ux_host_class_prolific_reception_start ux_host_class_prolific_reception_stop ux_host_class_prolific_write ux_host_class_storage_activate ux_host_class_storage_deactivate ux_host_class_storage_media_capacity_get ux_host_class_storage_media_format_capacity_get ux_host_class_storage_media_mount ux_host_class_storage_media_open ux_host_class_storage_media_read ux_host_class_storage_media_write ux_host_class_storage_request_sense ux_host_class_storage_start_stop ux_host_class_storage_unit_ready_test ux_host_class_swar_activate ux_host_class_swar_deactivate ux_host_class_swar_ioctl_abort_in_pipe ux_host_class_swar_ioctl_abort_out_pipe ux_host_class_swar_read ux_host_class_swar_reception_start ux_host_class_swar_reception_stop ux_host_class_swar_write ux_host_stack_class_instance_create ux_host_stack_class_instance_destroy ux_host_stack_configuration_delete ux_host_stack_configuration_enumerate ux_host_stack_configuration_instance_create ux_host_stack_configuration_instance_delete ux_host_stack_configuration_set ux_host_stack_device_address_set ux_host_stack_device_configuration_get ux_host_stack_device_configuration_select ux_host_stack_device_descriptor_read ux_host_stack_device_get ux_host_stack_device_remove ux_host_stack_device_resource_free ux_host_stack_endpoint_instance_create ux_host_stack_endpoint_instance_delete ux_host_stack_endpoint_reset ux_host_stack_endpoint_transfer_abort ux_host_stack_events_base ux_host_stack_hcd_register ux_host_stack_initialize ux_host_stack_interface_endpoint_get ux_host_stack_interface_instance_create ux_host_stack_interface_instance_delete ux_host_stack_interface_set ux_host_stack_interface_setting_select ux_host_stack_new_configuration_create ux_host_stack_new_device_create ux_host_stack_new_endpoint_create ux_host_stack_rh_change_process ux_host_stack_rh_device_extraction ux_host_stack_rh_device_insertion ux_host_stack_transfer_request ux_host_stack_transfer_request_abort
Note that you can define a trace filter (using tx_trace_event_filter) to focus the trace on a subset of these event types. You can also add your own custom “User Events” by calling tx_trace_user_event_insert.