11#ifndef TRC_HARDWARE_PORT_H
12#define TRC_HARDWARE_PORT_H
14#include <trcDefines.h>
21#define TRACE_ALLOC_CRITICAL_SECTION_NAME xTraceCriticalSectionStatus
23#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_NOT_SET)
24 #error "TRC_CFG_HARDWARE_PORT not selected - see trcConfig.h"
96#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_NOT_SET)
97 #error "TRC_CFG_HARDWARE_PORT not selected - see trcConfig.h"
100#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Win32)
102void vTraceTimerReset(
void);
103uint32_t uiTraceTimerGetFrequency(
void);
104uint32_t uiTraceTimerGetValue(
void);
106#define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
107#define TRC_HWTC_COUNT ((TraceUnsignedBaseType_t)uiTraceTimerGetValue())
108#define TRC_HWTC_PERIOD 0
109#define TRC_HWTC_DIVISOR 1
110#define TRC_HWTC_FREQ_HZ ((TraceUnsignedBaseType_t)uiTraceTimerGetFrequency())
112#define TRC_IRQ_PRIORITY_ORDER 1
114#define TRC_PORT_SPECIFIC_INIT() vTraceTimerReset()
116#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Win64)
118void vTraceTimerReset(
void);
119uint32_t uiTraceTimerGetFrequency(
void);
120uint32_t uiTraceTimerGetValue(
void);
122#define TRC_BASE_TYPE int64_t
124#define TRC_UNSIGNED_BASE_TYPE uint64_t
126#define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
127#define TRC_HWTC_COUNT ((TraceUnsignedBaseType_t)uiTraceTimerGetValue())
128#define TRC_HWTC_PERIOD 0
129#define TRC_HWTC_DIVISOR 1
130#define TRC_HWTC_FREQ_HZ ((TraceUnsignedBaseType_t)uiTraceTimerGetFrequency())
132#define TRC_IRQ_PRIORITY_ORDER 1
134#define TRC_PORT_SPECIFIC_INIT() vTraceTimerReset()
136#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_HWIndependent)
138 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
139 #define TRC_HWTC_COUNT 0
140 #define TRC_HWTC_PERIOD 1
141 #define TRC_HWTC_DIVISOR 1
142 #define TRC_HWTC_FREQ_HZ TRC_TICK_RATE_HZ
145 #define TRC_IRQ_PRIORITY_ORDER NOT_SET
148#error TRC_HARDWARE_PORT_HWIndependent is deprecated
150#elif ((TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_Cortex_M) || (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_Cortex_M_NRF_SD))
153 #error "Can't find the CMSIS API. Please include your processor's header file in trcConfig.h"
156#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_Cortex_M)
157 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
158 #define TRACE_ENTER_CRITICAL_SECTION() {TRACE_ALLOC_CRITICAL_SECTION_NAME = __get_PRIMASK(); __set_PRIMASK(1);}
159 #define TRACE_EXIT_CRITICAL_SECTION() {__set_PRIMASK(TRACE_ALLOC_CRITICAL_SECTION_NAME);}
161 #include "nrf_nvic.h"
162 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
163 #define TRACE_ENTER_CRITICAL_SECTION() {(void) sd_nvic_critical_region_enter((uint8_t*)&TRACE_ALLOC_CRITICAL_SECTION_NAME);}
164 #define TRACE_EXIT_CRITICAL_SECTION() {(void) sd_nvic_critical_region_exit((uint8_t)TRACE_ALLOC_CRITICAL_SECTION_NAME);}
177 #if ((__CORTEX_M >= 0x03) && (! defined TRC_CFG_ARM_CM_USE_SYSTICK))
179 void xTraceHardwarePortInitCortexM(
void);
181 #define TRC_REG_DEMCR (*(volatile uint32_t*)0xE000EDFC)
182 #define TRC_REG_DWT_CTRL (*(volatile uint32_t*)0xE0001000)
183 #define TRC_REG_DWT_CYCCNT (*(volatile uint32_t*)0xE0001004)
184 #define TRC_REG_DWT_EXCCNT (*(volatile uint32_t*)0xE000100C)
186 #define TRC_REG_ITM_LOCKACCESS (*(volatile uint32_t*)0xE0001FB0)
187 #define TRC_ITM_LOCKACCESS_UNLOCK (0xC5ACCE55)
190 #define TRC_DEMCR_TRCENA (1 << 24)
193 #define TRC_DWT_CTRL_NOPRFCNT (1 << 24)
196 #define TRC_DWT_CTRL_NOCYCCNT (1 << 25)
199 #define TRC_DWT_CTRL_EXCEVTENA (1 << 18)
202 #define TRC_DWT_CTRL_CYCCNTENA (1)
204 #define TRC_PORT_SPECIFIC_INIT() xTraceHardwarePortInitCortexM()
206 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
207 #define TRC_HWTC_COUNT TRC_REG_DWT_CYCCNT
208 #define TRC_HWTC_PERIOD 0
209 #define TRC_HWTC_DIVISOR 4
210 #define TRC_HWTC_FREQ_HZ TRACE_CPU_CLOCK_HZ
211 #define TRC_IRQ_PRIORITY_ORDER 0
215 #if defined(_CMSIS_RP2040_H_) || defined(RP2040_H)
216 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
217 #define TRC_HWTC_COUNT (*((volatile uint32_t*)0x4005400c))
218 #define TRC_HWTC_PERIOD 0
219 #define TRC_HWTC_DIVISOR 1
220 #define TRC_HWTC_FREQ_HZ 1000000
221 #define TRC_IRQ_PRIORITY_ORDER 0
223 #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR
224 #define TRC_HWTC_COUNT (*((volatile uint32_t*)0xE000E018))
225 #define TRC_HWTC_PERIOD ((*((volatile uint32_t*)0xE000E014)) + 1)
226 #define TRC_HWTC_DIVISOR 4
227 #define TRC_HWTC_FREQ_HZ TRACE_CPU_CLOCK_HZ
228 #define TRC_IRQ_PRIORITY_ORDER 0
233#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Renesas_RX600)
234 #define TRACE_ALLOC_CRITICAL_SECTION() TraceBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
235 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = TRC_KERNEL_PORT_SET_INTERRUPT_MASK(); }
236 #define TRACE_EXIT_CRITICAL_SECTION() { TRC_KERNEL_PORT_CLEAR_INTERRUPT_MASK(TRACE_ALLOC_CRITICAL_SECTION_NAME); }
238 #include <iodefine.h>
240 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
241 #define TRC_HWTC_COUNT (CMT0.CMCNT)
243 #define TRC_HWTC_PERIOD (CMT0.CMCOR + 1)
244 #define TRC_HWTC_DIVISOR 1
245 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
246 #define TRC_IRQ_PRIORITY_ORDER 1
248#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_MICROCHIP_PIC32)
250 #define TRACE_ALLOC_CRITICAL_SECTION() TraceBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
251 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = TRC_KERNEL_PORT_SET_INTERRUPT_MASK(); }
252 #define TRACE_EXIT_CRITICAL_SECTION() { TRC_KERNEL_PORT_CLEAR_INTERRUPT_MASK(TRACE_ALLOC_CRITICAL_SECTION_NAME); }
254 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
255 #define TRC_HWTC_COUNT (TMR1)
256 #define TRC_HWTC_PERIOD (PR1 + 1)
257 #define TRC_HWTC_DIVISOR 1
258 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
259 #define TRC_IRQ_PRIORITY_ORDER 1
261#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_TEXAS_INSTRUMENTS_TMS570_RM48)
263 #define TRC_RTIFRC0 *((uint32_t *)0xFFFFFC10)
264 #define TRC_RTICOMP0 *((uint32_t *)0xFFFFFC50)
265 #define TRC_RTIUDCP0 *((uint32_t *)0xFFFFFC54)
267 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
268 #define TRC_HWTC_COUNT (TRC_RTIFRC0 - (TRC_RTICOMP0 - TRC_RTIUDCP0))
269 #define TRC_HWTC_PERIOD (TRC_RTIUDCP0)
270 #define TRC_HWTC_DIVISOR 1
271 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
272 #define TRC_IRQ_PRIORITY_ORDER 0
274#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Atmel_AT91SAM7)
278 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
279 #define TRC_HWTC_COUNT ((uint32_t)(AT91C_BASE_PITC->PITC_PIIR & 0xFFFFF))
280 #define TRC_HWTC_PERIOD ((uint32_t)(AT91C_BASE_PITC->PITC_PIMR + 1))
281 #define TRC_HWTC_DIVISOR 1
282 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
283 #define TRC_IRQ_PRIORITY_ORDER 1
285#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Atmel_UC3A0)
291 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
292 #define TRC_HWTC_COUNT ((uint32_t)sysreg_read(AVR32_COUNT))
293 #define TRC_HWTC_PERIOD ((uint32_t)(sysreg_read(AVR32_COMPARE) + 1))
294 #define TRC_HWTC_DIVISOR 1
295 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
296 #define TRC_IRQ_PRIORITY_ORDER 1
298#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_NXP_LPC210X)
304 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
305 #define TRC_HWTC_COUNT *((uint32_t *)0xE0004008 )
306 #define TRC_HWTC_PERIOD *((uint32_t *)0xE0004018 )
307 #define TRC_HWTC_DIVISOR 1
308 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
309 #define TRC_IRQ_PRIORITY_ORDER 0
311#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_TEXAS_INSTRUMENTS_MSP430)
315 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
316 #define TRC_HWTC_COUNT (TA0R)
317 #define TRC_HWTC_PERIOD (((uint16_t)TACCR0)+1)
318 #define TRC_HWTC_DIVISOR 1
319 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
320 #define TRC_IRQ_PRIORITY_ORDER 1
322#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_PPC405)
326 #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR
327 #define TRC_HWTC_COUNT mfspr(0x3db)
328 #define TRC_HWTC_PERIOD (TRACE_CPU_CLOCK_HZ / TRC_TICK_RATE_HZ)
329 #define TRC_HWTC_DIVISOR 1
330 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
331 #define TRC_IRQ_PRIORITY_ORDER 0
333#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_PPC440)
339 #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR
340 #define TRC_HWTC_COUNT mfspr(0x016)
341 #define TRC_HWTC_PERIOD (TRACE_CPU_CLOCK_HZ / TRC_TICK_RATE_HZ)
342 #define TRC_HWTC_DIVISOR 1
343 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
344 #define TRC_IRQ_PRIORITY_ORDER 0
346#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_MICROBLAZE)
354 #include <xtmrctr_l.h>
356 #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR
357 #define TRC_HWTC_COUNT XTmrCtr_GetTimerCounterReg( XPAR_TMRCTR_0_BASEADDR, 0 )
358 #define TRC_HWTC_PERIOD (XTmrCtr_GetLoadReg( XPAR_TMRCTR_0_BASEADDR, 0) + 1)
359 #define TRC_HWTC_DIVISOR 16
360 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
361 #define TRC_IRQ_PRIORITY_ORDER 0
363#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_ZyncUltraScaleR5)
365 extern uint32_t cortex_a9_r5_enter_critical(
void);
366 extern void cortex_a9_r5_exit_critical(uint32_t irq_already_masked_at_enter);
368 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
370 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = (TraceUnsignedBaseType_t)cortex_a9_r5_enter_critical(); }
372 #define TRACE_EXIT_CRITICAL_SECTION() { cortex_a9_r5_exit_critical((uint32_t)TRACE_ALLOC_CRITICAL_SECTION_NAME); }
374 #include <xttcps_hw.h>
376 #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR
377 #define TRC_HWTC_COUNT (*(volatile uint32_t *)(configTIMER_BASEADDR + XTTCPS_COUNT_VALUE_OFFSET))
378 #define TRC_HWTC_PERIOD (*(volatile uint32_t *)(configTIMER_BASEADDR + XTTCPS_INTERVAL_VAL_OFFSET))
379 #define TRC_HWTC_DIVISOR 16
380 #define TRC_HWTC_FREQ_HZ (TRC_HWTC_PERIOD * TRC_TICK_RATE_HZ)
381 #define TRC_IRQ_PRIORITY_ORDER 0
383 #if defined(__GNUC__) || defined(__ICCARM__)
385 static inline uint32_t prvGetCPSR(
void)
389 asm volatile (
" mrs %0, cpsr" :
"=r" (ret) : );
393 #error "Only GCC and IAR supported!"
396#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Altera_NiosII)
401 #include <altera_avalon_timer_regs.h>
402 #include <sys/alt_irq.h>
404 #define TRACE_ALLOC_CRITICAL_SECTION() alt_irq_context TRACE_ALLOC_CRITICAL_SECTION_NAME;
405 #define TRACE_ENTER_CRITICAL_SECTION(){TRACE_ALLOC_CRITICAL_SECTION_NAME = alt_irq_disable_all();}
406 #define TRACE_EXIT_CRITICAL_SECTION() {alt_irq_enable_all(TRACE_ALLOC_CRITICAL_SECTION_NAME);}
414 #define SYSTEM_TIMER_BASE NOT_SET
416 #if (SYSTEM_TIMER == NOT_SET)
417 #error "Set SYSTEM_TIMER_BASE to the timer base used for system ticks."
420 static inline uint32_t altera_nios2_GetTimerSnapReg(
void)
425 IOWR_ALTERA_AVALON_TIMER_SNAPL(SYSTEM_TIMER_BASE, 0);
426 return (IORD_ALTERA_AVALON_TIMER_SNAPH(SYSTEM_TIMER_BASE) << 16) | IORD_ALTERA_AVALON_TIMER_SNAPL(SYSTEM_TIMER_BASE);
429 #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR
430 #define TRC_HWTC_COUNT altera_nios2_GetTimerSnapReg()
431 #define TRC_HWTC_PERIOD (configCPU_CLOCK_HZ / configTICK_RATE_HZ )
432 #define TRC_HWTC_DIVISOR 16
433 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
434 #define TRC_IRQ_PRIORITY_ORDER 0
436#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_CORTEX_A9)
455 extern uint32_t cortex_a9_r5_enter_critical(
void);
456 extern void cortex_a9_r5_exit_critical(uint32_t irq_already_masked_at_enter);
458 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
459 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = (TraceUnsignedBaseType_t)cortex_a9_r5_enter_critical(); }
460 #define TRACE_EXIT_CRITICAL_SECTION() { cortex_a9_r5_exit_critical((uint32_t)TRACE_ALLOC_CRITICAL_SECTION_NAME); }
463 #define TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS 0
465 #if (TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS == 0)
466 #error "Please specify TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS."
469 #define TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET 0x0600
470 #define TRC_CA9_MPCORE_PRIVCTR_PERIOD_REG (*(volatile uint32_t*)(TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x00))
471 #define TRC_CA9_MPCORE_PRIVCTR_COUNTER_REG (*(volatile uint32_t*)(TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x04))
472 #define TRC_CA9_MPCORE_PRIVCTR_CONTROL_REG (*(volatile uint32_t*)(TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x08))
474 #define TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_MASK 0x0000FF00
475 #define TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_SHIFT 8
476 #define TRC_CA9_MPCORE_PRIVCTR_PRESCALER (((TRC_CA9_MPCORE_PRIVCTR_CONTROL_REG & TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_MASK) >> TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_SHIFT) + 1)
478 #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR
479 #define TRC_HWTC_COUNT TRC_CA9_MPCORE_PRIVCTR_COUNTER_REG
480 #define TRC_HWTC_PERIOD (TRC_CA9_MPCORE_PRIVCTR_PERIOD_REG + 1)
488 #define TRC_HWTC_DIVISOR 1
490 #define TRC_HWTC_FREQ_HZ (TRC_TICK_RATE_HZ * TRC_HWTC_PERIOD)
491 #define TRC_IRQ_PRIORITY_ORDER 0
493 #if defined(__GNUC__) || defined(__ICCARM__)
495 static inline uint32_t prvGetCPSR(
void)
499 asm volatile (
" mrs %0, cpsr" :
"=r" (ret) : );
503 #error "Only GCC and IAR supported!"
506#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_CYCLONE_V_HPS)
507 #include "alt_clock_manager.h"
510 extern uint32_t cortex_a9_r5_enter_critical(
void);
511 extern void cortex_a9_r5_exit_critical(uint32_t irq_already_masked_at_enter);
513 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
514 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = (TraceUnsignedBaseType_t)cortex_a9_r5_enter_critical(); }
515 #define TRACE_EXIT_CRITICAL_SECTION() { cortex_a9_r5_exit_critical((uint32_t)TRACE_ALLOC_CRITICAL_SECTION_NAME); }
517 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
518 #define TRC_HWTC_COUNT *((uint32_t *)0xFFFEC200)
519 #define TRC_HWTC_PERIOD 0
520 #define TRC_HWTC_DIVISOR 1
521 #define TRC_HWTC_FREQ_HZ (({ \
523 alt_clk_freq_get( ALT_CLK_MPU_PERIPH, &__freq ); \
526 #define TRC_IRQ_PRIORITY_ORDER 0
528 #if defined(__GNUC__) || defined(__ICCARM__)
530 static inline uint32_t prvGetCPSR(
void)
534 __asm__ __volatile__(
" mrs %0, cpsr" :
"=r" (ret) : );
538 #error "Only GCC and IAR supported!"
541#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ZEPHYR)
543 #define TRC_BASE_TYPE int64_t
544 #define TRC_UNSIGNED_BASE_TYPE uint64_t
546 #define TRC_BASE_TYPE int32_t
547 #define TRC_UNSIGNED_BASE_TYPE uint32_t
550 #define TRACE_ALLOC_CRITICAL_SECTION() TraceBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
551 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = irq_lock(); }
552 #define TRACE_EXIT_CRITICAL_SECTION() { irq_unlock(TRACE_ALLOC_CRITICAL_SECTION_NAME); }
554 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
555 #define TRC_HWTC_COUNT k_cycle_get_32()
556 #define TRC_HWTC_PERIOD (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC / CONFIG_SYS_CLOCK_TICKS_PER_SEC)
557 #define TRC_HWTC_DIVISOR 4
558 #define TRC_HWTC_FREQ_HZ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC
559 #define TRC_IRQ_PRIORITY_ORDER 0
561 #define TRC_PORT_SPECIFIC_INIT()
563#elif ((TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XTensa_LX6) || (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XTensa_LX7))
568 #if CONFIG_FREERTOS_UNICORE == 1
570 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
571 #define TRACE_ENTER_CRITICAL_SECTION() {TRACE_ALLOC_CRITICAL_SECTION_NAME = __extension__({ unsigned __tmp; \
572 __asm__ __volatile__("rsil %0, 15\n" \
573 : "=a" (__tmp) : : "memory" ); \
575 #define TRACE_EXIT_CRITICAL_SECTION() {portCLEAR_INTERRUPT_MASK_FROM_ISR(TRACE_ALLOC_CRITICAL_SECTION_NAME);}
577 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
578 #define TRC_HWTC_COUNT ({ unsigned int __ccount; \
579 __asm__ __volatile__("rsr.ccount %0" : "=a"(__ccount)); \
581#ifdef CONFIG_IDF_TARGET_ESP32
582 #define TRC_HWTC_FREQ_HZ (CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ * 1000000)
583#elif defined(CONFIG_IDF_TARGET_ESP32S2)
584 #define TRC_HWTC_FREQ_HZ (CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ * 1000000)
586 #error "Invalid IDF target, check your sdkconfig."
588 #define TRC_HWTC_PERIOD 0
589 #define TRC_HWTC_DIVISOR 4
590 #define TRC_IRQ_PRIORITY_ORDER 0
597 uint32_t prvGetSMPTimestamp();
599 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
600 #define TRC_HWTC_COUNT prvGetSMPTimestamp()
601 #define TRC_HWTC_FREQ_HZ 1000000
602 #define TRC_HWTC_PERIOD 0
603 #define TRC_HWTC_DIVISOR 4
604 #define TRC_IRQ_PRIORITY_ORDER 0
607 #if !defined(TRC_HWTC_FREQ_HZ)
608 #error "The XTensa LX6/LX7 trace hardware clock frequency is not defined."
611#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_RISCV_RV32I)
612 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
613 #define TRACE_ENTER_CRITICAL_SECTION() __asm__ __volatile__("csrr %0, mstatus \n\t" \
614 "csrci mstatus, 8 \n\t" \
615 "andi %0, %0, 8 \n\t" \
616 : "=r"(TRACE_ALLOC_CRITICAL_SECTION_NAME))
617 #define TRACE_EXIT_CRITICAL_SECTION() __asm__ __volatile__("csrr a1, mstatus \n\t" \
618 "or %0, %0, a1 \n\t" \
619 "csrs mstatus, %0 \n\t" \
621 : "r" (TRACE_ALLOC_CRITICAL_SECTION_NAME) \
623 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
624 #define TRC_HWTC_COUNT ({ unsigned int __count; \
625 __asm__ __volatile__("rdcycle %0" : "=r"(__count)); \
627 #define TRC_HWTC_PERIOD 0
628 #define TRC_HWTC_DIVISOR 1
629 #define TRC_HWTC_FREQ_HZ 16000000
630 #define TRC_IRQ_PRIORITY_ORDER 0
632#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XMOS_XCOREAI)
633 #define TRC_PORT_SPECIFIC_INIT()
634 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
635 #define TRC_HWTC_COUNT xscope_gettime()
636 #define TRC_HWTC_PERIOD (configCPU_CLOCK_HZ / configTICK_RATE_HZ )
637 #define TRC_HWTC_DIVISOR 4
638 #define TRC_HWTC_FREQ_HZ 100000000
639 #define TRC_IRQ_PRIORITY_ORDER 0
641#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_POWERPC_Z4)
645 #define TRACE_ALLOC_CRITICAL_SECTION() TraceBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
646 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = TRC_KERNEL_PORT_SET_INTERRUPT_MASK(); }
647 #define TRACE_EXIT_CRITICAL_SECTION() { TRC_KERNEL_PORT_CLEAR_INTERRUPT_MASK(TRACE_ALLOC_CRITICAL_SECTION_NAME); }
649 #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR
651 #define TRC_HWTC_COUNT PIT.TIMER[configTICK_PIT_CHANNEL].CVAL.R
652 #define TRC_HWTC_PERIOD ((configPIT_CLOCK_HZ / configTICK_RATE_HZ) - 1U)
653 #define TRC_HWTC_FREQ_HZ configPIT_CLOCK_HZ
654 #define TRC_HWTC_DIVISOR 1
655 #define TRC_IRQ_PRIORITY_ORDER 1
657#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARMv8AR_A32)
658 extern uint32_t cortex_a9_r5_enter_critical(
void);
659 extern void cortex_a9_r5_exit_critical(uint32_t irq_already_masked_at_enter);
661 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
662 #define TRACE_ENTER_CRITICAL_SECTION() { TRACE_ALLOC_CRITICAL_SECTION_NAME = (TraceUnsignedBaseType_t)cortex_a9_r5_enter_critical(); }
663 #define TRACE_EXIT_CRITICAL_SECTION() { cortex_a9_r5_exit_critical((uint32_t)TRACE_ALLOC_CRITICAL_SECTION_NAME); }
665 #include <cmsis_compiler.h>
667 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
668 #define TRC_HWTC_COUNT ((uint32_t)__get_CNTPCT())
669 #define TRC_HWTC_PERIOD 0
670 #define TRC_HWTC_DIVISOR 16
671 #define TRC_HWTC_FREQ_HZ (R_GSC->CNTFID0)
672 #define TRC_IRQ_PRIORITY_ORDER 0
674 #if defined(__GNUC__) || defined(__ICCARM__)
676 static inline uint32_t prvGetCPSR(
void)
680 __asm
volatile (
" mrs %0, cpsr" :
"=r" (ret) : );
684 #error "Only GCC and IAR supported!"
687#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ADSP_SC5XX_SHARC)
689 #define TRACE_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
690 #define TRACE_ENTER_CRITICAL_SECTION() {TRACE_ALLOC_CRITICAL_SECTION_NAME = (TraceUnsignedBaseType_t)portSET_INTERRUPT_MASK_FROM_ISR();}
691 #define TRACE_EXIT_CRITICAL_SECTION() {portCLEAR_INTERRUPT_MASK_FROM_ISR((UBaseType_t)TRACE_ALLOC_CRITICAL_SECTION_NAME);}
693 #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR
694 #define TRC_HWTC_COUNT ( *pREG_CGU0_TSCOUNT0 )
695 #define TRC_HWTC_PERIOD 1
696 #define TRC_HWTC_DIVISOR 1
697 #define TRC_HWTC_FREQ_HZ ( configCPU_CLOCK_HZ >> 1u )
699 #define TRC_PORT_SPECIFIC_INIT() {*pREG_CGU0_TSCTL |= BITM_CGU_TSCTL_EN;}
702 #define TRC_IRQ_PRIORITY_ORDER 1
704#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_APPLICATION_DEFINED)
706 #if !( defined (TRC_HWTC_TYPE) && defined (TRC_HWTC_COUNT) && defined (TRC_HWTC_PERIOD) && defined (TRC_HWTC_FREQ_HZ) && defined (TRC_IRQ_PRIORITY_ORDER) )
707 #error "The hardware port is not completely defined!"
710#elif (TRC_CFG_HARDWARE_PORT != TRC_HARDWARE_PORT_NOT_SET)
712 #error "TRC_CFG_HARDWARE_PORT had unsupported value!"
713 #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_NOT_SET
717#ifndef TRC_HWTC_DIVISOR
718 #define TRC_HWTC_DIVISOR 1
721#ifndef TRC_PORT_SPECIFIC_INIT
722 #define TRC_PORT_SPECIFIC_INIT()
729 #define _WIN32_WINNT 0x0600
741 #define WIN32_PORT_SAVE_WHEN_STOPPED 1
742 #define WIN32_PORT_EXIT_WHEN_STOPPED 1
746#if (TRC_CFG_HARDWARE_PORT != TRC_HARDWARE_PORT_NOT_SET)
748 #ifndef TRC_HWTC_TYPE
749 #error "TRC_HWTC_TYPE is not set!"
752 #ifndef TRC_HWTC_COUNT
753 #error "TRC_HWTC_COUNT is not set!"
756 #ifndef TRC_HWTC_PERIOD
757 #error "TRC_HWTC_PERIOD is not set!"
760 #ifndef TRC_HWTC_DIVISOR
761 #error "TRC_HWTC_DIVISOR is not set!"
764 #ifndef TRC_IRQ_PRIORITY_ORDER
765 #error "TRC_IRQ_PRIORITY_ORDER is not set!"
766 #elif (TRC_IRQ_PRIORITY_ORDER != 0) && (TRC_IRQ_PRIORITY_ORDER != 1)
767 #error "TRC_IRQ_PRIORITY_ORDER has bad value!"
770 #if (TRC_HWTC_DIVISOR < 1)
771 #error "TRC_HWTC_DIVISOR must be a non-zero positive value!"
774 #ifndef TRC_HWTC_FREQ_HZ
775 #error "TRC_HWTC_FREQ_HZ not defined!"
781#ifdef TRC_CFG_ALLOC_CRITICAL_SECTION
782#undef TRACE_ALLOC_CRITICAL_SECTION
783#define TRACE_ALLOC_CRITICAL_SECTION() TRC_CFG_ALLOC_CRITICAL_SECTION()
787#ifdef TRC_CFG_ENTER_CRITICAL_SECTION
788#undef TRACE_ENTER_CRITICAL_SECTION
789#define TRACE_ENTER_CRITICAL_SECTION() TRC_CFG_ENTER_CRITICAL_SECTION()
793#ifdef TRC_CFG_EXIT_CRITICAL_SECTION
794#undef TRACE_EXIT_CRITICAL_SECTION
795#define TRACE_EXIT_CRITICAL_SECTION() TRC_CFG_EXIT_CRITICAL_SECTION()
798#ifndef TRACE_ALLOC_CRITICAL_SECTION
799#define TRACE_ALLOC_CRITICAL_SECTION() TRC_KERNEL_PORT_ALLOC_CRITICAL_SECTION()
801#ifndef TRACE_ENTER_CRITICAL_SECTION
802#define TRACE_ENTER_CRITICAL_SECTION() TRC_KERNEL_PORT_ENTER_CRITICAL_SECTION()
804#ifndef TRACE_EXIT_CRITICAL_SECTION
805#define TRACE_EXIT_CRITICAL_SECTION() TRC_KERNEL_PORT_EXIT_CRITICAL_SECTION()