Select one of the symbols to view example projects that use it.
 
Outline
#include <stdint.h>
#include <sdkconfig.h>
#include "SEGGER_SYSVIEW.h"
#include "SEGGER_RTT.h"
#include "esp_app_trace.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
TAG
#define CALLSTACK_SIZE
#define CALLSTACK_SIZE
s_esp_sysview_heap_module
s_mod_registered
esp_sysview_heap_trace_start(uint32_t)
esp_sysview_heap_trace_stop()
esp_sysview_heap_trace_alloc(const void *, uint32_t, const void *)
esp_sysview_heap_trace_free(const void *, const void *)
Files
loading...
SourceVuESP-IDF Framework and ExamplesESP-IDFcomponents/app_trace/sys_view/ext/heap_trace_module.c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/* * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 *//* ... */ #include <stdint.h> #include <sdkconfig.h> #include "SEGGER_SYSVIEW.h" #include "SEGGER_RTT.h" #include "esp_app_trace.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h"8 includes const static char *TAG = "sysview_heap_trace"; #ifdef CONFIG_HEAP_TRACING_STACK_DEPTH #define CALLSTACK_SIZE CONFIG_HEAP_TRACING_STACK_DEPTH #else #define CALLSTACK_SIZE 0 #endif static SEGGER_SYSVIEW_MODULE s_esp_sysview_heap_module = { .sModule = "M=ESP32 SystemView Heap Tracing Module", .NumEvents = 2, }{...}; static bool s_mod_registered; esp_err_t esp_sysview_heap_trace_start(uint32_t tmo) { uint32_t tmo_ticks = tmo/(1000*portTICK_PERIOD_MS); ESP_EARLY_LOGV(TAG, "%s", __func__); do { if (tmo != (uint32_t)-1) { // Currently timeout implementation is simple and has granularity of 1 OS tick, // so just count down the number of times to call vTaskDelay if (tmo_ticks-- == 0) { return ESP_ERR_TIMEOUT; }{...} }{...} vTaskDelay(1); }{...} while(!SEGGER_SYSVIEW_Started()); SEGGER_SYSVIEW_RegisterModule(&s_esp_sysview_heap_module); s_mod_registered = true; return ESP_OK; }{ ... } esp_err_t esp_sysview_heap_trace_stop(void) { ESP_EARLY_LOGV(TAG, "%s", __func__); SEGGER_RTT_ESP_Flush(0, ESP_APPTRACE_TMO_INFINITE); return ESP_OK; }{ ... } void esp_sysview_heap_trace_alloc(const void *addr, uint32_t size, const void *callers) { U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + (2+CALLSTACK_SIZE)*SEGGER_SYSVIEW_QUANTA_U32]; U8* pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); U32 *calls = (U32 *)callers; if (!s_mod_registered) { return; }{...} ESP_EARLY_LOGV(TAG, "%s %p %lu", __func__, addr, size); pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, (U32)addr); pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, size); for (int i = 0; i < CALLSTACK_SIZE; i++) { pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, calls[i]); }{...} SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, s_esp_sysview_heap_module.EventOffset + 0); }{ ... } void esp_sysview_heap_trace_free(const void *addr, const void *callers) { U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + (1+CALLSTACK_SIZE)*SEGGER_SYSVIEW_QUANTA_U32]; U8* pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); U32 *calls = (U32 *)callers; if (!s_mod_registered) { return; }{...} ESP_EARLY_LOGV(TAG, "%s %p", __func__, addr); pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, (U32)addr); for (int i = 0; i < CALLSTACK_SIZE; i++) { pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, calls[i]); }{...} SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, s_esp_sysview_heap_module.EventOffset + 1); }{ ... }
Details