You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by GitBox <gi...@apache.org> on 2018/05/28 10:02:49 UTC

[GitHub] andrzej-kaczmarek closed pull request #1107: SystemView updates

andrzej-kaczmarek closed pull request #1107: SystemView updates
URL: https://github.com/apache/mynewt-core/pull/1107
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/hw/drivers/adc/adc_nrf52/src/adc_nrf52.c b/hw/drivers/adc/adc_nrf52/src/adc_nrf52.c
index 2c3f9b31d8..06edc46432 100644
--- a/hw/drivers/adc/adc_nrf52/src/adc_nrf52.c
+++ b/hw/drivers/adc/adc_nrf52/src/adc_nrf52.c
@@ -354,6 +354,15 @@ nrf52_adc_size_buffer(struct adc_dev *dev, int chans, int samples)
     return (sizeof(nrf_saadc_value_t) * chans * samples);
 }
 
+#if MYNEWT_VAL(OS_SYSVIEW)
+static void
+saadc_irq_handler(void)
+{
+    os_trace_isr_enter();
+    nrfx_saadc_irq_handler();
+    os_trace_isr_exit();
+}
+#endif
 
 /**
  * Callback to initialize an adc_dev structure from the os device
@@ -388,7 +397,11 @@ nrf52_adc_dev_init(struct os_dev *odev, void *arg)
     af->af_read_buffer = nrf52_adc_read_buffer;
     af->af_size_buffer = nrf52_adc_size_buffer;
 
+#if MYNEWT_VAL(OS_SYSVIEW)
+    NVIC_SetVector(SAADC_IRQn, (uint32_t) saadc_irq_handler);
+#else
     NVIC_SetVector(SAADC_IRQn, (uint32_t) nrfx_saadc_irq_handler);
+#endif
 
     return (0);
 }
diff --git a/hw/drivers/pwm/pwm_nrf52/src/pwm_nrf52.c b/hw/drivers/pwm/pwm_nrf52/src/pwm_nrf52.c
index aad8cc06c6..0626e9af80 100644
--- a/hw/drivers/pwm/pwm_nrf52/src/pwm_nrf52.c
+++ b/hw/drivers/pwm/pwm_nrf52/src/pwm_nrf52.c
@@ -722,6 +722,54 @@ nrf52_pwm_get_resolution_bits(struct pwm_dev *dev)
     return (-EINVAL);
 }
 
+#if MYNEWT_VAL(OS_SYSVIEW)
+#if MYNEWT_VAL(PWM_0)
+static void
+pwm_0_irq_handler(void)
+{
+    os_trace_isr_enter();
+    nrfx_pwm_0_irq_handler();
+    os_trace_isr_exit();
+}
+#endif
+
+#if MYNEWT_VAL(PWM_1)
+static void
+pwm_1_irq_handler(void)
+{
+    os_trace_isr_enter();
+    nrfx_pwm_1_irq_handler();
+    os_trace_isr_exit();
+}
+#endif
+
+#if MYNEWT_VAL(PWM_2)
+static void
+pwm_2_irq_handler(void)
+{
+    os_trace_isr_enter();
+    nrfx_pwm_2_irq_handler();
+    os_trace_isr_exit();
+}
+#endif
+
+#if MYNEWT_VAL(PWM_3)
+static void
+pwm_3_irq_handler(void)
+{
+    os_trace_isr_enter();
+    nrfx_pwm_3_irq_handler();
+    os_trace_isr_exit();
+}
+#endif
+
+#define PWM_IRQ_HANDLER(_pwm_no) \
+                            (uint32_t) pwm_ ## _pwm_no ## _irq_handler
+#else
+#define PWM_IRQ_HANDLER(_pwm_no) \
+                            (uint32_t) nrfx_pwm_ ## _pwm_no ## _irq_handler
+#endif
+
 /**
  * Callback to initialize an adc_dev structure from the os device
  * initialization callback.  This sets up a nrf52_pwm_device(), so
@@ -732,6 +780,8 @@ nrf52_pwm_dev_init(struct os_dev *odev, void *arg)
 {
     struct pwm_dev *dev;
     struct pwm_driver_funcs *pwm_funcs;
+    IRQn_Type irqn;
+    uint32_t irqh;
 
     assert(odev);
     dev = (struct pwm_dev *) odev;
@@ -759,30 +809,37 @@ nrf52_pwm_dev_init(struct os_dev *odev, void *arg)
     switch (dev->pwm_instance_id) {
 #if MYNEWT_VAL(PWM_0)
     case 0:
-        NVIC_SetVector(PWM0_IRQn, (uint32_t) nrfx_pwm_0_irq_handler);
+        irqn = PWM0_IRQn;
+        irqh = PWM_IRQ_HANDLER(0);
         break;
 #endif
 
 #if MYNEWT_VAL(PWM_1)
     case 1:
-        NVIC_SetVector(PWM1_IRQn, (uint32_t) nrfx_pwm_1_irq_handler);
+        irqn = PWM1_IRQn;
+        irqh = PWM_IRQ_HANDLER(1);
         break;
 #endif
 
 #if MYNEWT_VAL(PWM_2)
     case 2:
-        NVIC_SetVector(PWM2_IRQn, (uint32_t) nrfx_pwm_2_irq_handler);
+        irqn = PWM2_IRQn;
+        irqh = PWM_IRQ_HANDLER(2);
         break;
 #endif
 
 #if MYNEWT_VAL(PWM_3)
     case 3:
-        NVIC_SetVector(PWM3_IRQn, (uint32_t) nrfx_pwm_3_irq_handler);
+        irqn = PWM3_IRQn;
+        irqh = PWM_IRQ_HANDLER(3);
         break;
 #endif
     default:
         assert(0);
+        return 0;
     }
 
+    NVIC_SetVector(irqn, irqh);
+
     return (0);
 }
diff --git a/hw/drivers/trng/trng_nrf52/src/trng_nrf52.c b/hw/drivers/trng/trng_nrf52/src/trng_nrf52.c
index 9fe2b455f0..ed9594e8d0 100644
--- a/hw/drivers/trng/trng_nrf52/src/trng_nrf52.c
+++ b/hw/drivers/trng/trng_nrf52/src/trng_nrf52.c
@@ -57,6 +57,8 @@ nrf52_rng_stop(void)
 static void
 nrf52_rng_irq_handler(void)
 {
+    os_trace_isr_enter();
+
     if (NRF_RNG->EVENTS_VALRDY) {
         NRF_RNG->EVENTS_VALRDY = 0;
         rng_cache[rng_cache_in] = NRF_RNG->VALUE;
@@ -69,6 +71,8 @@ nrf52_rng_irq_handler(void)
     if ((rng_cache_in + 1) % sizeof(rng_cache) == rng_cache_out) {
         nrf52_rng_stop();
     }
+
+    os_trace_isr_exit();
 }
 
 static size_t
diff --git a/hw/mcu/ambiq/apollo2/src/hal_gpio.c b/hw/mcu/ambiq/apollo2/src/hal_gpio.c
index a4d8d83e64..2e450827c0 100644
--- a/hw/mcu/ambiq/apollo2/src/hal_gpio.c
+++ b/hw/mcu/ambiq/apollo2/src/hal_gpio.c
@@ -109,7 +109,7 @@ hal_gpio_irq_handler(void)
     uint64_t status;
     int i;
 
-    os_trace_enter_isr();
+    os_trace_isr_enter();
 
     /* Read and clear the GPIO interrupt status. */
     status = am_hal_gpio_int_status_get(false);
@@ -124,7 +124,7 @@ hal_gpio_irq_handler(void)
         }
     }
 
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 
 /*
diff --git a/hw/mcu/ambiq/apollo2/src/hal_uart.c b/hw/mcu/ambiq/apollo2/src/hal_uart.c
index 8cd3392bf1..deb94db7c8 100644
--- a/hw/mcu/ambiq/apollo2/src/hal_uart.c
+++ b/hw/mcu/ambiq/apollo2/src/hal_uart.c
@@ -191,7 +191,7 @@ apollo2_uart_irqh_x(int num)
     int data;
     int rc;
 
-    os_trace_enter_isr();
+    os_trace_isr_enter();
 
     u = &uarts[num];
 
@@ -232,7 +232,7 @@ apollo2_uart_irqh_x(int num)
         }
     }
 
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 
 #if MYNEWT_VAL(UART_0)
diff --git a/hw/mcu/arc/snps/src/hal_os_tick.c b/hw/mcu/arc/snps/src/hal_os_tick.c
index f3e6be38b4..7eb7968f5b 100644
--- a/hw/mcu/arc/snps/src/hal_os_tick.c
+++ b/hw/mcu/arc/snps/src/hal_os_tick.c
@@ -45,7 +45,7 @@ arc_timer_handler(void *arg)
 {
     uint32_t sr;
 
-    os_trace_enter_isr();
+    os_trace_isr_enter();
     arc_timer_int_clear(g_hal_os_tick.timer_num);
 
     OS_ENTER_CRITICAL(sr);
@@ -54,7 +54,7 @@ arc_timer_handler(void *arg)
     os_time_advance(1);
 
     OS_EXIT_CRITICAL(sr);
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 
 void
diff --git a/hw/mcu/nordic/nrf51xxx/include/mcu/mcu.h b/hw/mcu/nordic/nrf51xxx/include/mcu/mcu.h
index 24b59811a4..2bf6ee0816 100644
--- a/hw/mcu/nordic/nrf51xxx/include/mcu/mcu.h
+++ b/hw/mcu/nordic/nrf51xxx/include/mcu/mcu.h
@@ -29,6 +29,13 @@ extern "C" {
  */
 #define MCU_GPIO_PORTA(pin)	((0 * 16) + (pin))
 
+#define MCU_SYSVIEW_INTERRUPTS \
+    "I#1=Reset,I#2=MNI,I#3=HardFault,I#11=SVCall,I#12=DebugMonitor,I#14=PendSV,I#15=SysTick," \
+    "I#16=POWER_CLOCK,I#17=RADIO,I#18=UART0,I#19=SPI0_TWI0,I#20=SPI1_TWI1," \
+    "I#22=GPIOTE,I#23=ADC,I#24=TIMER0,I#25=TIMER1,I#26=TIMER2,I#27=RTC0,I#28=TEMP," \
+    "I#29=RNG,I#30=ECB,I#31=CCM_AAR,I#32=WDT,I#33=RTC1,I#34=QDEC,I#35=LPCOMP,I#36=SWI0," \
+    "I#37=SWI1,I#38=SWI2,I#39=SWI3,I#40=SWI4,I#41=SWI5"
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/hw/mcu/nordic/nrf51xxx/src/hal_timer.c b/hw/mcu/nordic/nrf51xxx/src/hal_timer.c
index 2a5753e51a..077777ecdc 100644
--- a/hw/mcu/nordic/nrf51xxx/src/hal_timer.c
+++ b/hw/mcu/nordic/nrf51xxx/src/hal_timer.c
@@ -373,6 +373,8 @@ hal_timer_irq_handler(struct nrf51_hal_timer *bsptimer)
     uint32_t compare;
     NRF_TIMER_Type *hwtimer;
 
+    os_trace_isr_enter();
+
     /* Check interrupt source. If set, clear them */
     hwtimer = bsptimer->tmr_reg;
     compare = hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT];
@@ -405,6 +407,8 @@ hal_timer_irq_handler(struct nrf51_hal_timer *bsptimer)
 
     /* Recommended by nordic to make sure interrupts are cleared */
     compare = hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT];
