Test function for CThunk class

Dependencies:   CThunk mbed

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?

UserRevisionLine numberNew 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 }