From 741626dc8f9037397abe35a2c5d4d64504129776 Mon Sep 17 00:00:00 2001 From: Diego Ismirlian Date: Sun, 29 Sep 2019 12:37:06 -0300 Subject: [PATCH] Add SEGGER RTT and SystemView bindings for ChibiOS --- ext/.gitignore | 1 + ext/SEGGER-RTT_6.44i+SystemView_2.52h.7z | Bin 0 -> 31782 bytes ext/readme.txt | 7 + .../segger_bindings/RTT/SEGGER_RTT_streams.c | 116 ++++++++ .../segger_bindings/RTT/SEGGER_RTT_streams.h | 107 +++++++ .../SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.c | 73 +++++ .../SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.h | 281 ++++++++++++++++++ .../SYSTEMVIEW/SYSVIEW_ChibiOS.txt | 8 + .../example_configurations/SEGGER_RTT_Conf.h | 123 ++++++++ .../SEGGER_SYSVIEW_Conf.h | 174 +++++++++++ os/various/segger_bindings/segger_rtt.mk | 14 + .../segger_bindings/segger_systemview.mk | 13 + 12 files changed, 917 insertions(+) create mode 100644 ext/.gitignore create mode 100644 ext/SEGGER-RTT_6.44i+SystemView_2.52h.7z create mode 100644 ext/readme.txt create mode 100644 os/various/segger_bindings/RTT/SEGGER_RTT_streams.c create mode 100644 os/various/segger_bindings/RTT/SEGGER_RTT_streams.h create mode 100644 os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.c create mode 100644 os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.h create mode 100644 os/various/segger_bindings/SYSTEMVIEW/SYSVIEW_ChibiOS.txt create mode 100644 os/various/segger_bindings/example_configurations/SEGGER_RTT_Conf.h create mode 100644 os/various/segger_bindings/example_configurations/SEGGER_SYSVIEW_Conf.h create mode 100644 os/various/segger_bindings/segger_rtt.mk create mode 100644 os/various/segger_bindings/segger_systemview.mk diff --git a/ext/.gitignore b/ext/.gitignore new file mode 100644 index 00000000..2ef49731 --- /dev/null +++ b/ext/.gitignore @@ -0,0 +1 @@ +SEGGER \ No newline at end of file diff --git a/ext/SEGGER-RTT_6.44i+SystemView_2.52h.7z b/ext/SEGGER-RTT_6.44i+SystemView_2.52h.7z new file mode 100644 index 0000000000000000000000000000000000000000..df1159f3c7c24b1154d56de14c4a0dfa26ea1283 GIT binary patch literal 31782 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 literal 0 HcmV?d00001 diff --git a/ext/readme.txt b/ext/readme.txt new file mode 100644 index 00000000..dcf5e8d9 --- /dev/null +++ b/ext/readme.txt @@ -0,0 +1,7 @@ +All the code contained under ./ext is not part of the ChibiOS/ChibiOS-Contrib +project and supplied as-is without any additional warranty by ChibiOS/ +ChibiOS-Contrib. For ownership and copyright statements see the license +details inside the code. + +Some modules may contain changes from the ChibiOS-Contrib team in order to +increase compatibility or usability with ChibiOS itself. diff --git a/os/various/segger_bindings/RTT/SEGGER_RTT_streams.c b/os/various/segger_bindings/RTT/SEGGER_RTT_streams.c new file mode 100644 index 00000000..253a2f1f --- /dev/null +++ b/os/various/segger_bindings/RTT/SEGGER_RTT_streams.c @@ -0,0 +1,116 @@ +/* + ChibiOS - Copyright (C) 2006..2017 Giovanni Di Sirio + Copyright (C) 2019 Diego Ismirlian, (dismirlian(at)google's mail) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" +#include "SEGGER_RTT_streams.h" + +RTTDriver RTTD0; +static bool rtt_global_init; + +static size_t _write(RTTDriver *rttdp, const uint8_t *bp, size_t n) { + return SEGGER_RTT_Write(rttdp->up_buffer_index, bp, n); +} + +static size_t _read(RTTDriver *rttdp, uint8_t *bp, size_t n) { + (void)rttdp, (void)bp, (void)n; + /* TODO: implement */ + return 0; +} + +static msg_t _put(RTTDriver *rttdp, uint8_t b) { + if (SEGGER_RTT_PutChar(rttdp->up_buffer_index, b) == 1) { + return MSG_OK; + } + return MSG_TIMEOUT; +} + +static msg_t _get(RTTDriver *rttdp) { + (void)rttdp; + /* TODO: implement */ + return MSG_TIMEOUT; +} + +static const struct RTTDriverVMT vmt = { + (size_t)0, + (size_t (*)(void *, const uint8_t *, size_t))_write, + (size_t (*)(void *, uint8_t *, size_t))_read, + (msg_t (*)(void *, uint8_t))_put, + (msg_t (*)(void *))_get, +}; + +static inline void _object_init(RTTDriver *rttdp) { + rttdp->state = RTT_STATE_READY; + rttdp->vmt = &vmt; +} + +void rttInit(void) { + osalDbgAssert(rtt_global_init == false, "double init"); + SEGGER_RTT_LOCK(); + SEGGER_RTT_Init(); + RTTD0.up_buffer_index = 0; + RTTD0.down_buffer_index = 0; + _object_init(&RTTD0); + rtt_global_init = true; + RTTD0.state = RTT_STATE_READY; + SEGGER_RTT_UNLOCK(); +} + +void rttObjectInit(RTTDriver *rttdp, const RTTConfig *cfg) { + osalDbgCheck(rttdp); + osalDbgAssert(rtt_global_init, "uninitialized"); + osalDbgAssert(rttdp != &RTTD0, "RTTD0 is automatically initialized on rttInit"); + + int idx; + + SEGGER_RTT_LOCK(); + if (cfg->down.size) { + idx = SEGGER_RTT_AllocDownBuffer(cfg->name, cfg->down.buff, cfg->down.size, cfg->down.flags); + osalDbgAssert(idx > 0, "can't alloc down buffer"); + rttdp->down_buffer_index = (unsigned)idx; + } else { + rttdp->down_buffer_index = 0; + } + + if (cfg->up.size) { + idx = SEGGER_RTT_AllocUpBuffer(cfg->name, cfg->up.buff, cfg->up.size, cfg->up.flags); + osalDbgAssert(idx > 0, "can't alloc up buffer"); + rttdp->up_buffer_index = (unsigned)idx; + } else { + rttdp->up_buffer_index = 0; + } + + _object_init(rttdp); + SEGGER_RTT_UNLOCK(); +} + +void rttSetUpFlags(RTTDriver *rttdp, rtt_mode_flags_t flags) { + int ret = SEGGER_RTT_SetFlagsUpBuffer(rttdp->up_buffer_index, (unsigned)flags); + osalDbgAssert(ret >= 0, "error"); +} + +void rttSetDownFlags(RTTDriver *rttdp, rtt_mode_flags_t flags) { + int ret = SEGGER_RTT_SetFlagsDownBuffer(rttdp->down_buffer_index, (unsigned)flags); + osalDbgAssert(ret >= 0, "error"); +} + +void rttStart(RTTDriver *rttdp) { + osalDbgCheck(rttdp); + osalDbgAssert(rtt_global_init, "uninitialized"); + osalDbgAssert((rttdp->state == RTT_STATE_ACTIVE) + || (rttdp->state == RTT_STATE_READY), "wrong state"); + rttdp->state = RTT_STATE_READY; +} diff --git a/os/various/segger_bindings/RTT/SEGGER_RTT_streams.h b/os/various/segger_bindings/RTT/SEGGER_RTT_streams.h new file mode 100644 index 00000000..3ee679cb --- /dev/null +++ b/os/various/segger_bindings/RTT/SEGGER_RTT_streams.h @@ -0,0 +1,107 @@ +/* + ChibiOS - Copyright (C) 2006..2017 Giovanni Di Sirio + Copyright (C) 2015..2017 Diego Ismirlian, (dismirlian (at) google's mail) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef SEGGER_RTT_streams_H_ +#define SEGGER_RTT_streams_H_ + +#include "hal.h" +#include "SEGGER_RTT.h" + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +typedef enum { + RTT_STATE_UNINIT = 0, + RTT_STATE_STOP = 1, + RTT_STATE_ACTIVE = 2, + RTT_STATE_READY = 3 +} rtt_state_t; + +typedef enum { + RTT_MODE_FLAGS_NO_BLOCK_SKIP = SEGGER_RTT_MODE_NO_BLOCK_SKIP, + RTT_MODE_FLAGS_NO_BLOCK_TRIM = SEGGER_RTT_MODE_NO_BLOCK_TRIM, + RTT_MODE_FLAGS_BLOCK_IF_FIFO_FULL = SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL, +} rtt_mode_flags_t; + +#define _rtt_driver_methods \ + _base_sequential_stream_methods + +struct RTTDriverVMT { + _rtt_driver_methods +}; + +typedef struct RTTDriver RTTDriver; +typedef struct RTTConfig RTTConfig; +typedef struct RTTBufferConfig RTTBufferConfig; + +struct RTTDriver { + /* inherited from abstract asyncrhonous channel driver */ + const struct RTTDriverVMT *vmt; + _base_sequential_stream_data + + rtt_state_t state; + unsigned int up_buffer_index; + unsigned int down_buffer_index; +}; + +struct RTTBufferConfig { + void *buff; + unsigned int size; + rtt_mode_flags_t flags; +}; + +struct RTTConfig { + const char *name; + RTTBufferConfig up; + RTTBufferConfig down; +}; + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ +#define rttGetState(rttdp) ((rttdp)->state) +#define rttGetUpBufferIndex(rttdp) ((rttdp)->up_buffer_index) +#define rttGetDownBufferIndex(rttdp) ((rttdp)->down_buffer_index) + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ +extern RTTDriver RTTD0; + +#ifdef __cplusplus +extern "C" { +#endif + /* RTT device driver */ + void rttInit(void); + void rttObjectInit(RTTDriver *rttdp, const RTTConfig *cfg); + void rttStart(RTTDriver *rttdp); + void rttSetUpFlags(RTTDriver *rttdp, rtt_mode_flags_t flags); + void rttSetDownFlags(RTTDriver *rttdp, rtt_mode_flags_t flags); +#ifdef __cplusplus +} +#endif + +#endif /* SEGGER_RTT_streams_H_ */ diff --git a/os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.c b/os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.c new file mode 100644 index 00000000..08d2e732 --- /dev/null +++ b/os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.c @@ -0,0 +1,73 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio. + Copyright (C) 2019 Diego Ismirlian, (dismirlian (at) google's mail) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "ch.h" +#include "SEGGER_SYSVIEW.h" +#include "hal.h" + +#include + +static systime_t start; +static const char *isr_desc; + +static void _cbSendTaskList(void) { + thread_t *tp; + tp = chRegFirstThread(); + do { + SYSVIEW_ChibiOS_SendTaskInfo(tp); + tp = chRegNextThread(tp); + } while (tp != NULL); +} + +static U64 _cbGetTime(void) { + return TIME_I2US(chVTTimeElapsedSinceX(start)); +} + +static void _cbSendSystemDesc(void) { + SEGGER_SYSVIEW_SendSysDesc("O=ChibiOS"); + SEGGER_SYSVIEW_SendSysDesc(isr_desc); +} + +static const SEGGER_SYSVIEW_OS_API os_api = { + _cbGetTime, + _cbSendTaskList, +}; + +void SYSVIEW_ChibiOS_Start(U32 SysFreq, U32 CPUFreq, const char *isr_description) { + start = chVTGetSystemTimeX(); + isr_desc = isr_description; + SEGGER_SYSVIEW_Init(SysFreq, CPUFreq, &os_api, _cbSendSystemDesc); + SEGGER_SYSVIEW_Start(); +} + +void SYSVIEW_ChibiOS_SendTaskInfo(const void *_tp) { + const thread_t *const tp = (const thread_t *)_tp; + SEGGER_SYSVIEW_TASKINFO TaskInfo; + + //Fill all elements with 0 to allow extending the structure + //in future version without breaking the code + memset(&TaskInfo, 0, sizeof(TaskInfo)); + TaskInfo.TaskID = (U32)tp; + TaskInfo.sName = tp->name; + TaskInfo.Prio = (U32)tp->prio; +#if (CH_DBG_ENABLE_STACK_CHECK == TRUE) || (CH_CFG_USE_DYNAMIC == TRUE) + TaskInfo.StackBase = (U32)tp->wabase; + TaskInfo.StackSize = (U32)tp->ctx.sp - (U32)tp->wabase; +#else + TaskInfo.StackBase = 0U; + TaskInfo.StackSize = (U32)tp->wabase; +#endif + SEGGER_SYSVIEW_SendTaskInfo(&TaskInfo); +} diff --git a/os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.h b/os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.h new file mode 100644 index 00000000..c3e03842 --- /dev/null +++ b/os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.h @@ -0,0 +1,281 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio. + Copyright (C) 2019 Diego Ismirlian, (dismirlian(at)google's mail) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + * To use: + * + * 1) + * #include this file at the bottom of chconf.h. You may need to + * redefine some of the hooks in chconf.h, for example + * + * CH_CFG_THREAD_INIT_HOOK => _CH_CFG_THREAD_INIT_HOOK. + * + * If you don't use those hooks in your original code, you may just delete + * them from chconf.h + * + * + * 2) + * Copy the SEGGER_RTT_Conf.h and SEGGER_SYSVIEW_Conf.h files from the + * segger_bindings/example_configurations/ directory to the project's + * cfg directory. + * + * You can tune the config files to suit your needs; see the SEGGER RTT and + * SystemView documentation for details. + * + * + * 3) + * Add the following call to main(): + * SYSVIEW_ChibiOS_Start(STM32_SYSCLK, STM32_SYSCLK, "I#15=SysTick"); + * + * The first parameter, SysFreq, is the time base for all the timestamps. It + * must match SEGGER_SYSVIEW_GET_TIMESTAMP in SEGGER_SYSVIEW_Conf.h. By + * default, SEGGER_SYSVIEW_GET_TIMESTAMP is configured to use the DWT cycle + * counter, so this parameter should match the CPU frequency (eg. + * STM32_SYSCLK). + * + * The second parameter, CPUFreq, appears to be just for information. + * + * The third parameter can be used to name the interrupts in the system. + * For example, on the Cortex-M*, when using the classic periodic tick for + * ChibiOS (CH_CFG_ST_TIMEDELTA == 0), this parameter should include + * "I#15=OSTick" (interrupt #15 is the SysTick). When using the tick-less + * mode, this parameter could be tuned to show the ISR name of the timer + * module used as the OS timer. + * + * Also, you can include all other interrupts in this configuration string + * (eg. "I#15=OSTick,I#54=USART2"). + * + * See the SystemView documentation for more details. + * + * + * 4) + * Copy the file SYSVIEW_ChibiOS.txt (in the segger_bindings directory) to + * the following directory: + * + * Path\to\SystemView\Description\ + * + * This will allow SystemView to map the ChibiOS's task state values to names. + * + */ + +#ifndef SYSVIEW_CHIBIOS_H +#define SYSVIEW_CHIBIOS_H + +#include "SEGGER_SYSVIEW.h" +void SYSVIEW_ChibiOS_SendTaskInfo(const void *_tp); +void SYSVIEW_ChibiOS_Start(U32 SysFreq, U32 CPUFreq, const char *isr_description); + +/********************************************************************/ +/* Checks */ +/********************************************************************/ +#if !(CH_CFG_USE_REGISTRY == TRUE) +#error "SYSVIEW integration requires CH_CFG_USE_REGISTRY" +#endif + +#if defined(CH_CFG_THREAD_INIT_HOOK) +#error "SYSVIEW integration: rename CH_CFG_THREAD_INIT_HOOK to _CH_CFG_THREAD_INIT_HOOK" +#endif + +#if defined(CH_CFG_THREAD_READY_HOOK) +#error "SYSVIEW integration: rename CH_CFG_THREAD_READY_HOOK to _CH_CFG_THREAD_READY_HOOK" +#endif + +#if defined(CH_CFG_CONTEXT_SWITCH_HOOK) +#error "SYSVIEW integration: rename CH_CFG_CONTEXT_SWITCH_HOOK to _CH_CFG_CONTEXT_SWITCH_HOOK" +#endif + +#if defined(CH_CFG_THREAD_EXIT_HOOK) +#error "SYSVIEW integration: rename CH_CFG_THREAD_EXIT_HOOK to _CH_CFG_THREAD_EXIT_HOOK" +#endif + +#if defined(CH_CFG_IRQ_PROLOGUE_HOOK) +#error "SYSVIEW integration: rename CH_CFG_IRQ_PROLOGUE_HOOK to _CH_CFG_IRQ_PROLOGUE_HOOK" +#endif + +#if defined(CH_CFG_IRQ_EPILOGUE_HOOK) +#error "SYSVIEW integration: rename CH_CFG_IRQ_EPILOGUE_HOOK to _CH_CFG_IRQ_EPILOGUE_HOOK" +#endif + +#if defined(CH_CFG_SYSTEM_HALT_HOOK) +#error "SYSVIEW integration: rename CH_CFG_SYSTEM_HALT_HOOK to _CH_CFG_SYSTEM_HALT_HOOK" +#endif + +#if !defined(_CH_CFG_THREAD_INIT_HOOK) +#define _CH_CFG_THREAD_INIT_HOOK(tp) do {} while(0) +#endif + +#if !defined(_CH_CFG_THREAD_READY_HOOK) +#define _CH_CFG_THREAD_READY_HOOK(tp) do {} while(0) +#endif + +#if !defined(_CH_CFG_CONTEXT_SWITCH_HOOK) +#define _CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) do {} while(0) +#endif + +#if !defined(_CH_CFG_THREAD_EXIT_HOOK) +#define _CH_CFG_THREAD_EXIT_HOOK(tp) do {} while(0) +#endif + +#if !defined(_CH_CFG_IRQ_PROLOGUE_HOOK) +#define _CH_CFG_IRQ_PROLOGUE_HOOK() do {} while(0) +#endif + +#if !defined(_CH_CFG_IRQ_EPILOGUE_HOOK) +#define _CH_CFG_IRQ_EPILOGUE_HOOK() do {} while(0) +#endif + +#if !defined(_CH_CFG_SYSTEM_HALT_HOOK) +#define _CH_CFG_SYSTEM_HALT_HOOK(reason) do {} while(0) +#endif + +/* CH_CFG_THREAD_INIT_HOOK: + * + * We report the thread creation and we immediately send the TaskInfo + * structure, so that SystemView can show it as early as possible. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + _CH_CFG_THREAD_INIT_HOOK(tp); \ + SEGGER_SYSVIEW_OnTaskCreate((U32)tp); \ + SYSVIEW_ChibiOS_SendTaskInfo((const void *)tp); \ +} + +/* CH_CFG_THREAD_READY_HOOK: + * + * This is an *extra* hook, not present in the "stock" ChibiOS code. It is + * important if you want SystemView to show all the ready threads, even if + * they are not executing. + * + * The hook should be placed just before the return lines of the chSchReadyI + * and the chSchReadyAheadI functions, in chschd.c: + * + * thread_t *chSchReadyAheadI(thread_t *tp) { + * ... + * CH_CFG_THREAD_READY_HOOK(tp); + * return tp; + * } + * + * thread_t *chSchReadyI(thread_t *tp) { + * ... + * CH_CFG_THREAD_READY_HOOK(tp); + * return tp; + * } + */ +#define CH_CFG_THREAD_READY_HOOK(tp) { \ + _CH_CFG_THREAD_READY_HOOK(tp); \ + SEGGER_SYSVIEW_OnTaskStartReady((U32)tp); \ +} + +/* CH_CFG_CONTEXT_SWITCH_HOOK: + * + * This hook is called when switching context from Thread to Thread, or by the + * tail ISR exit sequence (see comments at CH_CFG_IRQ_EPILOGUE_HOOK). + * + * First, we report the switching-out of the "old" thread (otp), and then the + * switching-in of the "new" thread. Unfortunately, SystemView treats the idle + * thread as a special case, so we need to do some ugly handling here. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + if (otp->prio != IDLEPRIO) { \ + SEGGER_SYSVIEW_OnTaskStopReady((U32)otp, otp->state); \ + } \ + if (ntp->prio == IDLEPRIO) { \ + SEGGER_SYSVIEW_OnIdle(); \ + } else { \ + SEGGER_SYSVIEW_OnTaskStartExec((U32)ntp); \ + } \ + _CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp); \ +} + +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + _CH_CFG_THREAD_EXIT_HOOK(tp); \ + SEGGER_SYSVIEW_OnTaskStopExec(); \ +} + +/* CH_CFG_IRQ_PROLOGUE_HOOK: + * + * For the ARM Cortex-M* architectures, the PORT_IRQ_PROLOGUE doesn't contain + * any code, so the timestamp shown by SystemView for the ISR entry is quite + * accurate. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + SEGGER_SYSVIEW_RecordEnterISR(); \ + _CH_CFG_IRQ_PROLOGUE_HOOK(); \ +} + +/* CH_CFG_IRQ_EPILOGUE_HOOK: + * + * When the ISR is at the tail, and preemption is required, we tell SystemView + * that we exit the ISR to the scheduler first so that the code between + * CH_CFG_IRQ_EPILOGUE_HOOK and the actual context switch will be shown as + * "scheduler". Otherwise, that time will be shown as belonging to the thread + * that was running before the first ISR. If the ISR is not at the tail, we + * simply tell SystemView that the ISR has been exited. If the ISR is at the + * tail but preemption is not required, we tell Systemview that we exit the ISR + * so that it shows that the last thread resumes execution. + * + * When the ISR is at the tail, and preemption is required, this hook will + * be immediately followed by CH_CFG_CONTEXT_SWITCH_HOOK (see + * _port_switch_from_isr()). + * + * Actually, this hook runs a bit early in the ISR exit sequence, so the + * scheduler time shown by SystemView will be underestimated. The ideal place + * to place these calls would be at _port_irq_epilogue. + * + * Note: Unfortunately, this hook is specific to the Cortex-M architecture + * until ChibiOS gets a generic "_isr_is_tail()" macro/function. + */ +#if defined(__GNUC__) +# if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)) +# define _isr_is_tail() (_saved_lr != (regarm_t)0xFFFFFFF1U) +# elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) +# define _isr_is_tail() ((SCB->ICSR & SCB_ICSR_RETTOBASE_Msk) != 0U) +# else +# error "SYSVIEW integration: unsupported architecture" +# endif +#elif defined(__ICCARM__) +# if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) +# define _isr_is_tail() (_saved_lr != (regarm_t)0xFFFFFFF1U) +# elif ((defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || (defined (__ARM7M__) && (__CORE__ == __ARM7M__))) +# define _isr_is_tail() ((SCB->ICSR & SCB_ICSR_RETTOBASE_Msk) != 0U) +# else +# error "SYSVIEW integration: unsupported architecture" +# endif +#elif defined(__CC_ARM) +# if (defined __TARGET_ARCH_6S_M) +# define _isr_is_tail() (_saved_lr != (regarm_t)0xFFFFFFF1U) +# elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) +# define _isr_is_tail() ((SCB->ICSR & SCB_ICSR_RETTOBASE_Msk) != 0U) +# else +# error "SYSVIEW integration: unsupported architecture" +# endif +#else +# error "SYSVIEW integration: unsupported compiler" +#endif + +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + _CH_CFG_IRQ_EPILOGUE_HOOK(); \ + if (_isr_is_tail() && chSchIsPreemptionRequired()) { \ + SEGGER_SYSVIEW_RecordExitISRToScheduler(); \ + } else { \ + SEGGER_SYSVIEW_RecordExitISR(); \ + } \ +} + +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + _CH_CFG_SYSTEM_HALT_HOOK(reason); \ + SEGGER_SYSVIEW_Error(reason); \ +} + +#endif diff --git a/os/various/segger_bindings/SYSTEMVIEW/SYSVIEW_ChibiOS.txt b/os/various/segger_bindings/SYSTEMVIEW/SYSVIEW_ChibiOS.txt new file mode 100644 index 00000000..a0e97db6 --- /dev/null +++ b/os/various/segger_bindings/SYSTEMVIEW/SYSVIEW_ChibiOS.txt @@ -0,0 +1,8 @@ +# This file describes the ChibiOS Tasks' states. +# Put this file in the following directory: +# Path\to\SystemView\Description\ + +# +# Task States +# +TaskState 0xFF 0=Ready, 1=Current, 2=Wait start, 3=Suspended, 4=Wait queue, 5=Wait semaphore, 6=Wait mutex, 7=Wait condvar, 8=Sleeping, 9=Wait thread, 10=Wait one event, 11=Wait several events, 12=Send message queue, 13=Wait answer, 14=Wait message, 15=Terminated diff --git a/os/various/segger_bindings/example_configurations/SEGGER_RTT_Conf.h b/os/various/segger_bindings/example_configurations/SEGGER_RTT_Conf.h new file mode 100644 index 00000000..5aa7a699 --- /dev/null +++ b/os/various/segger_bindings/example_configurations/SEGGER_RTT_Conf.h @@ -0,0 +1,123 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2019 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* conditions are met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this list of conditions and the following disclaimer. * +* * +* o Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the following * +* disclaimer in the documentation and/or other materials provided * +* with the distribution. * +* * +* o Neither the name of SEGGER Microcontroller GmbH * +* nor the names of its contributors may be used to endorse or * +* promote products derived from this software without specific * +* prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.44i * +* * +********************************************************************** +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_Conf.h +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 13430 $ + +*/ + +#ifndef SEGGER_RTT_CONF_H +#define SEGGER_RTT_CONF_H + +#ifdef __IAR_SYSTEMS_ICC__ + #include +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +#define SEGGER_RTT_MAX_NUM_UP_BUFFERS (2) // Max. number of up-buffers (T->H) available on this target (Default: 3) +#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (2) // Max. number of down-buffers (H->T) available on this target (Default: 3) + +#define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k) +#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) + +#define SEGGER_RTT_PRINTF_BUFFER_SIZE (128u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) + +#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) + +/********************************************************************* +* +* RTT memcpy configuration +* +* memcpy() is good for large amounts of data, +* but the overhead is big for small amounts, which are usually stored via RTT. +* With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. +* +* SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. +* This is may be required with memory access restrictions, +* such as on Cortex-A devices with MMU. +*/ +#define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop +// +// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets +// +//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) +// #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) +//#endif + +// +// Target is not allowed to perform other RTT operations while string still has not been stored completely. +// Otherwise we would probably end up with a mixed string in the buffer. +// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. +#if !defined(SEGGER_RTT_ASM) +#include "ch.h" +#define SEGGER_RTT_LOCK() do { \ + syssts_t LockState = chSysGetStatusAndLockX() +#define SEGGER_RTT_UNLOCK() chSysRestoreStatusX(LockState); \ + } while(0) +#endif +#endif +/*************************** End of file ****************************/ diff --git a/os/various/segger_bindings/example_configurations/SEGGER_SYSVIEW_Conf.h b/os/various/segger_bindings/example_configurations/SEGGER_SYSVIEW_Conf.h new file mode 100644 index 00000000..8d8ffa25 --- /dev/null +++ b/os/various/segger_bindings/example_configurations/SEGGER_SYSVIEW_Conf.h @@ -0,0 +1,174 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2019 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* conditions are met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this list of conditions and the following disclaimer. * +* * +* o Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the following * +* disclaimer in the documentation and/or other materials provided * +* with the distribution. * +* * +* o Neither the name of SEGGER Microcontroller GmbH * +* nor the names of its contributors may be used to endorse or * +* promote products derived from this software without specific * +* prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: V2.52h * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW_Conf.h +Purpose : SEGGER SystemView configuration. +Revision: $Rev: 13453 $ +*/ + +#ifndef SEGGER_SYSVIEW_CONF_H +#define SEGGER_SYSVIEW_CONF_H + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +// +// Constants for known core configuration +// +#define SEGGER_SYSVIEW_CORE_OTHER 0 +#define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1 +#define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7 +#define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX + +#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__) || (defined __clang__) + #if (defined __ARM_ARCH_6M__) || (defined __ARM_ARCH_8M_BASE__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__ICCARM__) + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif ((defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__))) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__CC_ARM) + #if (defined(__TARGET_ARCH_6S_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__TI_ARM__) + #ifdef __TI_ARM_V6M0__ + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__ICCRX__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX +#elif defined(__RX) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX +#endif + +#ifndef SEGGER_SYSVIEW_CORE + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +/********************************************************************* +* +* SystemView buffer configuration +*/ +#define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 2048 // Number of bytes that SystemView uses for the buffer. +#define SEGGER_SYSVIEW_RTT_CHANNEL 1 // The RTT channel that SystemView will use. 0: Auto selection + +#define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 // Use a static buffer to generate events instead of a buffer on the stack + +#define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 // 1: Enable post mortem analysis mode + +/********************************************************************* +* +* SystemView timestamp configuration +*/ +#if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 + #define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter. + #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by clock source +#else + #define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function + #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by SEGGER_SYSVIEW_X_GetTimestamp() +#endif + +/********************************************************************* +* +* SystemView Id configuration +*/ +#define SEGGER_SYSVIEW_ID_BASE 0x20000000 // Default value for the lowest Id reported by the application. Can be overridden by the application via SEGGER_SYSVIEW_SetRAMBase(). (i.e. 0x20000000 when all Ids are an address in this RAM) +#define SEGGER_SYSVIEW_ID_SHIFT 2 // Number of bits to shift the Id to save bandwidth. (i.e. 2 when Ids are 4 byte aligned) + +/********************************************************************* +* +* SystemView interrupt configuration +*/ +#if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32 *)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector) +#elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 + #if defined(__ICCARM__) + #if (__VER__ > 6100000) + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead. + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32 *)(0xE000ED04)) & 0x3F) // Older versions of IAR do not include __get_IPSR, but might also not optimize to byte-access. + #endif + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32 *)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector) + #endif +#else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function. +#endif + +#endif // SEGGER_SYSVIEW_CONF_H + +/*************************** End of file ****************************/ diff --git a/os/various/segger_bindings/segger_rtt.mk b/os/various/segger_bindings/segger_rtt.mk new file mode 100644 index 00000000..b2f18406 --- /dev/null +++ b/os/various/segger_bindings/segger_rtt.mk @@ -0,0 +1,14 @@ +# SEGGER RTT files. +SEGGERASMSRC = $(CHIBIOS_CONTRIB)/ext/SEGGER/RTT/SEGGER_RTT_ASM_ARMv7M.s +SEGGERRTTCSRC = $(CHIBIOS_CONTRIB)/ext/SEGGER/RTT/SEGGER_RTT.c \ + $(CHIBIOS_CONTRIB)/ext/SEGGER/RTT/SEGGER_RTT_printf.c \ + $(CHIBIOS_CONTRIB)/os/various/segger_bindings/RTT/SEGGER_RTT_streams.c +SEGGERRTTINC = $(CHIBIOS_CONTRIB)/ext/SEGGER/RTT \ + $(CHIBIOS_CONTRIB)/os/various/segger_bindings/RTT + + +SEGGER_RTT_ACTIVE = 1 + +ALLASMSRC += $(SEGGERASMSRC) +ALLCSRC += $(SEGGERRTTCSRC) +ALLINC += $(SEGGERRTTINC) \ No newline at end of file diff --git a/os/various/segger_bindings/segger_systemview.mk b/os/various/segger_bindings/segger_systemview.mk new file mode 100644 index 00000000..577c6edc --- /dev/null +++ b/os/various/segger_bindings/segger_systemview.mk @@ -0,0 +1,13 @@ +# Compiler options here. +ifeq ($(SEGGER_RTT_ACTIVE),) + $(error "SEGGER SystemView needs segger_rtt.mk") +endif + +# SEGGER RTT files. +SEGGERSYSTEMVIEWCSRC = $(CHIBIOS_CONTRIB)/ext/SEGGER/SYSTEMVIEW/SEGGER_SYSVIEW.c \ + $(CHIBIOS_CONTRIB)/os/various/segger_bindings/SYSTEMVIEW/SEGGER_SYSVIEW_ChibiOS.c +SEGGERSYSTEMVIEWINC = $(CHIBIOS_CONTRIB)/ext/SEGGER/SYSTEMVIEW \ + $(CHIBIOS_CONTRIB)/os/various/segger_bindings/SYSTEMVIEW + +ALLCSRC += $(SEGGERSYSTEMVIEWCSRC) +ALLINC += $(SEGGERSYSTEMVIEWINC) \ No newline at end of file