Chihiro H
/
DwtCycCnt
Cortex-M DWT CYCCNT example
main.cpp@0:41971777e42c, 2015-04-26 (annotated)
- Committer:
- discypus
- Date:
- Sun Apr 26 12:51:13 2015 +0000
- Revision:
- 0:41971777e42c
Cortex-M DWT CYCCNT example;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
discypus | 0:41971777e42c | 1 | #include <mbed.h> |
discypus | 0:41971777e42c | 2 | |
discypus | 0:41971777e42c | 3 | #if 1 |
discypus | 0:41971777e42c | 4 | #define DWT_CONTROL ((volatile uint32_t *)0xE0001000) |
discypus | 0:41971777e42c | 5 | #define DWT_CYCCNT ((volatile uint32_t *)0xE0001004) |
discypus | 0:41971777e42c | 6 | #define SCB_DEMCR ((volatile uint32_t *)0xE000EDFC) |
discypus | 0:41971777e42c | 7 | |
discypus | 0:41971777e42c | 8 | static inline uint32_t getDwtCyccnt(void) |
discypus | 0:41971777e42c | 9 | { |
discypus | 0:41971777e42c | 10 | return *DWT_CYCCNT; |
discypus | 0:41971777e42c | 11 | } |
discypus | 0:41971777e42c | 12 | |
discypus | 0:41971777e42c | 13 | static inline void resetDwtCyccnt(void) |
discypus | 0:41971777e42c | 14 | { |
discypus | 0:41971777e42c | 15 | *DWT_CYCCNT = 0; // reset the counter |
discypus | 0:41971777e42c | 16 | } |
discypus | 0:41971777e42c | 17 | |
discypus | 0:41971777e42c | 18 | static inline void enableDwtCyccnt(void) |
discypus | 0:41971777e42c | 19 | { |
discypus | 0:41971777e42c | 20 | *SCB_DEMCR = *SCB_DEMCR | (1u << 24); // TRCENA = 1 |
discypus | 0:41971777e42c | 21 | *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter (CYCCNTENA = 1) |
discypus | 0:41971777e42c | 22 | *DWT_CYCCNT = 0; // reset the counter |
discypus | 0:41971777e42c | 23 | } |
discypus | 0:41971777e42c | 24 | |
discypus | 0:41971777e42c | 25 | #endif |
discypus | 0:41971777e42c | 26 | |
discypus | 0:41971777e42c | 27 | Serial pc(USBTX, USBRX); |
discypus | 0:41971777e42c | 28 | |
discypus | 0:41971777e42c | 29 | static void benchmark_wait_us() { |
discypus | 0:41971777e42c | 30 | uint32_t count[11]; |
discypus | 0:41971777e42c | 31 | enableDwtCyccnt(); |
discypus | 0:41971777e42c | 32 | resetDwtCyccnt(); |
discypus | 0:41971777e42c | 33 | count[0] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 34 | wait_us(1000); |
discypus | 0:41971777e42c | 35 | count[1] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 36 | wait_us(1000); |
discypus | 0:41971777e42c | 37 | count[2] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 38 | wait_us(1000); |
discypus | 0:41971777e42c | 39 | count[3] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 40 | wait_us(1000); |
discypus | 0:41971777e42c | 41 | count[4] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 42 | wait_us(1000); |
discypus | 0:41971777e42c | 43 | count[5] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 44 | wait_us(1000); |
discypus | 0:41971777e42c | 45 | count[6] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 46 | wait_us(1000); |
discypus | 0:41971777e42c | 47 | count[7] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 48 | wait_us(1000); |
discypus | 0:41971777e42c | 49 | count[8] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 50 | wait_us(1000); |
discypus | 0:41971777e42c | 51 | count[9] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 52 | wait_us(1000); |
discypus | 0:41971777e42c | 53 | count[10] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 54 | |
discypus | 0:41971777e42c | 55 | for (size_t i = 0; i <= 10; i++) { |
discypus | 0:41971777e42c | 56 | const uint32_t diff = (i >= 1)?(count[i] - count[i - 1]):0; |
discypus | 0:41971777e42c | 57 | pc.printf("%d (%d)\r\n", count[i], diff); |
discypus | 0:41971777e42c | 58 | } |
discypus | 0:41971777e42c | 59 | } |
discypus | 0:41971777e42c | 60 | |
discypus | 0:41971777e42c | 61 | static void benchmark_nop() { |
discypus | 0:41971777e42c | 62 | uint32_t count[11]; |
discypus | 0:41971777e42c | 63 | enableDwtCyccnt(); |
discypus | 0:41971777e42c | 64 | resetDwtCyccnt(); |
discypus | 0:41971777e42c | 65 | count[0] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 66 | __nop(); |
discypus | 0:41971777e42c | 67 | count[1] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 68 | __nop(); |
discypus | 0:41971777e42c | 69 | count[2] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 70 | __nop(); |
discypus | 0:41971777e42c | 71 | count[3] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 72 | __nop(); |
discypus | 0:41971777e42c | 73 | count[4] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 74 | __nop(); |
discypus | 0:41971777e42c | 75 | count[5] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 76 | __nop(); |
discypus | 0:41971777e42c | 77 | count[6] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 78 | __nop(); |
discypus | 0:41971777e42c | 79 | count[7] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 80 | __nop(); |
discypus | 0:41971777e42c | 81 | count[8] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 82 | __nop(); |
discypus | 0:41971777e42c | 83 | count[9] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 84 | __nop(); |
discypus | 0:41971777e42c | 85 | count[10] = getDwtCyccnt(); |
discypus | 0:41971777e42c | 86 | |
discypus | 0:41971777e42c | 87 | for (size_t i = 0; i <= 10; i++) { |
discypus | 0:41971777e42c | 88 | const uint32_t diff = (i >= 1)?(count[i] - count[i - 1]):0; |
discypus | 0:41971777e42c | 89 | pc.printf("%d (%d)\r\n", count[i], diff); |
discypus | 0:41971777e42c | 90 | } |
discypus | 0:41971777e42c | 91 | } |
discypus | 0:41971777e42c | 92 | |
discypus | 0:41971777e42c | 93 | int main() { |
discypus | 0:41971777e42c | 94 | pc.baud(115200); |
discypus | 0:41971777e42c | 95 | pc.printf("CPU SystemCoreClock is %.2f MHz\r\n", (float)SystemCoreClock/1000.0f/1000.0f); |
discypus | 0:41971777e42c | 96 | pc.printf("Nucleo compare DWT_CYCCNT to wait_us\r\n"); |
discypus | 0:41971777e42c | 97 | |
discypus | 0:41971777e42c | 98 | // |
discypus | 0:41971777e42c | 99 | benchmark_wait_us(); |
discypus | 0:41971777e42c | 100 | benchmark_nop(); |
discypus | 0:41971777e42c | 101 | } |
discypus | 0:41971777e42c | 102 |