+
+    os_trace_isr_exit();
 }
 #endif
 
@@ -416,6 +420,8 @@ hal_rtc_timer_irq_handler(struct nrf51_hal_timer *bsptimer)
     uint32_t compare;
     NRF_RTC_Type *rtctimer;
 
+    os_trace_isr_enter();
+
     /* Check interrupt source. If set, clear them */
     rtctimer = (NRF_RTC_Type *)bsptimer->tmr_reg;
     compare = rtctimer->EVENTS_COMPARE[NRF_RTC_TIMER_CC_INT];
@@ -445,6 +451,8 @@ hal_rtc_timer_irq_handler(struct nrf51_hal_timer *bsptimer)
 
     /* Recommended by nordic to make sure interrupts are cleared */
     compare = rtctimer->EVENTS_COMPARE[NRF_RTC_TIMER_CC_INT];
+
+    os_trace_isr_exit();
 }
 #endif
 
diff --git a/hw/mcu/nordic/nrf52xxx/include/mcu/mcu.h b/hw/mcu/nordic/nrf52xxx/include/mcu/mcu.h
index 9886d2b0dd..5b9abf411f 100644
--- a/hw/mcu/nordic/nrf52xxx/include/mcu/mcu.h
+++ b/hw/mcu/nordic/nrf52xxx/include/mcu/mcu.h
@@ -33,6 +33,35 @@ extern "C" {
 #define MCU_GPIO_PORTA(pin)	((0 * 16) + (pin))
 #define MCU_GPIO_PORTB(pin)	((1 * 16) + (pin))
 
+#if NRF52
+
+#define MCU_SYSVIEW_INTERRUPTS \
+    "I#1=Reset,I#2=MNI,I#3=HardFault,I#4=MemoryMgmt,I#5=BusFault,I#6=UsageFault," \
+    "I#11=SVCall,I#12=DebugMonitor,I#14=PendSV,I#15=SysTick," \
+    "I#16=POWER_CLOCK,I#17=RADIO,I#18=UARTE0_UART0,I#19=SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0," \
+    "I#20=SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1,I#21=NFCT,I#22=GPIOTE,I#23=SAADC," \
+    "I#24=TIMER0,I#25=TIMER1,I#26=TIMER2,I#27=RTC0,I#28=TEMP,I#29=RNG,I#30=ECB," \
+    "I#31=CCM_AAR,I#32=WDT,I#33=RTC1,I#34=QDEC,I#35=COMP_LPCOMP,I#36=SWI0_EGU0," \
+    "I#37=SWI1_EGU1,I#38=SWI2_EGU2,I#39=SWI3_EGU3,I#40=SWI4_EGU4,I#41=SWI5_EGU5," \
+    "I#42=TIMER3,I#43=TIMER4,I#44=PWM0,I#45=PDM,I#48=MWU,I#49=PWM1,I#50=PWM2," \
+    "I#51=SPIM2_SPIS2_SPI2,I#52=RTC2,I#53=I2S,I#54=FPU"
+
+#elif NRF52840_XXAA
+
+#define MCU_SYSVIEW_INTERRUPTS \
+    "I#1=Reset,I#2=MNI,I#3=HardFault,I#4=MemoryMgmt,I#5=BusFault,I#6=UsageFault," \
+    "I#11=SVCall,I#12=DebugMonitor,I#14=PendSV,I#15=SysTick," \
+    "I#16=POWER_CLOCK,I#17=RADIO,I#18=UARTE0_UART0,I#19=SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0," \
+    "I#20=SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1,I#21=NFCT,I#22=GPIOTE,I#23=SAADC," \
+    "I#24=TIMER0,I#25=TIMER1,I#26=TIMER2,I#27=RTC0,I#28=TEMP,I#29=RNG,I#30=ECB," \
+    "I#31=CCM_AAR,I#32=WDT,I#33=RTC1,I#34=QDEC,I#35=COMP_LPCOMP,I#36=SWI0_EGU0," \
+    "I#37=SWI1_EGU1,I#38=SWI2_EGU2,I#39=SWI3_EGU3,I#40=SWI4_EGU4,I#41=SWI5_EGU5," \
+    "I#42=TIMER3,I#43=TIMER4,I#44=PWM0,I#45=PDM,I#48=MWU,I#49=PWM1,I#50=PWM2," \
+    "I#51=SPIM2_SPIS2_SPI2,I#52=RTC2,I#53=I2S,I#54=FPU,I#55=USBD," \
+    "I#56=UARTE1,I#57=QSPI,I#58=CRYPTOCELL,I#61=PWM3,I#63=SPIM3"
+
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_gpio.c b/hw/mcu/nordic/nrf52xxx/src/hal_gpio.c
index 6cf3bbe9f4..f8bbf3c1c8 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_gpio.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_gpio.c
@@ -179,7 +179,7 @@ hal_gpio_irq_handler(void)
 {
     int i;
 
-    os_trace_enter_isr();
+    os_trace_isr_enter();
 
     for (i = 0; i < HAL_GPIO_MAX_IRQ; i++) {
         if (NRF_GPIOTE->EVENTS_IN[i] && (NRF_GPIOTE->INTENSET & (1 << i))) {
@@ -190,7 +190,7 @@ hal_gpio_irq_handler(void)
         }
     }
 
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 
 /*
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c b/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c
index dd861722b1..4e4910e685 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c
@@ -116,7 +116,7 @@ nrf52_timer_handler(void)
     os_sr_t sr;
     uint32_t counter;
 
-    os_trace_enter_isr();
+    os_trace_isr_enter();
     OS_ENTER_CRITICAL(sr);
 
     /* Calculate elapsed ticks and advance OS time. */
@@ -137,7 +137,7 @@ nrf52_timer_handler(void)
     nrf52_os_tick_set_ocmp(g_hal_os_tick.lastocmp + g_hal_os_tick.ticks_per_ostick);
 
     OS_EXIT_CRITICAL(sr);
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 
 void
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_spi.c b/hw/mcu/nordic/nrf52xxx/src/hal_spi.c
index 6dd34cbc9d..5df4afabfd 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_spi.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_spi.c
@@ -230,7 +230,7 @@ nrf52_irqs_handler(struct nrf52_hal_spi *spi)
 void
 nrf52_spi0_irq_handler(void)
 {
-    os_trace_enter_isr();
+    os_trace_isr_enter();
     if (nrf52_hal_spi0.spi_type == HAL_SPI_TYPE_MASTER) {
 #if MYNEWT_VAL(SPI_0_MASTER)
         nrf52_irqm_handler(&nrf52_hal_spi0);
@@ -240,7 +240,7 @@ nrf52_spi0_irq_handler(void)
         nrf52_irqs_handler(&nrf52_hal_spi0);
 #endif
     }
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 #endif
 
@@ -248,7 +248,7 @@ nrf52_spi0_irq_handler(void)
 void
 nrf52_spi1_irq_handler(void)
 {
-    os_trace_enter_isr();
+    os_trace_isr_enter();
     if (nrf52_hal_spi1.spi_type == HAL_SPI_TYPE_MASTER) {
 #if MYNEWT_VAL(SPI_1_MASTER)
         nrf52_irqm_handler(&nrf52_hal_spi1);
@@ -258,7 +258,7 @@ nrf52_spi1_irq_handler(void)
         nrf52_irqs_handler(&nrf52_hal_spi1);
 #endif
     }
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 #endif
 
@@ -266,7 +266,7 @@ nrf52_spi1_irq_handler(void)
 void
 nrf52_spi2_irq_handler(void)
 {
-    os_trace_enter_isr();
+    os_trace_isr_enter();
     if (nrf52_hal_spi2.spi_type == HAL_SPI_TYPE_MASTER) {
 #if MYNEWT_VAL(SPI_2_MASTER)
         nrf52_irqm_handler(&nrf52_hal_spi2);
@@ -276,7 +276,7 @@ nrf52_spi2_irq_handler(void)
         nrf52_irqs_handler(&nrf52_hal_spi2);
 #endif
     }
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 #endif
 
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_timer.c b/hw/mcu/nordic/nrf52xxx/src/hal_timer.c
index 7ac4d62a1b..2f25292ae0 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_timer.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_timer.c
@@ -317,7 +317,7 @@ hal_timer_irq_handler(struct nrf52_hal_timer *bsptimer)
     uint32_t compare;
     NRF_TIMER_Type *hwtimer;
 
-    os_trace_enter_isr();
+    os_trace_isr_enter();
 
     /* Check interrupt source. If set, clear them */
     hwtimer = bsptimer->tmr_reg;
@@ -345,7 +345,7 @@ hal_timer_irq_handler(struct nrf52_hal_timer *bsptimer)
         compare = hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT];
     }
 
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 #endif
 
@@ -357,6 +357,8 @@ hal_rtc_timer_irq_handler(struct nrf52_hal_timer *bsptimer)
     uint32_t compare;
     NRF_RTC_Type *rtctimer;
 
+    os_trace_isr_enter();
+
     /* Check interrupt source. If set, clear them */
     rtctimer = (NRF_RTC_Type *)bsptimer->tmr_reg;
     compare = rtctimer->EVENTS_COMPARE[NRF_RTC_TIMER_CC_INT];
@@ -386,6 +388,8 @@ hal_rtc_timer_irq_handler(struct nrf52_hal_timer *bsptimer)
 
     /* Recommended by nordic to make sure interrupts are cleared */
     compare = rtctimer->EVENTS_COMPARE[NRF_RTC_TIMER_CC_INT];
+
+    os_trace_isr_exit();
 }
 #endif
 
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_uart.c b/hw/mcu/nordic/nrf52xxx/src/hal_uart.c
index 10f11b939f..e29506db8e 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_uart.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_uart.c
@@ -235,7 +235,7 @@ uart_irq_handler(NRF_UARTE_Type *nrf_uart, struct hal_uart *u)
 {
     int rc;
 
-    os_trace_enter_isr();
+    os_trace_isr_enter();
 
     if (nrf_uart->EVENTS_ENDTX) {
         nrf_uart->EVENTS_ENDTX = 0;
@@ -262,7 +262,7 @@ uart_irq_handler(NRF_UARTE_Type *nrf_uart, struct hal_uart *u)
             nrf_uart->TASKS_STARTRX = 1;
         }
     }
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 
 static void
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_watchdog.c b/hw/mcu/nordic/nrf52xxx/src/hal_watchdog.c
index 0a5cbf2a3c..6248dbec4d 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_watchdog.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_watchdog.c
@@ -33,12 +33,12 @@ nrf52_hal_wdt_default_handler(void)
 static void
 nrf52_wdt_irq_handler(void)
 {
-    os_trace_enter_isr();
+    os_trace_isr_enter();
     if (NRF_WDT->INTENSET & WDT_INTENSET_TIMEOUT_Msk) {
         NRF_WDT->EVENTS_TIMEOUT = 0;
         nrf52_hal_wdt_default_handler();
     }
-    os_trace_exit_isr();
+    os_trace_isr_exit();
 }
 
 int
diff --git a/kernel/os/include/os/os_trace_api.h b/kernel/os/include/os/os_trace_api.h
index e01ff20227..c8777962da 100644
--- a/kernel/os/include/os/os_trace_api.h
+++ b/kernel/os/include/os/os_trace_api.h
@@ -20,65 +20,261 @@
 #ifndef OS_TRACE_API_H
 #define OS_TRACE_API_H
 
-#include <stdint.h>
+#ifdef __ASSEMBLER__
 
+#define os_trace_isr_enter              SEGGER_SYSVIEW_RecordEnterISR
+#define os_trace_isr_exit               SEGGER_SYSVIEW_RecordExitISR
+#define os_trace_task_start_exec        SEGGER_SYSVIEW_OnTaskStartExec
+
+#else
+
+#include <stdio.h>
+#include <string.h>
 #include "syscfg/syscfg.h"
+#if MYNEWT_VAL(OS_SYSVIEW)
+#include "sysview/vendor/SEGGER_SYSVIEW.h"
+#endif
 #include "os/os.h"
 
-#define OS_TRACE_ID_OFFSET                    (32u)
-
-#define OS_TRACE_ID_EVQ_PUT                   (1u + OS_TRACE_ID_OFFSET)
-#define OS_TRACE_ID_EVQ_GET                   (2u + OS_TRACE_ID_OFFSET)
-#define OS_TRACE_ID_MUTEX_INIT                (3u + OS_TRACE_ID_OFFSET)
-#define OS_TRACE_ID_MUTEX_RELEASE             (4u + OS_TRACE_ID_OFFSET)
-#define OS_TRACE_ID_MUTEX_PEND                (5u + OS_TRACE_ID_OFFSET)
+#define OS_TRACE_ID_EVENTQ_PUT                  (40)
+#define OS_TRACE_ID_EVENTQ_GET_NO_WAIT          (41)
+#define OS_TRACE_ID_EVENTQ_GET                  (42)
+#define OS_TRACE_ID_EVENTQ_REMOVE               (43)
+#define OS_TRACE_ID_EVENTQ_POLL_0TIMO           (44)
+#define OS_TRACE_ID_EVENTQ_POLL                 (45)
+#define OS_TRACE_ID_MUTEX_INIT                  (50)
+#define OS_TRACE_ID_MUTEX_RELEASE               (51)
+#define OS_TRACE_ID_MUTEX_PEND                  (52)
+#define OS_TRACE_ID_SEM_INIT                    (60)
+#define OS_TRACE_ID_SEM_RELEASE                 (61)
+#define OS_TRACE_ID_SEM_PEND                    (62)
+#define OS_TRACE_ID_CALLOUT_INIT                (70)
+#define OS_TRACE_ID_CALLOUT_STOP                (71)
+#define OS_TRACE_ID_CALLOUT_RESET               (72)
+#define OS_TRACE_ID_CALLOUT_TICK                (73)
+#define OS_TRACE_ID_MEMBLOCK_GET                (80)
+#define OS_TRACE_ID_MEMBLOCK_PUT_FROM_CB        (81)
+#define OS_TRACE_ID_MEMBLOCK_PUT                (82)
+#define OS_TRACE_ID_MBUF_GET                    (90)
+#define OS_TRACE_ID_MBUF_GET_PKTHDR             (91)
+#define OS_TRACE_ID_MBUF_FREE                   (92)
+#define OS_TRACE_ID_MBUF_FREE_CHAIN             (93)
 
 #if MYNEWT_VAL(OS_SYSVIEW)
-void os_trace_enter_isr(void);
-void os_trace_exit_isr(void);
-void os_trace_exit_isr_to_scheduler(void);
-void os_trace_task_info(const struct os_task *p_task);
-void os_trace_task_create(uint32_t task_id);
-void os_trace_task_start_exec(uint32_t task_id);
-void os_trace_task_stop_exec(void);
-void os_trace_task_start_ready(uint32_t task_id);
-void os_trace_task_stop_ready(uint32_t task_id, unsigned reason);
-void os_trace_idle(void);
-
-void os_trace_void(unsigned id);
-void os_trace_u32(unsigned id, uint32_t para0);
-void os_trace_u32x2(unsigned id, uint32_t para0, uint32_t para1);
-void os_trace_u32x3(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2);
-void os_trace_u32x4(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2, uint32_t para3);
-void os_trace_u32x5(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2, uint32_t para3, uint32_t para4);
-void os_trace_enter_timer(uint32_t timer_id);
-void os_trace_exit_timer(void);
-
-void os_trace_end_call(unsigned id);
-void os_trace_end_call_return_value(unsigned id, uint32_t return_value);
 
-#else
+typedef struct SEGGER_SYSVIEW_MODULE_STRUCT os_trace_module_t;
 
-static inline void os_trace_enter_isr(void){}
-static inline void os_trace_exit_isr(void){}
-static inline void os_trace_exit_isr_to_scheduler(void){}
-static inline void os_trace_task_info(const struct os_task *p_task){}
-static inline void os_trace_task_create(uint32_t task_id){}
-static inline void os_trace_task_start_exec(uint32_t task_id){}
-static inline void os_trace_task_stop_exec(void){}
-static inline void os_trace_task_start_ready(uint32_t task_id){}
-static inline void os_trace_task_stop_ready(uint32_t task_id, unsigned reason){}
-static inline void os_trace_idle(void){}
-static inline void os_trace_void(unsigned id){}
-static inline void os_trace_u32(unsigned id, uint32_t para0){}
-static inline void os_trace_u32x2(unsigned id, uint32_t para0, uint32_t para1){}
-static inline void os_trace_u32x3(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2){}
-static inline void os_trace_u32x4(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2, uint32_t para3){}
-static inline void os_trace_u32x5(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2, uint32_t para3, uint32_t para4){}
-static inline void os_trace_enter_timer(uint32_t timer_id){}
-static inline void os_trace_exit_timer(void){}
-static inline void os_trace_end_call(unsigned id){}
-static inline void os_trace_end_call_return_value(unsigned id, uint32_t return_value){}
-#endif
+static inline uint32_t
+os_trace_module_register(os_trace_module_t *m, const char *name,
+                         uint32_t num_events, void (* send_desc_func)(void))
+{
+    char *desc = "M=???";
 
-#endif
+    asprintf(&desc, "M=%s", name);
+
+    memset(m, 0, sizeof(*m));
+    m->sModule = desc;
+    m->NumEvents = num_events;
+    m->pfSendModuleDesc = send_desc_func;
+
+    SEGGER_SYSVIEW_RegisterModule(m);
+
+    return m->EventOffset;
+}
+
+static inline void
+os_trace_module_desc(const os_trace_module_t *m, const char *desc)
+{
+    SEGGER_SYSVIEW_RecordModuleDescription(m, desc);
+}
+
+static inline void
+os_trace_isr_enter(void)
+{
+    SEGGER_SYSVIEW_RecordEnterISR();
+}
+
+static inline void
+os_trace_isr_exit(void)
+{
+    SEGGER_SYSVIEW_RecordExitISR();
+}
+
+static inline void
+os_trace_task_info(const struct os_task *t)
+{
+    SEGGER_SYSVIEW_TASKINFO ti;
+
+    ti.TaskID = (uint32_t)t;
+    ti.sName = t->t_name;
+    ti.Prio = t->t_prio;
+    ti.StackBase = (uint32_t)&t->t_stacktop;
+    ti.StackSize = t->t_stacksize * sizeof(os_stack_t);
+
+    SEGGER_SYSVIEW_SendTaskInfo(&ti);
+}
+
+static inline void
+os_trace_task_create(const struct os_task *t)
+{
+    SEGGER_SYSVIEW_OnTaskCreate((uint32_t)t);
+}
+
+static inline void
+os_trace_task_start_exec(const struct os_task *t)
+{
+    SEGGER_SYSVIEW_OnTaskStartExec((uint32_t)t);
+}
+
+static inline void
+os_trace_task_stop_exec(void)
+{
+    SEGGER_SYSVIEW_OnTaskStopExec();
+}
+
+static inline void
+os_trace_task_start_ready(const struct os_task *t)
+{
+    SEGGER_SYSVIEW_OnTaskStartReady((uint32_t)t);
+}
+
+static inline void
+os_trace_task_stop_ready(const struct os_task *t, unsigned reason)
+{
+    SEGGER_SYSVIEW_OnTaskStopReady((uint32_t)t, reason);
+}
+
+static inline void
+os_trace_idle(void)
+{
+    SEGGER_SYSVIEW_OnIdle();
+}
+
+#endif /* MYNEWT_VAL(OS_SYSVIEW) */
+
+#if MYNEWT_VAL(OS_SYSVIEW) && !defined(OS_TRACE_DISABLE_FILE_API)
+
+static inline void
+os_trace_api_void(unsigned id)
+{
+    SEGGER_SYSVIEW_RecordVoid(id);
+}
+
+static inline void
+os_trace_api_u32(unsigned id, uint32_t p0)
+{
+    SEGGER_SYSVIEW_RecordU32(id, p0);
+}
+
+static inline void
+os_trace_api_u32x2(unsigned id, uint32_t p0, uint32_t p1)
+{
+    SEGGER_SYSVIEW_RecordU32x2(id, p0, p1);
+}
+
+static inline void
+os_trace_api_u32x3(unsigned id, uint32_t p0, uint32_t p1, uint32_t p2)
+{
+    SEGGER_SYSVIEW_RecordU32x3(id, p0, p1, p2);
+}
+
+static inline void
+os_trace_api_ret(unsigned id)
+{
+    SEGGER_SYSVIEW_RecordEndCall(id);
+}
+
+static inline void
+os_trace_api_ret_u32(unsigned id, uint32_t ret)
+{
+    SEGGER_SYSVIEW_RecordEndCallU32(id, ret);
+}
+
+#endif /* MYNEWT_VAL(OS_SYSVIEW) && !defined(OS_TRACE_DISABLE_FILE_API) */
+
+#if !MYNEWT_VAL(OS_SYSVIEW)
+
+static inline void
+os_trace_isr_enter(void)
+{
+}
+
+static inline void
+os_trace_isr_exit(void)
+{
+}
+
+static inline void
+os_trace_task_info(const struct os_task *t)
+{
+}
+
+static inline void
+os_trace_task_create(const struct os_task *t)
+{
+}
+
+static inline void
+os_trace_task_start_exec(const struct os_task *t)
+{
+}
+
+static inline void
+os_trace_task_stop_exec(void)
+{
+}
+
+static inline void
+os_trace_task_start_ready(const struct os_task *t)
+{
+}
+
+static inline void
+os_trace_task_stop_ready(const struct os_task *t, unsigned reason)
+{
+}
+
+static inline void
+os_trace_idle(void)
+{
+}
+
+#endif /* !MYNEWT_VAL(OS_SYSVIEW) */
+
+#if !MYNEWT_VAL(OS_SYSVIEW) || defined(OS_TRACE_DISABLE_FILE_API)
+
+static inline void
+os_trace_api_void(unsigned id)
+{
+}
+
+static inline void
+os_trace_api_u32(unsigned id, uint32_t p0)
+{
+}
+
+static inline void
+os_trace_api_u32x2(unsigned id, uint32_t p0, uint32_t p1)
+{
+}
+
+static inline void
+os_trace_api_u32x3(unsigned id, uint32_t p0, uint32_t p1, uint32_t p2)
+{
+}
+
+static inline void
+os_trace_api_ret(unsigned id)
+{
+}
+
+static inline void
+os_trace_api_ret_u32(unsigned id, uint32_t return_value)
+{
+}
+
+#endif /* !MYNEWT_VAL(OS_SYSVIEW) || defined(OS_TRACE_DISABLE_FILE_API) */
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* OS_TRACE_API_H */
diff --git a/kernel/os/src/arch/cortex_m0/m0/HAL_CM0.s b/kernel/os/src/arch/cortex_m0/m0/HAL_CM0.s
index de7d46c764..edf4b59301 100644
--- a/kernel/os/src/arch/cortex_m0/m0/HAL_CM0.s
+++ b/kernel/os/src/arch/cortex_m0/m0/HAL_CM0.s
@@ -24,6 +24,8 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *---------------------------------------------------------------------------*/
+#include <syscfg/syscfg.h>
+#include "os/os_trace_api.h"
 
         .file   "HAL_CM0.S"
         .syntax unified
@@ -100,6 +102,12 @@ os_arch_init_task_stack:
 SVC_Handler:
         .fnstart
         .cantunwind
+
+        PUSH    {R4,LR}
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_enter
+#endif
+
         MRS     R0,PSP                  /* Read PSP */
         LDR     R1,[R0,#24]             /* Read Saved PC from Stack */
         SUBS    R1,R1,#2                /* Point to SVC Instruction */
@@ -109,15 +117,16 @@ SVC_Handler:
         LDR     R1,[R0,#16]             /* Read saved R12 from Stack */
         MOV     R12, R1                 /* Store in R12 */
         LDMIA   R0,{R0-R3}              /* Read R0-R3 from stack */
-        PUSH    {LR}                    /* Save LR */
         BLX     R12                     /* Call SVC Function */
         MRS     R3,PSP                  /* Read PSP */
         STMIA   R3!,{R0-R2}             /* Store return values */
-        POP     {PC}                    /* RETI */
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_exit
+#endif
+        POP     {R4,PC}                 /* RETI */
 
         /*------------------- User SVC ------------------------------*/
 SVC_User:
-        PUSH    {R4,LR}                 /* Save Registers */
         LDR     R2,=SVC_Count
         LDR     R2,[R2]
         CMP     R1,R2
@@ -132,6 +141,9 @@ SVC_User:
         MRS     R4,PSP                  /* Read PSP */
         STMIA   R4!,{R0-R3}             /* Function return values */
 SVC_Done:
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_exit
+#endif
         POP     {R4,PC}                 /* RETI */
         .fnend
         .size   SVC_Handler, .-SVC_Handler
@@ -175,7 +187,15 @@ context_switch:
         MSR     PSP,R0              /* Write PSP */
         SUBS    R0,R0,#32
         LDMIA   R0!,{R4-R7}         /* Restore New Context */
+
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        MOV     R0, R2
+        BL      os_trace_task_start_exec
+        POP     {R4,PC}
+#else
         BX      LR                  /* Return to Thread Mode */
+#endif
 
         .fnend
         .size   PendSV_Handler, .-PendSV_Handler
@@ -193,7 +213,13 @@ SysTick_Handler:
         .cantunwind
 
         PUSH    {R4,LR}                 /* Save EXC_RETURN */
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_enter
+#endif
         BL      timer_handler
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_exit
+#endif
         POP     {R4,PC}                 /* Restore EXC_RETURN */
 
         .fnend
@@ -224,6 +250,11 @@ os_default_irq_asm:
         .fnstart
         .cantunwind
 
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        BL      os_trace_isr_enter
+#endif
+
         /*
          * LR = 0xfffffff9 if we were using MSP as SP
          * LR = 0xfffffffd if we were using PSP as SP
@@ -244,7 +275,11 @@ using_msp_as_sp:
         MOV     R1,R9
         MOV     R2,R10
         MOV     R3,R11
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R0-R3}
+#else
         PUSH    {R0-R3, LR}
+#endif
         /* Now push r3 - r7. R3 is the lowest memory address. */
         MOV     R3,R12
         PUSH    {R3-R7}
@@ -256,7 +291,12 @@ using_msp_as_sp:
         MOV     R9,R1
         MOV     R10,R2
         MOV     R11,R3
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_exit
+        POP     {R4,PC}
+#else
         POP     {PC}                 /* Restore EXC_RETURN */
+#endif
 
         .fnend
         .size   os_default_irq_asm, .-os_default_irq_asm
diff --git a/kernel/os/src/arch/cortex_m3/m3/HAL_CM3.s b/kernel/os/src/arch/cortex_m3/m3/HAL_CM3.s
index 92b929c824..456bc5b2fd 100644
--- a/kernel/os/src/arch/cortex_m3/m3/HAL_CM3.s
+++ b/kernel/os/src/arch/cortex_m3/m3/HAL_CM3.s
@@ -25,6 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *---------------------------------------------------------------------------*/
 #include <syscfg/syscfg.h>
+#include "os/os_trace_api.h"
 
         .syntax unified
 
@@ -162,6 +163,14 @@ PendSV_Handler:
         LDR     R12,[R2,#0]             /* get stack pointer of task we will start */
         LDMIA   R12!,{R4-R11}           /* Restore New Context */
         MSR     PSP,R12                 /* Write PSP */
+
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        MOV     R0, R2
+        BL      os_trace_task_start_exec
+        POP     {R4,LR}
+#endif
+
         BX      LR                      /* Return to Thread Mode */
 
         .fnend
diff --git a/kernel/os/src/arch/cortex_m4/m4/HAL_CM4.s b/kernel/os/src/arch/cortex_m4/m4/HAL_CM4.s
index c3def4ed9c..29b2365bde 100644
--- a/kernel/os/src/arch/cortex_m4/m4/HAL_CM4.s
+++ b/kernel/os/src/arch/cortex_m4/m4/HAL_CM4.s
@@ -25,6 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *---------------------------------------------------------------------------*/
 #include <syscfg/syscfg.h>
+#include "os/os_trace_api.h"
 
         .syntax unified
 
@@ -97,6 +98,12 @@ SVC_Handler:
         .fnstart
         .cantunwind
 
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        BL      os_trace_isr_enter
+        POP     {R4,LR}
+#endif
+
         MRS     R0,PSP                  /* Read PSP */
         LDR     R1,[R0,#24]             /* Read Saved PC from Stack */
         LDRB    R1,[R1,#-2]             /* Load SVC Number */
@@ -109,6 +116,13 @@ SVC_Handler:
 
         MRS     R12,PSP                 /* Read PSP */
         STM     R12,{R0-R2}             /* Store return values */
+
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        BL      os_trace_isr_exit
+        POP     {R4,LR}
+#endif
+
         BX      LR                      /* Return from interrupt */
 
         /*------------------- User SVC ------------------------------*/
@@ -128,6 +142,9 @@ SVC_User:
         MRS     R12,PSP
         STM     R12,{R0-R3}             /* Function return values */
 SVC_Done:
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_exit
+#endif
         POP     {R4,LR}                 /* Restore EXC_RETURN */
         BX      LR                      /* Return from interrupt */
 
@@ -178,6 +195,14 @@ PendSV_Handler:
         LDMIA   R12!,{R4-R11}           /* Restore New Context */
 #endif
         MSR     PSP,R12                 /* Write PSP */
+
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        MOV     R0, R2
+        BL      os_trace_task_start_exec
+        POP     {R4,LR}
+#endif
+
         BX      LR                      /* Return to Thread Mode */
 
         .fnend
@@ -195,7 +220,13 @@ SysTick_Handler:
         .cantunwind
 
         PUSH    {R4,LR}                 /* Save EXC_RETURN */
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_enter
+#endif
         BL      timer_handler
+#if MYNEWT_VAL(OS_SYSVIEW)
+        BL      os_trace_isr_exit
+#endif
         POP     {R4,LR}                 /* Restore EXC_RETURN */
         BX      LR
 
@@ -210,6 +241,12 @@ os_default_irq_asm:
         .fnstart
         .cantunwind
 
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        BL      os_trace_isr_enter
+        POP     {R4,LR}
+#endif
+
         /*
          * LR = 0xfffffff9 if we were using MSP as SP
          * LR = 0xfffffffd if we were using PSP as SP
@@ -222,6 +259,13 @@ os_default_irq_asm:
         MOV     R0, SP
         BL      os_default_irq
         POP     {R3-R11,LR}                 /* Restore EXC_RETURN */
+
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        BL      os_trace_isr_exit
+        POP     {R4,LR}
+#endif
+
         BX      LR
 
         .fnend
diff --git a/kernel/os/src/arch/cortex_m7/m7/HAL_CM7.s b/kernel/os/src/arch/cortex_m7/m7/HAL_CM7.s
index c190d6958b..eaf0f935ab 100644
--- a/kernel/os/src/arch/cortex_m7/m7/HAL_CM7.s
+++ b/kernel/os/src/arch/cortex_m7/m7/HAL_CM7.s
@@ -25,6 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *---------------------------------------------------------------------------*/
 #include <syscfg/syscfg.h>
+#include "os/os_trace_api.h"
 
         .syntax unified
 
@@ -178,6 +179,14 @@ PendSV_Handler:
         LDMIA   R12!,{R4-R11}           /* Restore New Context */
 #endif
         MSR     PSP,R12                 /* Write PSP */
+
+#if MYNEWT_VAL(OS_SYSVIEW)
+        PUSH    {R4,LR}
+        MOV     R0, R2
+        BL      os_trace_task_start_exec
+        POP     {R4,LR}
+#endif
+
         BX      LR                      /* Return to Thread Mode */
 
         .fnend
diff --git a/kernel/os/src/os_callout.c b/kernel/os/src/os_callout.c
index b4d0d72224..8ebafd300a 100644
--- a/kernel/os/src/os_callout.c
+++ b/kernel/os/src/os_callout.c
@@ -19,7 +19,10 @@
 
 #include <assert.h>
 #include <string.h>
-
+#include "syscfg/syscfg.h"
+#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_CALLOUT)
+#define OS_TRACE_DISABLE_FILE_API
+#endif
 #include "os/mynewt.h"
 #include "os_priv.h"
 
@@ -28,10 +31,14 @@ struct os_callout_list g_callout_list;
 void os_callout_init(struct os_callout *c, struct os_eventq *evq,
                      os_event_fn *ev_cb, void *ev_arg)
 {
+    os_trace_api_u32x2(OS_TRACE_ID_CALLOUT_INIT, (uint32_t)c, (uint32_t)evq);
+
     memset(c, 0, sizeof(*c));
     c->c_ev.ev_cb = ev_cb;
     c->c_ev.ev_arg = ev_arg;
     c->c_evq = evq;
+
+    os_trace_api_ret(OS_TRACE_ID_CALLOUT_INIT);
 }
 
 void
@@ -39,6 +46,8 @@ os_callout_stop(struct os_callout *c)
 {
     os_sr_t sr;
 
+    os_trace_api_u32(OS_TRACE_ID_CALLOUT_STOP, (uint32_t)c);
+
     OS_ENTER_CRITICAL(sr);
 
     if (os_callout_queued(c)) {
@@ -51,6 +60,8 @@ os_callout_stop(struct os_callout *c)
     }
 
     OS_EXIT_CRITICAL(sr);
+
+    os_trace_api_ret(OS_TRACE_ID_CALLOUT_STOP);
 }
 
 int
@@ -58,10 +69,12 @@ os_callout_reset(struct os_callout *c, int32_t ticks)
 {
     struct os_callout *entry;
     os_sr_t sr;
-    int rc;
+    int ret;
+
+    os_trace_api_u32x2(OS_TRACE_ID_CALLOUT_RESET, (uint32_t)c, (uint32_t)ticks);
 
     if (ticks < 0) {
-        rc = OS_EINVAL;
+        ret = OS_EINVAL;
         goto err;
     }
 
@@ -90,9 +103,11 @@ os_callout_reset(struct os_callout *c, int32_t ticks)
 
     OS_EXIT_CRITICAL(sr);
 
-    return (0);
+    ret = OS_OK;
+
 err:
-    return (rc);
+    os_trace_api_ret_u32(OS_TRACE_ID_CALLOUT_RESET, (uint32_t)ret);
+    return ret;
 }
 
 
@@ -109,6 +124,8 @@ os_callout_tick(void)
     struct os_callout *c;
     uint32_t now;
 
+    os_trace_api_void(OS_TRACE_ID_CALLOUT_TICK);
+
     now = os_time_get();
 
     while (1) {
@@ -134,6 +151,8 @@ os_callout_tick(void)
             break;
         }
     }
+
+    os_trace_api_ret(OS_TRACE_ID_CALLOUT_TICK);
 }
 
 /*
diff --git a/kernel/os/src/os_eventq.c b/kernel/os/src/os_eventq.c
index 604c160fa6..e8389df02f 100644
--- a/kernel/os/src/os_eventq.c
+++ b/kernel/os/src/os_eventq.c
@@ -19,6 +19,10 @@
 
 #include <assert.h>
 #include <string.h>
+#include "syscfg/syscfg.h"
+#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_EVENTQ)
+#define OS_TRACE_DISABLE_FILE_API
+#endif
 #include "os/mynewt.h"
 
 static struct os_eventq os_eventq_main;
@@ -42,16 +46,17 @@ os_eventq_put(struct os_eventq *evq, struct os_event *ev)
     int resched;
     os_sr_t sr;
 
+    os_trace_api_u32x2(OS_TRACE_ID_EVENTQ_PUT, (uint32_t)evq, (uint32_t)ev);
+
     OS_ENTER_CRITICAL(sr);
 
     /* Do not queue if already queued */
     if (OS_EVENT_QUEUED(ev)) {
         OS_EXIT_CRITICAL(sr);
+        os_trace_api_ret(OS_TRACE_ID_EVENTQ_PUT);
         return;
     }
 
-    os_trace_void(OS_TRACE_ID_EVQ_PUT);
-
     /* Queue the event */
     ev->ev_queued = 1;
     STAILQ_INSERT_TAIL(&evq->evq_list, ev, ev_next);
@@ -72,12 +77,13 @@ os_eventq_put(struct os_eventq *evq, struct os_event *ev)
         evq->evq_task = NULL;
     }
 
-    os_trace_end_call(OS_TRACE_ID_EVQ_PUT);
     OS_EXIT_CRITICAL(sr);
 
     if (resched) {
         os_sched(NULL);
     }
+
+    os_trace_api_ret(OS_TRACE_ID_EVENTQ_PUT);
 }
 
 struct os_event *
@@ -85,12 +91,16 @@ os_eventq_get_no_wait(struct os_eventq *evq)
 {
     struct os_event *ev;
 
+    os_trace_api_u32(OS_TRACE_ID_EVENTQ_GET_NO_WAIT, (uint32_t)evq);
+
     ev = STAILQ_FIRST(&evq->evq_list);
     if (ev) {
         STAILQ_REMOVE(&evq->evq_list, ev, os_event, ev_next);
         ev->ev_queued = 0;
     }
 
+    os_trace_api_ret_u32(OS_TRACE_ID_EVENTQ_GET_NO_WAIT, (uint32_t)ev);
+
     return ev;
 }
 
@@ -101,6 +111,8 @@ os_eventq_get(struct os_eventq *evq)
     os_sr_t sr;
     struct os_task *t;
 
+    os_trace_api_u32(OS_TRACE_ID_EVENTQ_GET, (uint32_t)evq);
+
     t = os_sched_get_current_task();
     if (evq->evq_owner != t) {
         if (evq->evq_owner == NULL) {
@@ -114,7 +126,6 @@ os_eventq_get(struct os_eventq *evq)
         }
     }
     OS_ENTER_CRITICAL(sr);
-    os_trace_void(OS_TRACE_ID_EVQ_GET);
 pull_one:
     ev = STAILQ_FIRST(&evq->evq_list);
     if (ev) {
@@ -133,9 +144,10 @@ os_eventq_get(struct os_eventq *evq)
         evq->evq_task = NULL;
         goto pull_one;
     }
-    os_trace_end_call(OS_TRACE_ID_EVQ_GET);
     OS_EXIT_CRITICAL(sr);
 
+    os_trace_api_ret_u32(OS_TRACE_ID_EVENTQ_GET, (uint32_t)ev);
+
     return (ev);
 }
 
@@ -157,6 +169,9 @@ os_eventq_poll_0timo(struct os_eventq **evq, int nevqs)
     os_sr_t sr;
     int i;
 
+    os_trace_api_u32x2(OS_TRACE_ID_EVENTQ_POLL_0TIMO, (uint32_t)evq[0],
+                   (uint32_t)nevqs);
+
     ev = NULL;
 
     OS_ENTER_CRITICAL(sr);
@@ -170,6 +185,8 @@ os_eventq_poll_0timo(struct os_eventq **evq, int nevqs)
     }
     OS_EXIT_CRITICAL(sr);
 
+    os_trace_api_ret_u32(OS_TRACE_ID_EVENTQ_POLL_0TIMO, (uint32_t)ev);
+
     return ev;
 }
 
