#include "SEGGER_SYSVIEW.h"
#include "SEGGER_SYSVIEW_Conf.h"
extern void _rtos_trace_system_description(void);
extern void _rtos_trace_task_list(void);
extern long long unsigned int _rtos_trace_time(void);
extern unsigned int _rtos_trace_sysclock(void);
#define SYSVIEW_RAM_BASE (0x20000000)
#ifndef USE_CYCCNT_TIMESTAMP
#define USE_CYCCNT_TIMESTAMP 1
#endif
#ifndef ENABLE_DWT_CYCCNT
#define ENABLE_DWT_CYCCNT 1
#endif
#define DEMCR (*(volatile unsigned long*) (0xE000EDFCuL))
#define TRACEENA_BIT (1uL << 24)
#define DWT_CTRL (*(volatile unsigned long*) (0xE0001000uL))
#define NOCYCCNT_BIT (1uL << 25)
#define CYCCNTENA_BIT (1uL << 0)
static void send_system_description(void) {
_rtos_trace_system_description();
SEGGER_SYSVIEW_SendTaskList();
}
#ifdef SYSTEMVIEW_TARGET_CALLBACKS_OS
static SEGGER_SYSVIEW_OS_API os_callbacks = {
.pfGetTime = _rtos_trace_time,
.pfSendTaskList = _rtos_trace_task_list,
};
#endif
void SEGGER_SYSVIEW_Conf(void) {
#if USE_CYCCNT_TIMESTAMP
#if ENABLE_DWT_CYCCNT
if ((DEMCR & TRACEENA_BIT) == 0) {
DEMCR |= TRACEENA_BIT;
}
#endif
if ((DWT_CTRL & NOCYCCNT_BIT) == 0) { if ((DWT_CTRL & CYCCNTENA_BIT) == 0) { DWT_CTRL |= CYCCNTENA_BIT; }
}
#endif
SEGGER_SYSVIEW_Init(
_rtos_trace_sysclock(),
_rtos_trace_sysclock(),
#ifdef SYSTEMVIEW_TARGET_CALLBACKS_OS
&os_callbacks,
#else
0,
#endif
send_system_description);
SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);
}