sysview_config.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * Copyright (c) 2018 Intel Corporation
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <kernel.h>
  7. #include <SEGGER_SYSVIEW.h>
  8. #include <ksched.h>
  9. extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI;
  10. #if CONFIG_THREAD_MAX_NAME_LEN
  11. #define THREAD_NAME_LEN CONFIG_THREAD_MAX_NAME_LEN
  12. #else
  13. #define THREAD_NAME_LEN 20
  14. #endif
  15. static void set_thread_name(char *name, struct k_thread *thread)
  16. {
  17. const char *tname = k_thread_name_get(thread);
  18. if (tname != NULL && tname[0] != '\0') {
  19. memcpy(name, tname, THREAD_NAME_LEN);
  20. name[THREAD_NAME_LEN - 1] = '\0';
  21. } else {
  22. snprintk(name, THREAD_NAME_LEN, "T%pE%p",
  23. thread, &thread->entry);
  24. }
  25. }
  26. void sys_trace_thread_info(struct k_thread *thread)
  27. {
  28. char name[THREAD_NAME_LEN];
  29. set_thread_name(name, thread);
  30. SEGGER_SYSVIEW_TASKINFO Info;
  31. Info.TaskID = (uint32_t)(uintptr_t)thread;
  32. Info.sName = name;
  33. Info.Prio = thread->base.prio;
  34. Info.StackBase = thread->stack_info.size;
  35. Info.StackSize = thread->stack_info.start;
  36. SEGGER_SYSVIEW_SendTaskInfo(&Info);
  37. }
  38. #if defined(CONFIG_SOC_LARK)
  39. #define INT_ID_DESC "I#2=TIM0,I#7=RTC,I#16=SD0,I#17=SD1,I#18=I2C0,I#19=I2C1," \
  40. "I#20=DSP,I#21=DSP1,I#27=DMA0,I#37=GPIO,I#43=LCD,I#49=DE," \
  41. "I#51=LRADC,I#56=BT,I#57=ANCDSP0,I#58=TWS,I#59=ANCDSP1"
  42. #else
  43. #define INT_ID_DESC ""
  44. #endif
  45. static void cbSendSystemDesc(void)
  46. {
  47. SEGGER_SYSVIEW_SendSysDesc("N=ZephyrSysView");
  48. SEGGER_SYSVIEW_SendSysDesc("D=" CONFIG_BOARD " "
  49. CONFIG_SOC_SERIES " " CONFIG_ARCH);
  50. SEGGER_SYSVIEW_SendSysDesc("O=Zephyr");
  51. SEGGER_SYSVIEW_SendSysDesc(INT_ID_DESC);
  52. }
  53. static void send_task_list_cb(void)
  54. {
  55. struct k_thread *thread;
  56. for (thread = _kernel.threads; thread; thread = thread->next_thread) {
  57. char name[THREAD_NAME_LEN];
  58. if (z_is_idle_thread_object(thread)) {
  59. continue;
  60. }
  61. set_thread_name(name, thread);
  62. SEGGER_SYSVIEW_SendTaskInfo(&(SEGGER_SYSVIEW_TASKINFO) {
  63. .TaskID = (uint32_t)(uintptr_t)thread,
  64. .sName = name,
  65. .StackSize = thread->stack_info.size,
  66. .StackBase = thread->stack_info.start,
  67. .Prio = thread->base.prio,
  68. });
  69. }
  70. }
  71. static U64 get_time_cb(void)
  72. {
  73. return (U64)k_cycle_get_32();
  74. }
  75. const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {
  76. get_time_cb,
  77. send_task_list_cb,
  78. };
  79. void SEGGER_SYSVIEW_Conf(void)
  80. {
  81. SEGGER_SYSVIEW_Init(sys_clock_hw_cycles_per_sec(),
  82. sys_clock_hw_cycles_per_sec(),
  83. &SYSVIEW_X_OS_TraceAPI, cbSendSystemDesc);
  84. #if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_sram), okay)
  85. SEGGER_SYSVIEW_SetRAMBase(DT_REG_ADDR(DT_CHOSEN(zephyr_sram)));
  86. #else
  87. /* Setting RAMBase is just an optimization: this value is subtracted
  88. * from all pointers in order to save bandwidth. It's not an error
  89. * if a platform does not set this value.
  90. */
  91. #endif
  92. }