@@ -188,6 +205,9 @@ os_eventq_poll(struct os_eventq **evq, int nevqs, os_time_t timo)
         return os_eventq_poll_0timo(evq, nevqs);
     }
 
+    os_trace_api_u32x3(OS_TRACE_ID_EVENTQ_POLL, (uint32_t)evq[0], (uint32_t)nevqs,
+                   (uint32_t)timo);
+
     ev = NULL;
 
     OS_ENTER_CRITICAL(sr);
@@ -236,6 +256,8 @@ os_eventq_poll(struct os_eventq **evq, int nevqs, os_time_t timo)
     OS_EXIT_CRITICAL(sr);
 
 has_event:
+    os_trace_api_ret_u32(OS_TRACE_ID_EVENTQ_POLL, (uint32_t)ev);
+
     return (ev);
 }
 
@@ -244,12 +266,16 @@ os_eventq_remove(struct os_eventq *evq, struct os_event *ev)
 {
     os_sr_t sr;
 
+    os_trace_api_u32x2(OS_TRACE_ID_EVENTQ_REMOVE, (uint32_t)evq, (uint32_t)ev);
+
     OS_ENTER_CRITICAL(sr);
     if (OS_EVENT_QUEUED(ev)) {
         STAILQ_REMOVE(&evq->evq_list, ev, os_event, ev_next);
     }
     ev->ev_queued = 0;
     OS_EXIT_CRITICAL(sr);
+
+    os_trace_api_ret(OS_TRACE_ID_EVENTQ_REMOVE);
 }
 
 struct os_eventq *
