Test function for CThunk class

Dependencies:   CThunk mbed

Committer:
meriac
Date:
Wed Aug 20 10:44:42 2014 +0000
Revision:
5:64411d876ad4
Parent:
4:97c886c2d89b
Child:
6:45ca54a72865
finalized thunking example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
meriac 0:a6725b4373c6 1 #include <mbed.h>
meriac 0:a6725b4373c6 2
meriac 3:c929fd5a4d3d 3 DigitalOut g_led1(LED1);
meriac 3:c929fd5a4d3d 4 DigitalOut g_led2(LED2);
meriac 3:c929fd5a4d3d 5 DigitalOut g_led3(LED3);
meriac 3:c929fd5a4d3d 6 DigitalOut g_led4(LED4);
meriac 1:2e8f85f1ed3e 7 Serial pc(USBTX, USBRX);
meriac 1:2e8f85f1ed3e 8
meriac 4:97c886c2d89b 9 #include <CThunk.h>
meriac 4:97c886c2d89b 10
meriac 0:a6725b4373c6 11 class CTest
meriac 0:a6725b4373c6 12 {
meriac 0:a6725b4373c6 13 public:
meriac 0:a6725b4373c6 14 CTest(void);
meriac 0:a6725b4373c6 15 void callback1(void);
meriac 0:a6725b4373c6 16 void callback2(void* context);
meriac 0:a6725b4373c6 17 void callback3(void* context);
meriac 1:2e8f85f1ed3e 18 static void callback4(uint32_t r0, uint32_t r1);
meriac 0:a6725b4373c6 19
meriac 0:a6725b4373c6 20 uint32_t counter;
meriac 0:a6725b4373c6 21
meriac 0:a6725b4373c6 22 CThunk<CTest> thunk;
meriac 0:a6725b4373c6 23 };
meriac 0:a6725b4373c6 24
meriac 0:a6725b4373c6 25 CTest::CTest(void)
meriac 3:c929fd5a4d3d 26 :thunk(this)
meriac 0:a6725b4373c6 27 {
meriac 0:a6725b4373c6 28 counter = 0;
meriac 0:a6725b4373c6 29 }
meriac 0:a6725b4373c6 30
meriac 0:a6725b4373c6 31 void CTest::callback1(void)
meriac 0:a6725b4373c6 32 {
meriac 5:64411d876ad4 33 pc.printf("callback1 called (this=0x%0X)\n", this);
meriac 1:2e8f85f1ed3e 34
meriac 0:a6725b4373c6 35 /* increment member variable */
meriac 5:64411d876ad4 36 counter++;
meriac 0:a6725b4373c6 37 }
meriac 0:a6725b4373c6 38
meriac 0:a6725b4373c6 39 void CTest::callback2(void* context)
meriac 0:a6725b4373c6 40 {
meriac 1:2e8f85f1ed3e 41 pc.printf("Called with context value 0x%08X\n", context);
meriac 0:a6725b4373c6 42
meriac 0:a6725b4373c6 43 /* increment member variable */
meriac 5:64411d876ad4 44 counter+=2;
meriac 0:a6725b4373c6 45 }
meriac 0:a6725b4373c6 46
meriac 1:2e8f85f1ed3e 47 void hexdump(const void* data, int length)
meriac 1:2e8f85f1ed3e 48 {
meriac 1:2e8f85f1ed3e 49 int i;
meriac 1:2e8f85f1ed3e 50
meriac 4:97c886c2d89b 51 pc.printf("Dump %u bytes from 0x%08X\n", length, data);
meriac 1:2e8f85f1ed3e 52
meriac 1:2e8f85f1ed3e 53 for(i=0; i<length; i++)
meriac 1:2e8f85f1ed3e 54 {
meriac 1:2e8f85f1ed3e 55 if((i%16) == 0)
meriac 1:2e8f85f1ed3e 56 pc.printf("\n");
meriac 1:2e8f85f1ed3e 57 else
meriac 1:2e8f85f1ed3e 58 if((i%8) == 0)
meriac 1:2e8f85f1ed3e 59 pc.printf(" - ");
meriac 1:2e8f85f1ed3e 60 pc.printf("0x%02X ", ((uint8_t*)data)[i]);
meriac 1:2e8f85f1ed3e 61 }
meriac 1:2e8f85f1ed3e 62 pc.printf("\n");
meriac 1:2e8f85f1ed3e 63 }
meriac 0:a6725b4373c6 64
meriac 3:c929fd5a4d3d 65 static void test(void)
meriac 0:a6725b4373c6 66 {
meriac 0:a6725b4373c6 67 CThunkEntry entry;
meriac 0:a6725b4373c6 68 CTest test;
meriac 0:a6725b4373c6 69
meriac 0:a6725b4373c6 70 /* get 32 bit entry point pointer from thunk */
meriac 0:a6725b4373c6 71 entry = test.thunk;
meriac 0:a6725b4373c6 72 /* TEST1: */
meriac 0:a6725b4373c6 73
meriac 0:a6725b4373c6 74 /* assign callback1 to thunk - no context needed */
meriac 4:97c886c2d89b 75 //test.thunk.callback(&CTest::callback1);
meriac 3:c929fd5a4d3d 76 hexdump((const void*)entry, 16);
meriac 0:a6725b4373c6 77 /* call entry point */
meriac 3:c929fd5a4d3d 78
meriac 5:64411d876ad4 79 pc.printf("before entry 1 (counter=%i)\n", test.counter);
meriac 3:c929fd5a4d3d 80 g_led2 = 1;
meriac 5:64411d876ad4 81 test.thunk.callback(&CTest::callback1);
meriac 0:a6725b4373c6 82 entry();
meriac 5:64411d876ad4 83 pc.printf("after entry 1 (counter=%i)\n", test.counter);
meriac 0:a6725b4373c6 84
meriac 0:a6725b4373c6 85 /* TEST2: */
meriac 0:a6725b4373c6 86
meriac 0:a6725b4373c6 87 /* assign a context ... */
meriac 4:97c886c2d89b 88 test.thunk.context(0xDEADBEEF);
meriac 0:a6725b4373c6 89 /* and switch callback to callback2 */
meriac 4:97c886c2d89b 90 test.thunk.callback(&CTest::callback2);
meriac 4:97c886c2d89b 91
meriac 0:a6725b4373c6 92 /* call entry point */
meriac 5:64411d876ad4 93 pc.printf("before entry 2 (counter=%i)\n", test.counter);
meriac 3:c929fd5a4d3d 94 g_led3 = 1;
meriac 0:a6725b4373c6 95 entry();
meriac 5:64411d876ad4 96 pc.printf("after entry 2 (counter=%i)\n", test.counter);
meriac 3:c929fd5a4d3d 97 }
meriac 0:a6725b4373c6 98
meriac 3:c929fd5a4d3d 99 int main(void)
meriac 3:c929fd5a4d3d 100 {
meriac 4:97c886c2d89b 101 pc.baud(115200);
meriac 0:a6725b4373c6 102
meriac 4:97c886c2d89b 103 printf("Test 1\n");
meriac 3:c929fd5a4d3d 104 /* run tests */
meriac 4:97c886c2d89b 105 g_led1 = 1;
meriac 3:c929fd5a4d3d 106 test();
meriac 3:c929fd5a4d3d 107
meriac 3:c929fd5a4d3d 108 /* turn both LED's on */
meriac 3:c929fd5a4d3d 109 g_led4 = 1;
meriac 3:c929fd5a4d3d 110 while(1)
meriac 3:c929fd5a4d3d 111 __WFI();
meriac 3:c929fd5a4d3d 112 }