Milosch Meriac
/
cthunk_example
Test function for CThunk class
main.cpp@11:c8a8487ec006, 2014-11-03 (annotated)
- Committer:
- meriac
- Date:
- Mon Nov 03 09:53:11 2014 +0000
- Revision:
- 11:c8a8487ec006
- Parent:
- 10:47bfaa986895
Re-publish repository
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
meriac | 0:a6725b4373c6 | 1 | #include <mbed.h> |
meriac | 10:47bfaa986895 | 2 | #include <thunk.h> |
meriac | 4:97c886c2d89b | 3 | |
meriac | 0:a6725b4373c6 | 4 | class CTest |
meriac | 0:a6725b4373c6 | 5 | { |
meriac | 0:a6725b4373c6 | 6 | public: |
meriac | 0:a6725b4373c6 | 7 | CTest(void); |
meriac | 8:ac4f1c813c8d | 8 | void test(void); |
meriac | 8:ac4f1c813c8d | 9 | void hexdump(const void* data, int length); |
meriac | 8:ac4f1c813c8d | 10 | |
meriac | 8:ac4f1c813c8d | 11 | Serial pc; |
meriac | 8:ac4f1c813c8d | 12 | CThunk<CTest> thunk; |
meriac | 8:ac4f1c813c8d | 13 | |
meriac | 0:a6725b4373c6 | 14 | void callback2(void* context); |
meriac | 8:ac4f1c813c8d | 15 | |
meriac | 8:ac4f1c813c8d | 16 | private: |
meriac | 10:47bfaa986895 | 17 | CThunkIRQ<CTest> m_irq; |
meriac | 10:47bfaa986895 | 18 | DigitalOut m_led1, m_led2, m_led3; |
meriac | 0:a6725b4373c6 | 19 | |
meriac | 8:ac4f1c813c8d | 20 | void callback1(void); |
meriac | 10:47bfaa986895 | 21 | void callback_irq(void); |
meriac | 0:a6725b4373c6 | 22 | |
meriac | 8:ac4f1c813c8d | 23 | uint32_t m_counter; |
meriac | 0:a6725b4373c6 | 24 | }; |
meriac | 0:a6725b4373c6 | 25 | |
meriac | 0:a6725b4373c6 | 26 | CTest::CTest(void) |
meriac | 8:ac4f1c813c8d | 27 | :pc(USBTX, USBRX), |
meriac | 8:ac4f1c813c8d | 28 | thunk(this, &CTest::callback1), |
meriac | 10:47bfaa986895 | 29 | m_irq(this, TIMER0_IRQn, &CTest::callback_irq), |
meriac | 8:ac4f1c813c8d | 30 | m_led1(LED1), |
meriac | 10:47bfaa986895 | 31 | m_led2(LED2), |
meriac | 10:47bfaa986895 | 32 | m_led3(LED3) |
meriac | 0:a6725b4373c6 | 33 | { |
meriac | 8:ac4f1c813c8d | 34 | m_counter = 0; |
meriac | 8:ac4f1c813c8d | 35 | |
meriac | 10:47bfaa986895 | 36 | pc.baud(115200); |
meriac | 10:47bfaa986895 | 37 | |
meriac | 10:47bfaa986895 | 38 | /* enable timer */ |
meriac | 10:47bfaa986895 | 39 | LPC_SC->PCONP |= 2; |
meriac | 10:47bfaa986895 | 40 | LPC_TIM0->TCR = 2; |
meriac | 10:47bfaa986895 | 41 | LPC_TIM0->MR0 = 2398000; |
meriac | 10:47bfaa986895 | 42 | LPC_TIM0->MCR = 3; |
meriac | 10:47bfaa986895 | 43 | LPC_TIM0->TCR = 1; |
meriac | 0:a6725b4373c6 | 44 | } |
meriac | 0:a6725b4373c6 | 45 | |
meriac | 0:a6725b4373c6 | 46 | void CTest::callback1(void) |
meriac | 0:a6725b4373c6 | 47 | { |
meriac | 8:ac4f1c813c8d | 48 | pc.printf("callback1: called (this=0x%0X)\n", this); |
meriac | 8:ac4f1c813c8d | 49 | |
meriac | 8:ac4f1c813c8d | 50 | /* turn on LED1 */ |
meriac | 8:ac4f1c813c8d | 51 | m_led1 = 1; |
meriac | 1:2e8f85f1ed3e | 52 | |
meriac | 0:a6725b4373c6 | 53 | /* increment member variable */ |
meriac | 8:ac4f1c813c8d | 54 | pc.printf("callback1: m_counter before: %i\n", m_counter); |
meriac | 8:ac4f1c813c8d | 55 | m_counter++; |
meriac | 8:ac4f1c813c8d | 56 | pc.printf("callback1: m_counter after : %i\n", m_counter); |
meriac | 0:a6725b4373c6 | 57 | } |
meriac | 0:a6725b4373c6 | 58 | |
meriac | 0:a6725b4373c6 | 59 | void CTest::callback2(void* context) |
meriac | 0:a6725b4373c6 | 60 | { |
meriac | 8:ac4f1c813c8d | 61 | pc.printf("callback2: called with context value 0x%08X\n", context); |
meriac | 8:ac4f1c813c8d | 62 | |
meriac | 8:ac4f1c813c8d | 63 | /* turn on LED2 */ |
meriac | 8:ac4f1c813c8d | 64 | m_led2 = 1; |
meriac | 0:a6725b4373c6 | 65 | |
meriac | 0:a6725b4373c6 | 66 | /* increment member variable */ |
meriac | 8:ac4f1c813c8d | 67 | pc.printf("callback2: m_counter before: %i\n", m_counter); |
meriac | 8:ac4f1c813c8d | 68 | m_counter+=2; |
meriac | 8:ac4f1c813c8d | 69 | pc.printf("callback2: m_counter after : %i\n", m_counter); |
meriac | 0:a6725b4373c6 | 70 | } |
meriac | 0:a6725b4373c6 | 71 | |
meriac | 10:47bfaa986895 | 72 | void CTest::callback_irq(void) |
meriac | 10:47bfaa986895 | 73 | { |
meriac | 10:47bfaa986895 | 74 | uint32_t reason = LPC_TIM0->IR; |
meriac | 10:47bfaa986895 | 75 | |
meriac | 10:47bfaa986895 | 76 | /* verify reason */ |
meriac | 10:47bfaa986895 | 77 | if(reason & 1) |
meriac | 10:47bfaa986895 | 78 | m_led3 = !m_led3; |
meriac | 10:47bfaa986895 | 79 | |
meriac | 10:47bfaa986895 | 80 | /* acknowledge IRQ */ |
meriac | 10:47bfaa986895 | 81 | LPC_TIM0->IR = reason; |
meriac | 10:47bfaa986895 | 82 | } |
meriac | 10:47bfaa986895 | 83 | |
meriac | 8:ac4f1c813c8d | 84 | void CTest::hexdump(const void* data, int length) |
meriac | 1:2e8f85f1ed3e | 85 | { |
meriac | 1:2e8f85f1ed3e | 86 | int i; |
meriac | 1:2e8f85f1ed3e | 87 | |
meriac | 4:97c886c2d89b | 88 | pc.printf("Dump %u bytes from 0x%08X\n", length, data); |
meriac | 1:2e8f85f1ed3e | 89 | |
meriac | 1:2e8f85f1ed3e | 90 | for(i=0; i<length; i++) |
meriac | 1:2e8f85f1ed3e | 91 | { |
meriac | 1:2e8f85f1ed3e | 92 | if((i%16) == 0) |
meriac | 1:2e8f85f1ed3e | 93 | pc.printf("\n"); |
meriac | 1:2e8f85f1ed3e | 94 | else |
meriac | 1:2e8f85f1ed3e | 95 | if((i%8) == 0) |
meriac | 1:2e8f85f1ed3e | 96 | pc.printf(" - "); |
meriac | 1:2e8f85f1ed3e | 97 | pc.printf("0x%02X ", ((uint8_t*)data)[i]); |
meriac | 1:2e8f85f1ed3e | 98 | } |
meriac | 1:2e8f85f1ed3e | 99 | pc.printf("\n"); |
meriac | 1:2e8f85f1ed3e | 100 | } |
meriac | 0:a6725b4373c6 | 101 | |
meriac | 8:ac4f1c813c8d | 102 | int main(void) |
meriac | 0:a6725b4373c6 | 103 | { |
meriac | 8:ac4f1c813c8d | 104 | /* allocate thunking test class */ |
meriac | 0:a6725b4373c6 | 105 | CTest test; |
meriac | 8:ac4f1c813c8d | 106 | /* allocate 32 bit pointer to thunk-entry */ |
meriac | 8:ac4f1c813c8d | 107 | CThunkEntry entry; |
meriac | 0:a6725b4373c6 | 108 | |
meriac | 8:ac4f1c813c8d | 109 | /* to make a point: get 32 bit entry point pointer from thunk */ |
meriac | 8:ac4f1c813c8d | 110 | entry = test.thunk; |
meriac | 3:c929fd5a4d3d | 111 | |
meriac | 8:ac4f1c813c8d | 112 | /* TEST1: */ |
meriac | 8:ac4f1c813c8d | 113 | /* callback function has been set in the CTest constructor */ |
meriac | 8:ac4f1c813c8d | 114 | test.hexdump((const void*)entry, 20); |
meriac | 8:ac4f1c813c8d | 115 | /* call entry point */ |
meriac | 0:a6725b4373c6 | 116 | entry(); |
meriac | 0:a6725b4373c6 | 117 | |
meriac | 0:a6725b4373c6 | 118 | /* TEST2: */ |
meriac | 0:a6725b4373c6 | 119 | /* assign a context ... */ |
meriac | 4:97c886c2d89b | 120 | test.thunk.context(0xDEADBEEF); |
meriac | 0:a6725b4373c6 | 121 | /* and switch callback to callback2 */ |
meriac | 4:97c886c2d89b | 122 | test.thunk.callback(&CTest::callback2); |
meriac | 0:a6725b4373c6 | 123 | /* call entry point */ |
meriac | 0:a6725b4373c6 | 124 | entry(); |
meriac | 3:c929fd5a4d3d | 125 | |
meriac | 10:47bfaa986895 | 126 | /* sit waiting for timer interrupts */ |
meriac | 3:c929fd5a4d3d | 127 | while(1) |
meriac | 3:c929fd5a4d3d | 128 | __WFI(); |
meriac | 3:c929fd5a4d3d | 129 | } |