diff --git a/kernel/os/src/os_mbuf.c b/kernel/os/src/os_mbuf.c
index b13423abf9..cfb0d8f3be 100644
--- a/kernel/os/src/os_mbuf.c
+++ b/kernel/os/src/os_mbuf.c
@@ -36,6 +36,10 @@
 #include <assert.h>
 #include <string.h>
 #include <limits.h>
+#include "syscfg/syscfg.h"
+#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_MBUF)
+#define OS_TRACE_DISABLE_FILE_API
+#endif
 #include "os/mynewt.h"
 
 /**
@@ -243,13 +247,17 @@ os_mbuf_get(struct os_mbuf_pool *omp, uint16_t leadingspace)
 {
     struct os_mbuf *om;
 
+    os_trace_api_u32x2(OS_TRACE_ID_MBUF_GET, (uint32_t)omp,
+                       (uint32_t)leadingspace);
+
     if (leadingspace > omp->omp_databuf_len) {
-        goto err;
+        om = NULL;
+        goto done;
     }
 
     om = os_memblock_get(omp->omp_pool);
     if (!om) {
-        goto err;
+        goto done;
     }
 
     SLIST_NEXT(om, om_next) = NULL;
@@ -259,9 +267,9 @@ os_mbuf_get(struct os_mbuf_pool *omp, uint16_t leadingspace)
     om->om_data = (&om->om_databuf[0] + leadingspace);
     om->om_omp = omp;
 
-    return (om);
-err:
-    return (NULL);
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MBUF_GET, (uint32_t)om);
+    return om;
 }
 
 struct os_mbuf *
@@ -271,10 +279,14 @@ os_mbuf_get_pkthdr(struct os_mbuf_pool *omp, uint8_t user_pkthdr_len)
     struct os_mbuf_pkthdr *pkthdr;
     struct os_mbuf *om;
 
+    os_trace_api_u32x2(OS_TRACE_ID_MBUF_GET_PKTHDR, (uint32_t)omp,
+                       (uint32_t)user_pkthdr_len);
+
     /* User packet header must fit inside mbuf */
     pkthdr_len = user_pkthdr_len + sizeof(struct os_mbuf_pkthdr);
     if ((pkthdr_len > omp->omp_databuf_len) || (pkthdr_len > 255)) {
-        return NULL;
+        om = NULL;
+        goto done;
     }
 
     om = os_mbuf_get(omp, 0);
