sysview_config.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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_DESC1 "I#18=T0,I#19=T1,I#23=RTC,I#34=I2C0,I#35=I2C1," \
  40. "I#36=DSP,I#38=UART0"
  41. #define INT_ID_DESC2 "I#53=GPIO,I#59=LCD,I#65=DE,I#67=LRADC,I#68=PMU," \
  42. "I#71=DACFIFO,I#72=BT,I#78=IIC0MT,I#79=IIC1MT"
  43. #elif defined(CONFIG_SOC_LEOPARD)
  44. #define INT_ID_DESC1 "I#2=T0,I#3=T1,I#4=T2,I#5=T3,I#6=T4,I#7=RTC," \
  45. "I#18=I2C0,I#19=I2C1,I#20=DSP,I#21=DSP1,I#22=UART0"
  46. #define INT_ID_DESC2 "I#53=GPIO,I#55=SDMA1,I#59=LCD,I#65=DE,I#73=JPEG," \
  47. "I#67=LRADC,I#68=PMU,I#71=DACFIFO,I#72=BT,I#75=GPU,"\
  48. "I#76=SPI0MT,I#77=SPI1MT,I#78=IIC0MT,I#79=IIC1MT"
  49. #else
  50. #define INT_ID_DESC1 ""
  51. #define INT_ID_DESC2 ""
  52. #endif
  53. static void cbSendSystemDesc(void)
  54. {
  55. SEGGER_SYSVIEW_SendSysDesc("N=ZephyrSysView");
  56. SEGGER_SYSVIEW_SendSysDesc("D=" CONFIG_BOARD " "
  57. CONFIG_SOC_SERIES " " CONFIG_ARCH);
  58. SEGGER_SYSVIEW_SendSysDesc("O=Zephyr");
  59. SEGGER_SYSVIEW_SendSysDesc(INT_ID_DESC1);
  60. SEGGER_SYSVIEW_SendSysDesc(INT_ID_DESC2);
  61. }
  62. static void send_task_list_cb(void)
  63. {
  64. struct k_thread *thread;
  65. for (thread = _kernel.threads; thread; thread = thread->next_thread) {
  66. char name[THREAD_NAME_LEN];
  67. if (z_is_idle_thread_object(thread)) {
  68. continue;
  69. }
  70. set_thread_name(name, thread);
  71. SEGGER_SYSVIEW_SendTaskInfo(&(SEGGER_SYSVIEW_TASKINFO) {
  72. .TaskID = (uint32_t)(uintptr_t)thread,
  73. .sName = name,
  74. .StackSize = thread->stack_info.size,
  75. .StackBase = thread->stack_info.start,
  76. .Prio = thread->base.prio,
  77. });
  78. }
  79. }
  80. static U64 get_time_cb(void)
  81. {
  82. return (U64)k_cycle_get_32();
  83. }
  84. const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {
  85. get_time_cb,
  86. send_task_list_cb,
  87. };
  88. void SEGGER_SYSVIEW_Conf(void)
  89. {
  90. SEGGER_SYSVIEW_Init(sys_clock_hw_cycles_per_sec(),
  91. sys_clock_hw_cycles_per_sec(),
  92. &SYSVIEW_X_OS_TraceAPI, cbSendSystemDesc);
  93. #if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_sram), okay)
  94. SEGGER_SYSVIEW_SetRAMBase(DT_REG_ADDR(DT_CHOSEN(zephyr_sram)));
  95. #else
  96. /* Setting RAMBase is just an optimization: this value is subtracted
  97. * from all pointers in order to save bandwidth. It's not an error
  98. * if a platform does not set this value.
  99. */
  100. #endif
  101. }