Test function for CThunk class

Dependencies:   CThunk mbed

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?

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