@@ -288,6 +300,8 @@ os_mbuf_get_pkthdr(struct os_mbuf_pool *omp, uint8_t user_pkthdr_len)
         STAILQ_NEXT(pkthdr, omp_next) = NULL;
     }
 
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MBUF_GET_PKTHDR, (uint32_t)om);
     return om;
 }
 
@@ -296,15 +310,19 @@ os_mbuf_free(struct os_mbuf *om)
 {
     int rc;
 
+    os_trace_api_u32(OS_TRACE_ID_MBUF_FREE, (uint32_t)om);
+
     if (om->om_omp != NULL) {
         rc = os_memblock_put(om->om_omp->omp_pool, om);
         if (rc != 0) {
-            goto err;
+            goto done;
         }
     }
 
-    return (0);
-err:
+    rc = 0;
+
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MBUF_FREE, (uint32_t)rc);
     return (rc);
 }
 
@@ -314,19 +332,23 @@ os_mbuf_free_chain(struct os_mbuf *om)
     struct os_mbuf *next;
     int rc;
 
+    os_trace_api_u32(OS_TRACE_ID_MBUF_FREE_CHAIN, (uint32_t)om);
+
     while (om != NULL) {
         next = SLIST_NEXT(om, om_next);
 
         rc = os_mbuf_free(om);
         if (rc != 0) {
-            goto err;
+            goto done;
         }
 
         om = next;
     }
 
-    return (0);
-err:
+    rc = 0;
+
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MBUF_FREE_CHAIN, (uint32_t)rc);
     return (rc);
 }
 
diff --git a/kernel/os/src/os_mempool.c b/kernel/os/src/os_mempool.c
index 4ee7abf535..8b448bc76c 100644
--- a/kernel/os/src/os_mempool.c
+++ b/kernel/os/src/os_mempool.c
@@ -20,6 +20,10 @@
 #include <string.h>
 #include <assert.h>
 #include <stdbool.h>
+#include "syscfg/syscfg.h"
+#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_MEMPOOL)
+#define OS_TRACE_DISABLE_FILE_API
+#endif
 #include "os/mynewt.h"
 
 #define OS_MEM_TRUE_BLOCK_SIZE(bsize)   OS_ALIGN(bsize, OS_ALIGNMENT)
@@ -223,6 +227,8 @@ os_memblock_get(struct os_mempool *mp)
     os_sr_t sr;
     struct os_memblock *block;
 
