From 41abe80cc19cad8d45478a4483f624191e296833 Mon Sep 17 00:00:00 2001 From: xuxingliang Date: Tue, 9 Jul 2024 17:13:11 +0800 Subject: [PATCH 1/3] sched/note: add note for wdog module Signed-off-by: xuxingliang --- drivers/note/note_driver.c | 39 +++++++++++++++++++++++++++++++- drivers/note/noteram_driver.c | 23 ++++++++++++++++++- drivers/segger/note_sysview.c | 3 +++ include/nuttx/note/note_driver.h | 4 ++++ include/nuttx/sched_note.h | 19 +++++++++++++++- sched/Kconfig | 8 +++++++ sched/wdog/wd_cancel.c | 4 ++++ sched/wdog/wd_start.c | 15 +++++++++++- 8 files changed, 111 insertions(+), 4 deletions(-) diff --git a/drivers/note/note_driver.c b/drivers/note/note_driver.c index 25ae513dec4f1..e1d9ad9148d98 100644 --- a/drivers/note/note_driver.c +++ b/drivers/note/note_driver.c @@ -95,6 +95,8 @@ ((drv)->ops->irqhandler(drv, irq, handler, enter), true)) #define note_heap(drv, event, data, mem, size, used) \ ((drv)->ops->heap && ((drv)->ops->heap(drv, event, data, mem, size, used), true)) +#define note_wdog(drv, event, handler, arg) \ + ((drv)->ops->wdog && ((drv)->ops->wdog(drv, event, handler, arg), true)) #define note_string(drv, ip, buf) \ ((drv)->ops->string && ((drv)->ops->string(drv, ip, buf), true)) #define note_event(drv, ip, event, buf, len) \ @@ -1358,6 +1360,41 @@ void sched_note_irqhandler(int irq, FAR void *handler, bool enter) } #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG +void sched_note_wdog(uint8_t event, FAR void *handler, FAR const void *arg) +{ + FAR struct note_driver_s **driver; + struct note_wdog_s note; + bool formatted = false; + FAR struct tcb_s *tcb = this_task(); + + for (driver = g_note_drivers; *driver; driver++) + { + if (note_wdog(*driver, event, handler, arg)) + { + continue; + } + + if ((*driver)->ops->add == NULL) + { + continue; + } + + if (!formatted) + { + formatted = true; + note_common(tcb, ¬e.nwd_cmn, sizeof(note), event); + note.handler = (uintptr_t)handler; + note.arg = (uintptr_t)arg; + } + + /* Add the note to circular buffer */ + + note_add(*driver, ¬e, sizeof(note)); + } +} +#endif + #ifdef CONFIG_SCHED_INSTRUMENTATION_HEAP void sched_note_heap(uint8_t event, FAR void *heap, FAR void *mem, size_t size, size_t used) @@ -1389,7 +1426,7 @@ void sched_note_heap(uint8_t event, FAR void *heap, FAR void *mem, if (!formatted) { formatted = true; - note_common(tcb, ¬e.nmm_cmn, sizeof(note), event); + note_common(tcb, ¬e.nhp_cmn, sizeof(note), event); note.heap = heap; note.mem = mem; note.size = size; diff --git a/drivers/note/noteram_driver.c b/drivers/note/noteram_driver.c index e9b60333ab015..582cec5e73f73 100644 --- a/drivers/note/noteram_driver.c +++ b/drivers/note/noteram_driver.c @@ -901,6 +901,27 @@ static int noteram_dump_one(FAR uint8_t *p, FAR struct lib_outstream_s *s, break; #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG + case NOTE_WDOG_START: + case NOTE_WDOG_CANCEL: + case NOTE_WDOG_ENTER: + case NOTE_WDOG_LEAVE: + { + FAR struct note_wdog_s *nw; + FAR const char *name[] = + { + "start", "cancel", "enter", "leave", + }; + + nw = (FAR struct note_wdog_s *)p; + ret += noteram_dump_header(s, note, ctx); + ret += lib_sprintf(s, "tracing_mark_write: I|%d|wdog: %s-%pS %p\n", + pid, name[note->nc_type - NOTE_WDOG_START], + (FAR void *)nw->handler, (FAR void *)nw->arg); + } + break; +#endif + #ifdef CONFIG_SCHED_INSTRUMENTATION_CSECTION case NOTE_CSECTION_ENTER: case NOTE_CSECTION_LEAVE: @@ -1031,7 +1052,7 @@ static int noteram_dump_one(FAR uint8_t *p, FAR struct lib_outstream_s *s, "add", "remove", "malloc", "free" }; - ret += noteram_dump_header(s, &nmm->nmm_cmn, ctx); + ret += noteram_dump_header(s, &nmm->nhp_cmn, ctx); ret += lib_sprintf(s, "tracing_mark_write: C|%d|Heap Usage|%d|%s" ": heap: %p size:%" PRIiPTR ", address: %p\n", pid, nmm->used, diff --git a/drivers/segger/note_sysview.c b/drivers/segger/note_sysview.c index 95ded2b2ebcb6..a00dcbe8e1dca 100644 --- a/drivers/segger/note_sysview.c +++ b/drivers/segger/note_sysview.c @@ -119,6 +119,9 @@ static const struct note_driver_ops_s g_note_sysview_ops = #ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER note_sysview_irqhandler, /* irqhandler */ #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG + NULL, /* wdog */ +#endif #ifdef CONFIG_SCHED_INSTRUMENTATION_HEAP note_sysview_heap, /* heap */ #endif diff --git a/include/nuttx/note/note_driver.h b/include/nuttx/note/note_driver.h index 7dc67e3dcda6b..2286f9befef38 100644 --- a/include/nuttx/note/note_driver.h +++ b/include/nuttx/note/note_driver.h @@ -91,6 +91,10 @@ struct note_driver_ops_s CODE void (*irqhandler)(FAR struct note_driver_s *drv, int irq, FAR void *handler, bool enter); #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG + CODE void (*wdog)(FAR struct note_driver_s *drv, uint8_t event, + FAR void *handler, FAR const void *arg); +#endif #ifdef CONFIG_SCHED_INSTRUMENTATION_HEAP CODE void (*heap)(FAR struct note_driver_s *drv, uint8_t event, FAR void *heap, FAR void *mem, size_t size, diff --git a/include/nuttx/sched_note.h b/include/nuttx/sched_note.h index b87b66369af4f..27b76415a863d 100644 --- a/include/nuttx/sched_note.h +++ b/include/nuttx/sched_note.h @@ -188,6 +188,10 @@ enum note_type_e NOTE_SYSCALL_LEAVE, NOTE_IRQ_ENTER, NOTE_IRQ_LEAVE, + NOTE_WDOG_START, + NOTE_WDOG_CANCEL, + NOTE_WDOG_ENTER, + NOTE_WDOG_LEAVE, NOTE_HEAP_ADD, NOTE_HEAP_REMOVE, NOTE_HEAP_ALLOC, @@ -386,9 +390,16 @@ struct note_irqhandler_s uint8_t nih_irq; /* IRQ number */ }; +struct note_wdog_s +{ + struct note_common_s nwd_cmn; /* Common note parameters */ + uintptr_t handler; + uintptr_t arg; +}; + struct note_heap_s { - struct note_common_s nmm_cmn; /* Common note parameters */ + struct note_common_s nhp_cmn; /* Common note parameters */ FAR void *heap; FAR void *mem; size_t size; @@ -557,6 +568,12 @@ void sched_note_irqhandler(int irq, FAR void *handler, bool enter); # define sched_note_irqhandler(i,h,e) #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG +void sched_note_wdog(uint8_t event, FAR void *handler, FAR const void *arg); +#else +# define sched_note_wdog(e,h,a) +#endif + #ifdef CONFIG_SCHED_INSTRUMENTATION_HEAP void sched_note_heap(uint8_t event, FAR void *heap, FAR void *mem, size_t size, size_t used); diff --git a/sched/Kconfig b/sched/Kconfig index a4c5110c6f7ee..38dfe43443b14 100644 --- a/sched/Kconfig +++ b/sched/Kconfig @@ -1292,6 +1292,14 @@ config SCHED_INSTRUMENTATION_HEAP void sched_note_heap(uint8_t event, FAR void* heap, FAR void *mem, size_t size, size_t curused); +config SCHED_INSTRUMENTATION_WDOG + bool "Watchdog timer monitor hooks" + default n + ---help--- + Enables additional hooks for watchdog timer. + + void sched_note_wdog(uint8_t event, FAR void *handler, FAR const void *arg); + config SCHED_INSTRUMENTATION_DUMP bool "Use note dump for instrumentation" default n diff --git a/sched/wdog/wd_cancel.c b/sched/wdog/wd_cancel.c index 65c063cd56086..538fa03e6b0b7 100644 --- a/sched/wdog/wd_cancel.c +++ b/sched/wdog/wd_cancel.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "sched/sched.h" #include "wdog/wdog.h" @@ -95,6 +96,9 @@ int wd_cancel_irq(FAR struct wdog_s *wdog) return -EINVAL; } + sched_note_wdog(NOTE_WDOG_CANCEL, (FAR void *)wdog->func, + (FAR void *)(uintptr_t)wdog->expired); + /* Prohibit timer interactions with the timer queue until the * cancellation is complete */ diff --git a/sched/wdog/wd_start.c b/sched/wdog/wd_start.c index fd703e6c976d2..739cec16a2111 100644 --- a/sched/wdog/wd_start.c +++ b/sched/wdog/wd_start.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "sched/sched.h" #include "wdog/wdog.h" @@ -56,9 +57,11 @@ { \ clock_t start; \ clock_t elapsed; \ + sched_note_wdog(NOTE_WDOG_ENTER, func, (FAR void *)arg); \ start = perf_gettime(); \ func(arg); \ elapsed = perf_gettime() - start; \ + sched_note_wdog(NOTE_WDOG_LEAVE, func, (FAR void *)arg); \ if (elapsed > CONFIG_SCHED_CRITMONITOR_MAXTIME_WDOG) \ { \ CRITMONITOR_PANIC("WDOG %p, %s IRQ, execute too long %ju\n", \ @@ -68,7 +71,15 @@ } \ while (0) #else -# define CALL_FUNC(func, arg) func(arg) +# define CALL_FUNC(func, arg) \ + do \ + { \ + sched_note_wdog(NOTE_WDOG_ENTER, func, (FAR void *)arg); \ + func(arg); \ + sched_note_wdog(NOTE_WDOG_LEAVE, func, (FAR void *)arg); \ + } \ + while (0) + #endif /**************************************************************************** @@ -319,6 +330,8 @@ int wd_start_abstick(FAR struct wdog_s *wdog, clock_t ticks, wd_insert(wdog, ticks, wdentry, arg); #endif leave_critical_section(flags); + + sched_note_wdog(NOTE_WDOG_START, wdentry, (FAR void *)(uintptr_t)ticks); return OK; } From 931920b078351df572352639cf878637f9afcc9d Mon Sep 17 00:00:00 2001 From: xuxingliang Date: Tue, 9 Jul 2024 18:05:53 +0800 Subject: [PATCH 2/3] sched/note: add wdog note for segger sysview Signed-off-by: xuxingliang --- drivers/segger/note_sysview.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/segger/note_sysview.c b/drivers/segger/note_sysview.c index a00dcbe8e1dca..a783925fdedbf 100644 --- a/drivers/segger/note_sysview.c +++ b/drivers/segger/note_sysview.c @@ -79,6 +79,10 @@ static void note_sysview_heap(FAR struct note_driver_s *drv, uint8_t event, FAR void *heap, FAR void *mem, size_t size, size_t curused); #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG +static void note_sysview_wdog(FAR struct note_driver_s *drv, uint8_t event, + FAR void *handler, FAR const void *arg); +#endif /**************************************************************************** * Private Data @@ -120,7 +124,7 @@ static const struct note_driver_ops_s g_note_sysview_ops = note_sysview_irqhandler, /* irqhandler */ #endif #ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG - NULL, /* wdog */ + note_sysview_wdog, /* wdog */ #endif #ifdef CONFIG_SCHED_INSTRUMENTATION_HEAP note_sysview_heap, /* heap */ @@ -389,6 +393,21 @@ static void note_sysview_heap(FAR struct note_driver_s *drv, } #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_WDOG +static void note_sysview_wdog(FAR struct note_driver_s *drv, uint8_t event, + FAR void *handler, FAR const void *arg) +{ + if (event == NOTE_WDOG_ENTER) + { + SEGGER_SYSVIEW_RecordEnterTimer((uintptr_t)handler); + } + else if (event == NOTE_WDOG_LEAVE) + { + SEGGER_SYSVIEW_RecordExitTimer(); + } +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ From 27c8e1f6f81799ab38c7f0a557276bbf1882ab4f Mon Sep 17 00:00:00 2001 From: Neo Xu Date: Tue, 8 Oct 2024 15:36:54 +0800 Subject: [PATCH 3/3] boards/arm/stm32/stm32f429i-disco: use serial console by default Make it easy to access for beginners, using the default serial as console. Enable wdog sched note. Signed-off-by: Neo Xu --- .../arm/stm32/stm32f429i-disco/configs/systemview/defconfig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/boards/arm/stm32/stm32f429i-disco/configs/systemview/defconfig b/boards/arm/stm32/stm32f429i-disco/configs/systemview/defconfig index adb3a67086eec..24953158ccf9f 100644 --- a/boards/arm/stm32/stm32f429i-disco/configs/systemview/defconfig +++ b/boards/arm/stm32/stm32f429i-disco/configs/systemview/defconfig @@ -7,6 +7,8 @@ # # CONFIG_ARCH_FPU is not set # CONFIG_DRIVERS_NOTERAM is not set +# CONFIG_SERIAL_RTT_CONSOLE is not set +# CONFIG_STANDARD_SERIAL is not set # CONFIG_STM32_FLASH_PREFETCH is not set CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="stm32f429i-disco" @@ -41,6 +43,7 @@ CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_HEAP=y CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER=y CONFIG_SCHED_INSTRUMENTATION_SWITCH=y +CONFIG_SCHED_INSTRUMENTATION_WDOG=y CONFIG_SEGGER_SYSVIEW=y CONFIG_SERIAL_RTT0=y CONFIG_SPI=y @@ -52,8 +55,10 @@ CONFIG_STM32_EXTERNAL_RAM=y CONFIG_STM32_FMC=y CONFIG_STM32_JTAG_SW_ENABLE=y CONFIG_STM32_PWR=y +CONFIG_STM32_USART1=y CONFIG_SYSLOG_CHAR=y CONFIG_SYSLOG_RTT=y CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_SYSTEM=y CONFIG_TASK_NAME_SIZE=0 +CONFIG_USART1_SERIAL_CONSOLE=y