Data Watch-point and Trace unit(DWT) interface.

Committer:
YasuhiroKawai
Date:
Sun Oct 08 05:51:12 2017 +0000
Revision:
0:37014c6bb5cd
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YasuhiroKawai 0:37014c6bb5cd 1
YasuhiroKawai 0:37014c6bb5cd 2 #include <mbed.h>
YasuhiroKawai 0:37014c6bb5cd 3 #include "Dwt.h"
YasuhiroKawai 0:37014c6bb5cd 4
YasuhiroKawai 0:37014c6bb5cd 5 const uint32_t Dwt::DWT_REGS_ADDR = 0xe0001000;
YasuhiroKawai 0:37014c6bb5cd 6 const uint32_t Dwt::SCB_DEMCR_ADDR = 0xe000edfc;
YasuhiroKawai 0:37014c6bb5cd 7
YasuhiroKawai 0:37014c6bb5cd 8 const uint32_t Dwt::NUMCOMP_POS = 28;
YasuhiroKawai 0:37014c6bb5cd 9 const uint32_t Dwt::NUMCOMP_MASK = (0xfU << Dwt::NUMCOMP_POS);
YasuhiroKawai 0:37014c6bb5cd 10 const uint32_t Dwt::NOTRCPKT = (1 << 27);
YasuhiroKawai 0:37014c6bb5cd 11 const uint32_t Dwt::NOEXTTRIG = (1 << 26);
YasuhiroKawai 0:37014c6bb5cd 12 const uint32_t Dwt::NOCYCCNT = (1 << 25);
YasuhiroKawai 0:37014c6bb5cd 13 const uint32_t Dwt::NOPRFCNT = (1 << 24);
YasuhiroKawai 0:37014c6bb5cd 14
YasuhiroKawai 0:37014c6bb5cd 15 const uint32_t Dwt::CYCEVTENA = (1 << 22);
YasuhiroKawai 0:37014c6bb5cd 16 const uint32_t Dwt::FOLDEVTENA = (1 << 21);
YasuhiroKawai 0:37014c6bb5cd 17 const uint32_t Dwt::LSUEVTENA = (1 << 20);
YasuhiroKawai 0:37014c6bb5cd 18 const uint32_t Dwt::SLEEPEVTENA = (1 << 19);
YasuhiroKawai 0:37014c6bb5cd 19 const uint32_t Dwt::EXCEVTENA = (1 << 18);
YasuhiroKawai 0:37014c6bb5cd 20 const uint32_t Dwt::CPIEVTENA = (1 << 17);
YasuhiroKawai 0:37014c6bb5cd 21 const uint32_t Dwt::EXCTRCENA = (1 << 16);
YasuhiroKawai 0:37014c6bb5cd 22 const uint32_t Dwt::PCSAMPLENA = (1 << 12);
YasuhiroKawai 0:37014c6bb5cd 23 const uint32_t Dwt::CYCCNTENA = (1 << 0);
YasuhiroKawai 0:37014c6bb5cd 24
YasuhiroKawai 0:37014c6bb5cd 25 const uint32_t Dwt::TRCENA = (1 << 24);
YasuhiroKawai 0:37014c6bb5cd 26
YasuhiroKawai 0:37014c6bb5cd 27 const uint32_t Dwt::EVENA_MASK = Dwt::CYCEVTENA | Dwt::FOLDEVTENA | Dwt::LSUEVTENA | Dwt::SLEEPEVTENA |
YasuhiroKawai 0:37014c6bb5cd 28 Dwt::EXCEVTENA | Dwt::CPIEVTENA | Dwt::EXCTRCENA | Dwt::PCSAMPLENA |
YasuhiroKawai 0:37014c6bb5cd 29 Dwt::CYCCNTENA;
YasuhiroKawai 0:37014c6bb5cd 30
YasuhiroKawai 0:37014c6bb5cd 31
YasuhiroKawai 0:37014c6bb5cd 32
YasuhiroKawai 0:37014c6bb5cd 33 Dwt::Dwt()
YasuhiroKawai 0:37014c6bb5cd 34 {
YasuhiroKawai 0:37014c6bb5cd 35 _regs = (volatile dwt_regs_t *)DWT_REGS_ADDR;
YasuhiroKawai 0:37014c6bb5cd 36 _scb_demcr_regs = (volatile uint32_t *)SCB_DEMCR_ADDR;
YasuhiroKawai 0:37014c6bb5cd 37 }
YasuhiroKawai 0:37014c6bb5cd 38
YasuhiroKawai 0:37014c6bb5cd 39 bool
YasuhiroKawai 0:37014c6bb5cd 40 Dwt::isTRCPKT_Available()
YasuhiroKawai 0:37014c6bb5cd 41 {
YasuhiroKawai 0:37014c6bb5cd 42 return((_regs->DWT_CTRL & NOTRCPKT) == 0);
YasuhiroKawai 0:37014c6bb5cd 43 }
YasuhiroKawai 0:37014c6bb5cd 44
YasuhiroKawai 0:37014c6bb5cd 45
YasuhiroKawai 0:37014c6bb5cd 46 bool
YasuhiroKawai 0:37014c6bb5cd 47 Dwt::isEXTTRIG_Available()
YasuhiroKawai 0:37014c6bb5cd 48 {
YasuhiroKawai 0:37014c6bb5cd 49 return((_regs->DWT_CTRL & NOEXTTRIG) == 0);
YasuhiroKawai 0:37014c6bb5cd 50 }
YasuhiroKawai 0:37014c6bb5cd 51
YasuhiroKawai 0:37014c6bb5cd 52 bool
YasuhiroKawai 0:37014c6bb5cd 53 Dwt::isCYCCNT_Available()
YasuhiroKawai 0:37014c6bb5cd 54 {
YasuhiroKawai 0:37014c6bb5cd 55 return((_regs->DWT_CTRL & NOCYCCNT) == 0);
YasuhiroKawai 0:37014c6bb5cd 56 }
YasuhiroKawai 0:37014c6bb5cd 57
YasuhiroKawai 0:37014c6bb5cd 58 bool
YasuhiroKawai 0:37014c6bb5cd 59 Dwt::isPRFCNT_Available()
YasuhiroKawai 0:37014c6bb5cd 60 {
YasuhiroKawai 0:37014c6bb5cd 61 return((_regs->DWT_CTRL & NOPRFCNT) == 0);
YasuhiroKawai 0:37014c6bb5cd 62 }
YasuhiroKawai 0:37014c6bb5cd 63
YasuhiroKawai 0:37014c6bb5cd 64 void
YasuhiroKawai 0:37014c6bb5cd 65 Dwt::enableCYCCNT()
YasuhiroKawai 0:37014c6bb5cd 66 {
YasuhiroKawai 0:37014c6bb5cd 67 *_scb_demcr_regs |= TRCENA;
YasuhiroKawai 0:37014c6bb5cd 68 }
YasuhiroKawai 0:37014c6bb5cd 69
YasuhiroKawai 0:37014c6bb5cd 70 void
YasuhiroKawai 0:37014c6bb5cd 71 Dwt::disableCYCCNT()
YasuhiroKawai 0:37014c6bb5cd 72 {
YasuhiroKawai 0:37014c6bb5cd 73 *_scb_demcr_regs &= ~TRCENA;
YasuhiroKawai 0:37014c6bb5cd 74 }
YasuhiroKawai 0:37014c6bb5cd 75
YasuhiroKawai 0:37014c6bb5cd 76 void
YasuhiroKawai 0:37014c6bb5cd 77 Dwt::setEvent(uint32_t ev)
YasuhiroKawai 0:37014c6bb5cd 78 {
YasuhiroKawai 0:37014c6bb5cd 79 uint32_t tmp;
YasuhiroKawai 0:37014c6bb5cd 80 tmp = _regs->DWT_CTRL;
YasuhiroKawai 0:37014c6bb5cd 81 tmp &= ~EVENA_MASK;
YasuhiroKawai 0:37014c6bb5cd 82 tmp |= ev & EVENA_MASK;
YasuhiroKawai 0:37014c6bb5cd 83 _regs->DWT_CTRL = tmp;
YasuhiroKawai 0:37014c6bb5cd 84 }
YasuhiroKawai 0:37014c6bb5cd 85
YasuhiroKawai 0:37014c6bb5cd 86 /// ICNT = CNT_CYCLES + CNT_FOLD - (CNT_LSU + CNT_EXC + CNT_SLEEP + CNT_CPI)
YasuhiroKawai 0:37014c6bb5cd 87 uint32_t
YasuhiroKawai 0:37014c6bb5cd 88 Dwt::getInstructionCount()
YasuhiroKawai 0:37014c6bb5cd 89 {
YasuhiroKawai 0:37014c6bb5cd 90 uint32_t cnt_cycles = getCYCCNT();
YasuhiroKawai 0:37014c6bb5cd 91 uint32_t cnt_fold = getFOLDCNT();
YasuhiroKawai 0:37014c6bb5cd 92 uint32_t cnt_lsu = getLSUCNT();
YasuhiroKawai 0:37014c6bb5cd 93 uint32_t cnt_exc = getEXCCNT();
YasuhiroKawai 0:37014c6bb5cd 94 uint32_t cnt_sleep = getSLEEPCNT();
YasuhiroKawai 0:37014c6bb5cd 95 uint32_t cnt_cpi = getCPICNT();
YasuhiroKawai 0:37014c6bb5cd 96 return(cnt_cycles + cnt_fold - (cnt_lsu + cnt_exc + cnt_sleep + cnt_cpi));
YasuhiroKawai 0:37014c6bb5cd 97 }