+    os_trace_api_u32(OS_TRACE_ID_MEMBLOCK_GET, (uint32_t)mp);
+
     /* Check to make sure they passed in a memory pool (or something) */
     block = NULL;
     if (mp) {
@@ -248,6 +254,8 @@ os_memblock_get(struct os_mempool *mp)
         }
     }
 
+    os_trace_api_ret_u32(OS_TRACE_ID_MEMBLOCK_GET, (uint32_t)block);
+
     return (void *)block;
 }
 
@@ -257,6 +265,9 @@ os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr)
     os_sr_t sr;
     struct os_memblock *block;
 
+    os_trace_api_u32x2(OS_TRACE_ID_MEMBLOCK_PUT_FROM_CB, (uint32_t)mp,
+                       (uint32_t)block_addr);
+
     os_mempool_poison(block_addr, OS_MEMPOOL_TRUE_BLOCK_SIZE(mp));
 
     block = (struct os_memblock *)block_addr;
@@ -272,6 +283,8 @@ os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr)
 
     OS_EXIT_CRITICAL(sr);
 
+    os_trace_api_ret_u32(OS_TRACE_ID_MEMBLOCK_PUT_FROM_CB, (uint32_t)OS_OK);
+
     return OS_OK;
 }
 
@@ -279,14 +292,18 @@ os_error_t
 os_memblock_put(struct os_mempool *mp, void *block_addr)
 {
     struct os_mempool_ext *mpe;
-    int rc;
+    os_error_t ret;
 #if MYNEWT_VAL(OS_MEMPOOL_CHECK)
     struct os_memblock *block;
 #endif
 
+    os_trace_api_u32x2(OS_TRACE_ID_MEMBLOCK_PUT, (uint32_t)mp,
+                       (uint32_t)block_addr);
+
     /* Make sure parameters are valid */
     if ((mp == NULL) || (block_addr == NULL)) {
-        return OS_INVALID_PARM;
+        ret = OS_INVALID_PARM;
+        goto done;
     }
 
 #if MYNEWT_VAL(OS_MEMPOOL_CHECK)
@@ -307,13 +324,17 @@ os_memblock_put(struct os_mempool *mp, void *block_addr)
     if (mp->mp_flags & OS_MEMPOOL_F_EXT) {
         mpe = (struct os_mempool_ext *)mp;
         if (mpe->mpe_put_cb != NULL) {
-            rc = mpe->mpe_put_cb(mpe, block_addr, mpe->mpe_put_arg);
-            return rc;
+            ret = mpe->mpe_put_cb(mpe, block_addr, mpe->mpe_put_arg);
+            goto done;
         }
     }
 
     /* No callback; free the block. */
-    return os_memblock_put_from_cb(mp, block_addr);
+    ret = os_memblock_put_from_cb(mp, block_addr);
+
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MEMBLOCK_PUT, (uint32_t)ret);
+    return ret;
 }
 
 struct os_mempool *
diff --git a/kernel/os/src/os_mutex.c b/kernel/os/src/os_mutex.c
index fbc78aa579..2dc5e07da0 100644
--- a/kernel/os/src/os_mutex.c
+++ b/kernel/os/src/os_mutex.c
@@ -18,24 +18,35 @@
  */
 
 #include <assert.h>
+#include "syscfg/syscfg.h"
+#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_MUTEX)
+#define OS_TRACE_DISABLE_FILE_API
+#endif
 #include "os/mynewt.h"
 
 os_error_t
 os_mutex_init(struct os_mutex *mu)
 {
+    os_error_t ret;
+
     if (!mu) {
-        return OS_INVALID_PARM;
+        ret = OS_INVALID_PARM;
+        goto done;
     }
 
-    os_trace_void(OS_TRACE_ID_MUTEX_INIT);
+    os_trace_api_u32(OS_TRACE_ID_MUTEX_INIT, (uint32_t)mu);
+
     /* Initialize to 0 */
     mu->mu_prio = 0;
     mu->mu_level = 0;
     mu->mu_owner = NULL;
     SLIST_FIRST(&mu->mu_head) = NULL;
-    os_trace_end_call(OS_TRACE_ID_MUTEX_INIT);
 
-    return OS_OK;
+    ret = OS_OK;
+
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MUTEX_INIT, (uint32_t)ret);
+    return ret;
 }
 
 os_error_t
@@ -45,31 +56,37 @@ os_mutex_release(struct os_mutex *mu)
     os_sr_t sr;
     struct os_task *current;
     struct os_task *rdy;
+    os_error_t ret;
+
+    os_trace_api_u32(OS_TRACE_ID_MUTEX_RELEASE, (uint32_t)mu);
 
     /* Check if OS is started */
     if (!g_os_started) {
-        return (OS_NOT_STARTED);
+        ret = OS_NOT_STARTED;
+        goto done;
     }
 
     /* Check for valid mutex */
     if (!mu) {
-        return OS_INVALID_PARM;
+        ret = OS_INVALID_PARM;
+        goto done;
     }
 
     /* We better own this mutex! */
     current = os_sched_get_current_task();
     if ((mu->mu_level == 0) || (mu->mu_owner != current)) {
-        return (OS_BAD_MUTEX);
+        ret = OS_BAD_MUTEX;
+        goto done;
     }
 
     /* Decrement nesting level by 1. If not zero, nested (so dont release!) */
     --mu->mu_level;
     if (mu->mu_level != 0) {
-        return (OS_OK);
+        ret = OS_OK;
+        goto done;
     }
 
     OS_ENTER_CRITICAL(sr);
-    os_trace_void(OS_TRACE_ID_MUTEX_RELEASE);
 
     /* Restore owner task's priority; resort list if different  */
     if (current->t_prio != mu->mu_prio) {
@@ -108,28 +125,35 @@ os_mutex_release(struct os_mutex *mu)
     if (resched) {
         os_sched(rdy);
     }
-    os_trace_end_call(OS_TRACE_ID_MUTEX_RELEASE);
 
-    return OS_OK;
+    ret = OS_OK;
+
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MUTEX_RELEASE, (uint32_t)ret);
+    return ret;
 }
 
 os_error_t
 os_mutex_pend(struct os_mutex *mu, uint32_t timeout)
 {
     os_sr_t sr;
-    os_error_t rc;
+    os_error_t ret;
     struct os_task *current;
     struct os_task *entry;
     struct os_task *last;
 
+    os_trace_api_u32x2(OS_TRACE_ID_MUTEX_PEND, (uint32_t)mu, (uint32_t)timeout);
+
     /* OS must be started when calling this function */
     if (!g_os_started) {
-        return (OS_NOT_STARTED);
+        ret = OS_NOT_STARTED;
+        goto done;
     }
 
     /* Check for valid mutex */
     if (!mu) {
-        return OS_INVALID_PARM;
+        ret = OS_INVALID_PARM;
+        goto done;
     }
 
     OS_ENTER_CRITICAL(sr);
@@ -142,24 +166,25 @@ os_mutex_pend(struct os_mutex *mu, uint32_t timeout)
         current->t_lockcnt++;
         mu->mu_level = 1;
         OS_EXIT_CRITICAL(sr);
-        return OS_OK;
+        ret = OS_OK;
+        goto done;
     }
 
     /* Are we owner? */
     if (mu->mu_owner == current) {
         ++mu->mu_level;
         OS_EXIT_CRITICAL(sr);
-        return OS_OK;
+        ret = OS_OK;
+        goto done;
     }
 
     /* Mutex is not owned by us. If timeout is 0, return immediately */
     if (timeout == 0) {
         OS_EXIT_CRITICAL(sr);
-        return OS_TIMEOUT;
+        ret = OS_TIMEOUT;
+        goto done;
     }
 
-    os_trace_void(OS_TRACE_ID_MUTEX_PEND);
-
     /* Change priority of owner if needed */
     if (mu->mu_owner->t_prio > current->t_prio) {
         mu->mu_owner->t_prio = current->t_prio;
@@ -198,12 +223,13 @@ os_mutex_pend(struct os_mutex *mu, uint32_t timeout)
 
     /* If we are owner we did not time out. */
     if (mu->mu_owner == current) {
-        rc = OS_OK;
+        ret = OS_OK;
     } else {
-        rc = OS_TIMEOUT;
+        ret = OS_TIMEOUT;
     }
-    os_trace_end_call(OS_TRACE_ID_MUTEX_PEND);
 
-    return rc;
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_MUTEX_PEND, (uint32_t)ret);
+    return ret;
 }
 
diff --git a/kernel/os/src/os_sched.c b/kernel/os/src/os_sched.c
index f7937ec4fc..f1a82bee3c 100644
--- a/kernel/os/src/os_sched.c
+++ b/kernel/os/src/os_sched.c
@@ -83,7 +83,6 @@ os_sched_ctx_sw_hook(struct os_task *next_t)
         assert(top[i] == OS_STACK_PATTERN);
     }
 #endif
-    os_trace_task_start_exec(next_t->t_taskid);
     next_t->t_ctx_sw_cnt++;
     g_current_task->t_run_time += g_os_time - g_os_last_ctx_sw_time;
     g_os_last_ctx_sw_time = g_os_time;
@@ -166,7 +165,7 @@ os_sched_sleep(struct os_task *t, os_time_t nticks)
         }
     }
 
-    os_trace_task_stop_ready(t->t_taskid, OS_TASK_SLEEP);
+    os_trace_task_stop_ready(t, OS_TASK_SLEEP);
     return (0);
 }
 
@@ -236,6 +235,8 @@ os_sched_wakeup(struct os_task *t)
     TAILQ_REMOVE(&g_os_sleep_list, t, t_os_list);
     os_sched_insert(t);
 
+    os_trace_task_start_ready(t);
+
     return (0);
 }
 
@@ -271,7 +272,6 @@ os_sched_os_timer_exp(void)
         }
         next = TAILQ_NEXT(t, t_os_list);
         if (OS_TIME_TICK_GEQ(now, t->t_next_wakeup)) {
-            os_trace_task_start_ready(t->t_taskid);
             os_sched_wakeup(t);
         } else {
             break;
diff --git a/kernel/os/src/os_sem.c b/kernel/os/src/os_sem.c
index a2c4f03750..379c9a101d 100644
--- a/kernel/os/src/os_sem.c
+++ b/kernel/os/src/os_sem.c
@@ -18,6 +18,10 @@
  */
 
 #include <assert.h>
+#include "syscfg/syscfg.h"
+#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_SEM)
+#define OS_TRACE_DISABLE_FILE_API
+#endif
 #include "os/mynewt.h"
 
 /* XXX:
@@ -29,14 +33,23 @@
 os_error_t
 os_sem_init(struct os_sem *sem, uint16_t tokens)
 {
+    os_error_t ret;
+
+    os_trace_api_u32x2(OS_TRACE_ID_SEM_INIT, (uint32_t)sem, (uint32_t)tokens);
+
     if (!sem) {
-        return OS_INVALID_PARM;
+        ret = OS_INVALID_PARM;
+        goto done;
     }
 
     sem->sem_tokens = tokens;
     SLIST_FIRST(&sem->sem_head) = NULL;
 
-    return OS_OK;
+    ret = OS_OK;
+
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_SEM_INIT, (uint32_t)ret);
+    return ret;
 }
 
 os_error_t
@@ -46,15 +59,20 @@ os_sem_release(struct os_sem *sem)
     os_sr_t sr;
     struct os_task *current;
     struct os_task *rdy;
+    os_error_t ret;
+
+    os_trace_api_u32(OS_TRACE_ID_SEM_INIT, (uint32_t)sem);
 
     /* OS must be started to release semaphores */
     if (!g_os_started) {
-        return (OS_NOT_STARTED);
+        ret = OS_NOT_STARTED;
+        goto done;
     }
 
     /* Check for valid semaphore */
     if (!sem) {
-        return OS_INVALID_PARM;
+        ret = OS_INVALID_PARM;
+        goto done;
     }
 
     /* Get current task */
@@ -86,27 +104,35 @@ os_sem_release(struct os_sem *sem)
         os_sched(rdy);
     }
 
