29 #define CTHUNK_ADDRESS 1 31 #if defined(TARGET_LIKE_CORTEX_M3) || defined(TARGET_LIKE_CORTEX_M4) 32 #define CTHUNK_VARIABLES volatile uint32_t code[1] 43 #define CTHUNK_ASSIGMENT m_thunk.code[0] = 0x8007E89F 45 #elif defined(TARGET_LIKE_CORTEX_M0PLUS) || defined(TARGET_LIKE_CORTEX_M0) 55 #define CTHUNK_VARIABLES volatile uint32_t code[3] 56 #define CTHUNK_ASSIGMENT do { \ 57 m_thunk.code[0] = 0x2404B51F; \ 58 m_thunk.code[1] = 0xCC0F447C; \ 59 m_thunk.code[2] = 0xBD1F4798; \ 63 #error "Target is not currently suported." 67 typedef void (*CThunkEntry)(void);
73 typedef void (T::*CCallbackSimple)(void);
74 typedef void (T::*CCallback)(
void* context);
78 init(instance, NULL, NULL);
81 inline CThunk(T *instance, CCallback callback)
83 init(instance, callback, NULL);
90 inline CThunk(T *instance, CCallbackSimple callback)
92 init(instance, (CCallback)callback, NULL);
95 inline CThunk(T &instance, CCallback callback)
97 init(instance, callback, NULL);
100 inline CThunk(T &instance, CCallbackSimple callback)
102 init(instance, (CCallback)callback, NULL);
105 inline CThunk(T &instance, CCallback callback,
void* context)
107 init(instance, callback, context);
110 inline void callback(CCallback callback)
112 m_callback = callback;
115 inline void callback(CCallbackSimple callback)
117 m_callback = (CCallback)callback;
120 inline void context(
void* context)
122 m_thunk.context = (uint32_t)context;
125 inline void context(uint32_t context)
127 m_thunk.context = context;
130 inline uint32_t entry(
void)
132 return (((uint32_t)&m_thunk)|CTHUNK_ADDRESS);
136 inline operator CThunkEntry(
void)
138 return (CThunkEntry)entry();
142 inline operator uint32_t(
void)
148 inline void call(
void)
150 (((CThunkEntry)(entry()))());
155 volatile CCallback m_callback;
159 #if defined (__ICCARM__) 160 typedef __packed
struct 163 volatile uint32_t instance;
164 volatile uint32_t context;
165 volatile uint32_t callback;
166 volatile uint32_t trampoline;
172 volatile uint32_t instance;
173 volatile uint32_t context;
174 volatile uint32_t callback;
175 volatile uint32_t trampoline;
176 } __attribute__((__packed__)) CThunkTrampoline;
179 static void trampoline(T* instance,
void* context, CCallback* callback)
181 if(instance && *callback) {
182 (
static_cast<T*
>(instance)->**callback)(context);
186 volatile CThunkTrampoline m_thunk;
188 inline void init(T *instance, CCallback callback,
void* context)
192 m_callback = callback;
196 m_thunk.context = (uint32_t)context;
197 m_thunk.instance = (uint32_t)instance;
198 m_thunk.callback = (uint32_t)&m_callback;
199 m_thunk.trampoline = (uint32_t)&trampoline;