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