-    return OS_OK;
+    ret = OS_OK;
+
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_SEM_INIT, (uint32_t)ret);
+    return ret;
 }
 
 os_error_t
 os_sem_pend(struct os_sem *sem, uint32_t timeout)
 {
     os_sr_t sr;
-    os_error_t rc;
     int sched;
     struct os_task *current;
     struct os_task *entry;
     struct os_task *last;
+    os_error_t ret;
+
+    os_trace_api_u32x2(OS_TRACE_ID_SEM_PEND, (uint32_t)sem, (uint32_t)timeout);
 
     /* Check if OS is started */
     if (!g_os_started) {
-        return (OS_NOT_STARTED);
+        ret = OS_NOT_STARTED;
+        goto done;
     }
 
     /* Check for valid semaphore */
     if (!sem) {
-        return OS_INVALID_PARM;
+        ret = OS_INVALID_PARM;
+        goto done;
     }
 
     /* Assume we dont have to put task to sleep; get current task */
@@ -121,12 +147,12 @@ os_sem_pend(struct os_sem *sem, uint32_t timeout)
      */
     if (sem->sem_tokens != 0) {
         sem->sem_tokens--;
-        rc = OS_OK;
+        ret = OS_OK;
     } else if (timeout == 0) {
-        rc = OS_TIMEOUT;
+        ret = OS_TIMEOUT;
     } else {
         /* Silence gcc maybe-uninitialized warning. */
-        rc = OS_OK;
+        ret = OS_OK;
 
         /* Link current task to tasks waiting for semaphore */
         current->t_obj = sem;
@@ -162,13 +188,13 @@ os_sem_pend(struct os_sem *sem, uint32_t timeout)
             OS_ENTER_CRITICAL(sr);
             current->t_flags &= ~OS_TASK_FLAG_SEM_WAIT;
             OS_EXIT_CRITICAL(sr);
-            rc = OS_TIMEOUT;
+            ret = OS_TIMEOUT;
         } else {
-            rc = OS_OK;
+            ret = OS_OK;
         }
     }
 
-    return rc;
+done:
+    os_trace_api_ret_u32(OS_TRACE_ID_SEM_PEND, (uint32_t)ret);
+    return ret;
 }
-
-
diff --git a/kernel/os/src/os_task.c b/kernel/os/src/os_task.c
index 466870de10..74cfcebdd8 100644
--- a/kernel/os/src/os_task.c
+++ b/kernel/os/src/os_task.c
@@ -111,6 +111,7 @@ os_task_init(struct os_task *t, const char *name, os_task_func_t func,
         goto err;
     }
 
+    os_trace_task_create(t);
     os_trace_task_info(t);
 
     return (0);
diff --git a/kernel/os/syscfg.yml b/kernel/os/syscfg.yml
index 531b2153b3..cf599559e2 100644
--- a/kernel/os/syscfg.yml
+++ b/kernel/os/syscfg.yml
@@ -79,3 +79,28 @@ syscfg.defs:
     FLOAT_USER:
         descriptiong: 'Enable float support for users'
         value: 0
+
+    OS_SYSVIEW_TRACE_CALLOUT:
+        description: >
+            Enable tracing os_callout APIs by SystemView
+        value: 1
+    OS_SYSVIEW_TRACE_EVENTQ:
+        description: >
+            Enable tracing os_eventq APIs by SystemView
+        value: 1
+    OS_SYSVIEW_TRACE_MBUF:
+        description: >
+            Enable tracing os_mbuf APIs by SystemView
+        value: 0
+    OS_SYSVIEW_TRACE_MEMPOOL:
+        description: >
+            Enable tracing os_mempool APIs by SystemView
+        value: 0
+    OS_SYSVIEW_TRACE_MUTEX:
+        description: >
+            Enable tracing os_mutex APIs by SystemView
+        value: 1
+    OS_SYSVIEW_TRACE_SEM:
+        description: >
+            Enable tracing os_sem APIs by SystemView
+        value: 1
diff --git a/sys/sysview/SYSVIEW_Apache Mynewt.txt b/sys/sysview/SYSVIEW_Apache Mynewt.txt
new file mode 100644
index 0000000000..cf191fe930
--- /dev/null
+++ b/sys/sysview/SYSVIEW_Apache Mynewt.txt	
@@ -0,0 +1,30 @@
+40	os_eventq_put			evq=%p ev=%p
+41	os_eventq_get_no_wait		evq=%p | returns ev=%p
+42	os_eventq_get			evq=%p | returns ev=%p
+43	os_eventq_remove		evq=%p | returns ev=%p
+44	os_eventq_poll_0timo		evq[0]=%p nevqs=%d timo=%u | returns ev=%p
+45	os_eventq_poll			evq[0]=%p nevqs=%d | returns ev=%p
+
+50	os_mutex_init			mu=%p | returns %d
+51	os_mutex_release		mu=%p | returns %d
+52	os_mutex_pend			mu=%p timeout=%u | returns %d
+
+60	os_sem_init			sem=%p tokens=%u | returns %d
+61	os_sem_release			sem=%p | returns %d
+62	os_sem_pend			sem=%p timeout=%u | returns %d
+
+70	os_callout_init			c/ev=%p evq=%p
+71	os_callout_stop			c=%p
+72	os_callout_reset		c=%p ticks=%d | returns %d
+73	os_callout_tick
+
+80	os_memblock_get			mp=%p | returns %p
+81	os_memblock_put_from_cb		mp=%p block_addr=%p | returns %d
+82	os_memblock_put			mp=%p block_addr=%p | returns %d
+
+90	os_mbuf_get			omp=%p leadingspace=%u | returns %p
+91	os_mbuf_get_pkthdr		omp=%p user_pkthdr_len=%u | returns %p
+92	os_mbuf_free			om=%p | returns %d
+93	os_mbuf_free_chain		om=%p | returns %d
+
+Option ReversePriority
diff --git a/sys/sysview/SYSVIEW_Mynewt.txt b/sys/sysview/SYSVIEW_Mynewt.txt
deleted file mode 100644
index 7baad5a445..0000000000
--- a/sys/sysview/SYSVIEW_Mynewt.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-33	EVQ_PUT
-34	EVQ_GET
-35	MUTEX_INIT
-36	MUTEX_RELEASE
-37	MUTEX_PEND
diff --git a/sys/sysview/include/sysview/SEGGER_SYSVIEW_Mynewt.h b/sys/sysview/include/sysview/SEGGER_SYSVIEW_Mynewt.h
deleted file mode 100644
index 366143a8c4..0000000000
--- a/sys/sysview/include/sysview/SEGGER_SYSVIEW_Mynewt.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 SYSVIEW_MYNEWT_H
-#define SYSVIEW_MYNEWT_H
-
-#include "sysview/vendor/SEGGER_SYSVIEW.h"
-
-// Services provided to SYSVIEW by Mynewt
-extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI;
-
-#endif
diff --git a/sys/sysview/src/SEGGER_SYSVIEW_Config_Mynewt.c b/sys/sysview/src/SEGGER_SYSVIEW_Config_Mynewt.c
deleted file mode 100644
index 739e95b234..0000000000
--- a/sys/sysview/src/SEGGER_SYSVIEW_Config_Mynewt.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 <stdint.h>
-#include "sysview/vendor/SEGGER_SYSVIEW.h"
-#include "sysview/SEGGER_SYSVIEW_Mynewt.h"
-
-//
-// SystemcoreClock can be used in most CMSIS compatible projects.
-// In non-CMSIS projects define SYSVIEW_CPU_FREQ.
-//
-extern unsigned int SystemCoreClock;
-
-#define SEGGER_SYSVIEW_RTT_CHANNEL        1
-
-/*********************************************************************
-*
-*       Defines, configurable
-*
-**********************************************************************
-*/
-// The application name to be displayed in SystemViewer
-#ifndef   SYSVIEW_APP_NAME
-  #define SYSVIEW_APP_NAME        "Demo Application"
-#endif
-
-// The target device name
-#ifndef   SYSVIEW_DEVICE_NAME
-  #define SYSVIEW_DEVICE_NAME     "Cortex-M4"
-#endif
-
-// Frequency of the timestamp. Must match SEGGER_SYSVIEW_Conf.h
-#ifndef   SYSVIEW_TIMESTAMP_FREQ
-  #define SYSVIEW_TIMESTAMP_FREQ  (SystemCoreClock)
-#endif
-
-// System Frequency. SystemcoreClock is used in most CMSIS compatible projects.
-#ifndef   SYSVIEW_CPU_FREQ
-  #define SYSVIEW_CPU_FREQ        (SystemCoreClock)
-#endif
-
-// The lowest RAM address used for IDs (pointers)
-#ifndef   SYSVIEW_RAM_BASE
-  #define SYSVIEW_RAM_BASE        (0x20000000)
-#endif
-
-#ifndef   SYSVIEW_SYSDESC0
-  #define SYSVIEW_SYSDESC0        "I#18=UART,I#19=SPI0,I#20=SPI1,I#22=GPIO,I#24=TIMER0,I#29=RNG,I#32=WATCHDOG,I#33=OS_TICK"
-#endif
-
-// Define as 1 if the Cortex-M cycle counter is used as SystemView timestamp. Must match SEGGER_SYSVIEW_Conf.h
-#ifndef   USE_CYCCNT_TIMESTAMP
-  #define USE_CYCCNT_TIMESTAMP    1
-#endif
-
-//#ifndef   SYSVIEW_SYSDESC1
-//  #define SYSVIEW_SYSDESC1      ""
-//#endif
-
-//#ifndef   SYSVIEW_SYSDESC2
-//  #define SYSVIEW_SYSDESC2      ""
-//#endif
-
-/*********************************************************************
-*
-*       Defines, fixed
-*
-**********************************************************************
-*/
-#define DWT_CTRL                  (*(volatile uint32_t*) (0xE0001000uL))  // DWT Control Register
-#define NOCYCCNT_BIT              (1uL << 25)                           // Cycle counter support bit
-#define CYCCNTENA_BIT             (1uL << 0)                            // Cycle counter enable bit
-
-/*********************************************************************
-*
-*       _cbSendSystemDesc()
-*
-*  Function description
-*    Sends SystemView description strings.
-*/
-static void _cbSendSystemDesc(void) {
-  SEGGER_SYSVIEW_SendSysDesc("N="SYSVIEW_APP_NAME",O=Mynewt,D="SYSVIEW_DEVICE_NAME);
-#ifdef SYSVIEW_SYSDESC0
-  SEGGER_SYSVIEW_SendSysDesc(SYSVIEW_SYSDESC0);
-#endif
-#ifdef SYSVIEW_SYSDESC1
-  SEGGER_SYSVIEW_SendSysDesc(SYSVIEW_SYSDESC1);
-#endif
-#ifdef SYSVIEW_SYSDESC2
-  SEGGER_SYSVIEW_SendSysDesc(SYSVIEW_SYSDESC2);
-#endif
-}
-
-/*********************************************************************
-*
-*       Global functions
-*
-**********************************************************************
-*/
-void SEGGER_SYSVIEW_Conf(void) {
-#if USE_CYCCNT_TIMESTAMP
-  //
-  //  The cycle counter must be activated in order
-  //  to use time related functions.
-  //
-  if ((DWT_CTRL & NOCYCCNT_BIT) == 0) {       // Cycle counter supported?
-    if ((DWT_CTRL & CYCCNTENA_BIT) == 0) {    // Cycle counter not enabled?
-      DWT_CTRL |= CYCCNTENA_BIT;              // Enable Cycle counter
-    }
-  }
-#endif
-  SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ,
-                      &SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc);
-  SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);
-}
-
-/*************************** End of file ****************************/
diff --git a/sys/sysview/src/SEGGER_SYSVIEW_Mynewt.c b/sys/sysview/src/SEGGER_SYSVIEW_Mynewt.c
deleted file mode 100644
index 08e73a9888..0000000000
--- a/sys/sysview/src/SEGGER_SYSVIEW_Mynewt.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 <ctype.h>
-#include <stdint.h>
-
-#include "os/mynewt.h"
-
-#include "sysview/vendor/SEGGER_SYSVIEW.h"
-#include "sysview/vendor/Global.h"
-#include "sysview/SEGGER_SYSVIEW_Mynewt.h"
-
-void os_trace_enter_isr(void)
-{
-    SEGGER_SYSVIEW_RecordEnterISR();
-}
-
-void os_trace_exit_isr(void)
-{
-    SEGGER_SYSVIEW_RecordExitISR();
-}
-
-void os_trace_exit_isr_to_scheduler(void)
-{
-    SEGGER_SYSVIEW_RecordExitISRToScheduler();
-}
-
-void os_trace_task_info(const struct os_task *t)
-{
-    SEGGER_SYSVIEW_TASKINFO Info;
-    Info.TaskID = t->t_taskid;
-    Info.sName = t->t_name;
-    Info.Prio = t->t_prio;
-    Info.StackBase = (uint32_t)t->t_stackptr;
-    Info.StackSize = t->t_stacksize;
-    SEGGER_SYSVIEW_SendTaskInfo(&Info);
-}
-
-void os_trace_task_create(uint32_t task_id)
-{
-    SEGGER_SYSVIEW_OnTaskCreate(task_id);
-}
-
-void os_trace_task_start_exec(uint32_t task_id)
-{
-    SEGGER_SYSVIEW_OnTaskStartExec(task_id);
-}
-
-void os_trace_task_stop_exec(void)
-{
-    SEGGER_SYSVIEW_OnTaskStopExec();
-}
-
-void os_trace_task_start_ready(uint32_t task_id)
-{
-    SEGGER_SYSVIEW_OnTaskStartReady(task_id);
-}
-
-void os_trace_task_stop_ready(uint32_t task_id, unsigned reason)
-{
-    SEGGER_SYSVIEW_OnTaskStopReady(task_id, reason);
-}
-
-void os_trace_idle(void)
-{
-    SEGGER_SYSVIEW_OnIdle();
-}
-
-void os_trace_void(unsigned id)
-{
-    SEGGER_SYSVIEW_RecordVoid(id);
-}
-
-void os_trace_u32(unsigned id, uint32_t para0)
-{
-    SEGGER_SYSVIEW_RecordU32(id, para0);
-}
-
-void os_trace_u32x2(unsigned id, uint32_t para0, uint32_t para1)
-{
-    SEGGER_SYSVIEW_RecordU32x2(id, para0, para1);
-}
-
-void os_trace_u32x3(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2)
-{
-    SEGGER_SYSVIEW_RecordU32x3(id, para0, para1, para2);
-}
-
-void os_trace_u32x4(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2,
-        uint32_t para3)
-{
-    SEGGER_SYSVIEW_RecordU32x4(id, para0, para1, para2, para3);
-}
-
-void os_trace_u32x5(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2,
-        uint32_t para3, uint32_t para4)
-{
-    SEGGER_SYSVIEW_RecordU32x5(id, para0, para1, para2, para3, para4);
-}
-
-void os_trace_enter_timer(uint32_t timer_id)
-{
-    SEGGER_SYSVIEW_RecordEnterTimer(timer_id);
-}
-
-void os_trace_exit_timer(void)
-{
-    SEGGER_SYSVIEW_RecordExitTimer();
-}
-
-void os_trace_end_call(unsigned id)
-{
-    SEGGER_SYSVIEW_RecordEndCall(id);
-}
-
-void os_trace_end_call_return_value(unsigned id, uint32_t return_value)
-{
-    SEGGER_SYSVIEW_RecordEndCallU32(id, return_value);
-}
-
-static void send_task_list_cb(void) {
-    struct os_task *prev_task;
-    struct os_task_info oti;
-    SEGGER_SYSVIEW_TASKINFO Info;
-
-    prev_task = NULL;
-    while (1) {
-        prev_task = os_task_info_get_next(prev_task, &oti);
-        if (prev_task == NULL) {
-            break;
-        }
-        Info.TaskID = oti.oti_taskid;
-        Info.sName = oti.oti_name;
-        Info.StackSize = oti.oti_stksize;
-        Info.Prio = oti.oti_prio;
-        SEGGER_SYSVIEW_SendTaskInfo(&Info);
-    }
-}
-
-static U64 get_time_cb(void) {
-    return (U64)os_time_get();
-}
-
-const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {
-    get_time_cb,
-    send_task_list_cb,
-};
-
-/*
- * Package initialization function
- */
-void
-sysview_init(void)
-{
-    SEGGER_SYSVIEW_Conf();
-    SEGGER_SYSVIEW_Start();
-}
diff --git a/sys/sysview/src/sysview_mynewt.c b/sys/sysview/src/sysview_mynewt.c
new file mode 100644
index 0000000000..0e2d9930a8
--- /dev/null
+++ b/sys/sysview/src/sysview_mynewt.c
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 "os/mynewt.h"
+#include "mcu/mcu.h"
+#include "bsp/bsp.h"
+#include "hal/hal_timer.h"
+#include "sysview/vendor/SEGGER_SYSVIEW.h"
+#include "sysview/vendor/SEGGER_SYSVIEW_Conf.h"
+
+#define STRX(x)         #x
+#define STR(x)          STRX(x)
+
+#if MYNEWT_VAL(SYSVIEW_TIMESTAMP_USE_TIMER)
+
+#define SYSVIEW_TIMESTAMP_FREQ          (MYNEWT_VAL(SYSVIEW_TIMESTAMP_TIMER_FREQ))
+
+U32
+SEGGER_SYSVIEW_X_GetTimestamp(void)
+{
+    return hal_timer_read(MYNEWT_VAL(SYSVIEW_TIMESTAMP_TIMER_NUM));
+}
+
+#elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3
+
+#define SYSVIEW_TIMESTAMP_FREQ          (SystemCoreClock)
+
+#else
+
+#define SYSVIEW_TIMESTAMP_FREQ          (OS_TICKS_PER_SEC)
+
+U32
+SEGGER_SYSVIEW_X_GetTimestamp(void)
+{
+    /* XXX Just need to return some kind of timestamp... */
+    return os_time_get();
+}
+
+#endif
+
+#define SYSVIEW_CPU_FREQ                (SystemCoreClock)
+#define SYSVIEW_RAM_BASE                ((uint32_t)&_ram_start)
+
+static U64
+sysview_os_api_get_time_func(void)
+{
+    return (U64)os_get_uptime_usec();
+}
+
+static void
+sysview_os_api_send_task_list_func(void)
+{
+    struct os_task *t;
+
+    STAILQ_FOREACH(t, &g_os_task_list, t_os_task_list) {
+        os_trace_task_info(t);
+    }
+}
+
+static const SEGGER_SYSVIEW_OS_API sysview_os_api = {
+    sysview_os_api_get_time_func,
+    sysview_os_api_send_task_list_func,
+};
+
+static void
+sysview_os_api_send_interrupts_desc(void)
+{
+#ifdef MCU_SYSVIEW_INTERRUPTS
+    static U8 pkt[32];
+    U8 *payload;
+    const char *s;
+    const char *ptr;
+
+    /*
+     * Interrupts description can be very long thus we cannot send it as single
+     * system description string due to length limit. Instead, we'll tokenize it
+     * into separate interrupt descriptions and send one by one manually.
+     */
+
+    s = MCU_SYSVIEW_INTERRUPTS;
+
+    do {
+        ptr = s;
+
+        while (*ptr &&  *ptr != ',') {
+            ptr++;
+        }
+
+        /* Leave 4 bytes for header */
+        payload = &pkt[4];
+        payload = SEGGER_SYSVIEW_EncodeString(payload, s,
+                          min(sizeof(pkt) - SEGGER_SYSVIEW_INFO_SIZE, ptr - s));
+        SEGGER_SYSVIEW_SendPacket(pkt, payload, SYSVIEW_EVTID_SYSDESC);
+
+        if (*ptr) {
+            s = ptr + 1;
+        }
+    } while (*ptr);
+#endif
+}
+
+static void
+sysview_os_api_send_sys_desc_func(void)
+{
+    SEGGER_SYSVIEW_SendSysDesc("O=Apache Mynewt,"
+                               "N=" STR(APP_NAME) ","
+                               "D=" STR(BSP_NAME) ","
+                               "C=" STR(ARCH_NAME));
+
+    sysview_os_api_send_interrupts_desc();
+}
+
+void
+sysview_init(void)
+{
+#if MYNEWT_VAL(SYSVIEW_TIMESTAMP_USE_TIMER)
+    hal_timer_config(MYNEWT_VAL(SYSVIEW_TIMESTAMP_TIMER_NUM),
+                     MYNEWT_VAL(SYSVIEW_TIMESTAMP_TIMER_FREQ));
+#elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3
+    /* Enable Cycle Counter on Cortex-M3/M4 to get accurate timestamps */
+    DWT->CTRL |= (1 << DWT_CTRL_CYCCNTENA_Pos);
+#endif
+
+    SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ,
+                        &sysview_os_api, sysview_os_api_send_sys_desc_func);
+    SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);
+    SEGGER_SYSVIEW_Start();
+}
diff --git a/sys/sysview/vendor/syscfg.yml b/sys/sysview/syscfg.yml
similarity index 66%
rename from sys/sysview/vendor/syscfg.yml
rename to sys/sysview/syscfg.yml
index 7f50fdff58..f7412a2882 100644
--- a/sys/sysview/vendor/syscfg.yml
+++ b/sys/sysview/syscfg.yml
@@ -22,3 +22,17 @@ syscfg.defs:
     SYSVIEW_BUFFER_SIZE:
         description: Size of the RTT buffer that sysview uses
         value: 1024
+    SYSVIEW_TIMESTAMP_USE_TIMER:
+        description: >
+            Use hal_timer for timestamp.
+            It is recommended to leave this disabled unless using MCU without
+            built-in cycle counter (e.g. Cortex-M0).
+        value: 0
+    SYSVIEW_TIMESTAMP_TIMER_NUM:
+        description: >
+            Timestamp timer number.
+        value: 0
+    SYSVIEW_TIMESTAMP_TIMER_FREQ:
+        description: >
+            Timestamp timer frequency.
+        value: 1000000


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services