Milosch Meriac
/
cthunk_example
Test function for CThunk class
main.cpp@5:64411d876ad4, 2014-08-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |