Data Watch-point and Trace unit(DWT) interface.
Dwt.cpp@0:37014c6bb5cd, 2017-10-08 (annotated)
- Committer:
- YasuhiroKawai
- Date:
- Sun Oct 08 05:51:12 2017 +0000
- Revision:
- 0:37014c6bb5cd
Initial revision
Who changed what in which revision?
User | Revision | Line number | New 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 | } |