The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
170:e95d10626187
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 156:ff21514d8981 1
AnnaBridge 156:ff21514d8981 2 /** \addtogroup platform */
AnnaBridge 156:ff21514d8981 3 /** @{*/
AnnaBridge 158:1c57384330a6 4 /**
AnnaBridge 158:1c57384330a6 5 * \defgroup platform_CThunk CThunk class
AnnaBridge 158:1c57384330a6 6 * @{
AnnaBridge 158:1c57384330a6 7 */
AnnaBridge 156:ff21514d8981 8 /* General C++ Object Thunking class
AnnaBridge 156:ff21514d8981 9 *
AnnaBridge 156:ff21514d8981 10 * - allows direct callbacks to non-static C++ class functions
AnnaBridge 156:ff21514d8981 11 * - keeps track for the corresponding class instance
AnnaBridge 156:ff21514d8981 12 * - supports an optional context parameter for the called function
AnnaBridge 156:ff21514d8981 13 * - ideally suited for class object receiving interrupts (NVIC_SetVector)
AnnaBridge 156:ff21514d8981 14 *
AnnaBridge 156:ff21514d8981 15 * Copyright (c) 2014-2015 ARM Limited
AnnaBridge 172:65be27845400 16 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 156:ff21514d8981 17 *
AnnaBridge 156:ff21514d8981 18 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 156:ff21514d8981 19 * you may not use this file except in compliance with the License.
AnnaBridge 156:ff21514d8981 20 * You may obtain a copy of the License at
AnnaBridge 156:ff21514d8981 21 *
AnnaBridge 156:ff21514d8981 22 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 156:ff21514d8981 23 *
AnnaBridge 156:ff21514d8981 24 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 156:ff21514d8981 25 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 156:ff21514d8981 26 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 156:ff21514d8981 27 * See the License for the specific language governing permissions and
AnnaBridge 156:ff21514d8981 28 * limitations under the License.
AnnaBridge 156:ff21514d8981 29 */
AnnaBridge 156:ff21514d8981 30
AnnaBridge 156:ff21514d8981 31 /* General C++ Object Thunking class
AnnaBridge 156:ff21514d8981 32 *
AnnaBridge 156:ff21514d8981 33 * - allows direct callbacks to non-static C++ class functions
AnnaBridge 156:ff21514d8981 34 * - keeps track for the corresponding class instance
AnnaBridge 156:ff21514d8981 35 * - supports an optional context parameter for the called function
AnnaBridge 156:ff21514d8981 36 * - ideally suited for class object receiving interrupts (NVIC_SetVector)
AnnaBridge 156:ff21514d8981 37 */
AnnaBridge 156:ff21514d8981 38
AnnaBridge 156:ff21514d8981 39 #ifndef __CTHUNK_H__
AnnaBridge 156:ff21514d8981 40 #define __CTHUNK_H__
AnnaBridge 156:ff21514d8981 41
AnnaBridge 172:65be27845400 42 #include "CThunkBase.h"
AnnaBridge 156:ff21514d8981 43
AnnaBridge 156:ff21514d8981 44 /**
AnnaBridge 156:ff21514d8981 45 * Class for created a pointer with data bound to it
AnnaBridge 156:ff21514d8981 46 *
AnnaBridge 156:ff21514d8981 47 * @note Synchronization level: Not protected
AnnaBridge 156:ff21514d8981 48 */
AnnaBridge 156:ff21514d8981 49 template<class T>
AnnaBridge 172:65be27845400 50 class CThunk: public CThunkBase {
AnnaBridge 170:e95d10626187 51 public:
AnnaBridge 170:e95d10626187 52 typedef void (T::*CCallbackSimple)(void);
AnnaBridge 170:e95d10626187 53 typedef void (T::*CCallback)(void *context);
AnnaBridge 170:e95d10626187 54
AnnaBridge 170:e95d10626187 55 inline CThunk(T *instance)
AnnaBridge 170:e95d10626187 56 {
AnnaBridge 170:e95d10626187 57 init(instance, NULL, NULL);
AnnaBridge 170:e95d10626187 58 }
AnnaBridge 156:ff21514d8981 59
AnnaBridge 170:e95d10626187 60 inline CThunk(T *instance, CCallback callback)
AnnaBridge 170:e95d10626187 61 {
AnnaBridge 170:e95d10626187 62 init(instance, callback, NULL);
AnnaBridge 170:e95d10626187 63 }
AnnaBridge 156:ff21514d8981 64
AnnaBridge 170:e95d10626187 65 ~CThunk()
AnnaBridge 170:e95d10626187 66 {
AnnaBridge 172:65be27845400 67 cthunk_free(_entry);
AnnaBridge 172:65be27845400 68 _entry = NULL;
AnnaBridge 170:e95d10626187 69 }
AnnaBridge 156:ff21514d8981 70
AnnaBridge 170:e95d10626187 71 inline CThunk(T *instance, CCallbackSimple callback)
AnnaBridge 170:e95d10626187 72 {
AnnaBridge 170:e95d10626187 73 init(instance, (CCallback)callback, NULL);
AnnaBridge 170:e95d10626187 74 }
AnnaBridge 156:ff21514d8981 75
AnnaBridge 170:e95d10626187 76 inline CThunk(T &instance, CCallback callback)
AnnaBridge 170:e95d10626187 77 {
AnnaBridge 170:e95d10626187 78 init(instance, callback, NULL);
AnnaBridge 170:e95d10626187 79 }
AnnaBridge 156:ff21514d8981 80
AnnaBridge 170:e95d10626187 81 inline CThunk(T &instance, CCallbackSimple callback)
AnnaBridge 170:e95d10626187 82 {
AnnaBridge 170:e95d10626187 83 init(instance, (CCallback)callback, NULL);
AnnaBridge 170:e95d10626187 84 }
AnnaBridge 156:ff21514d8981 85
AnnaBridge 170:e95d10626187 86 inline CThunk(T &instance, CCallback callback, void *context)
AnnaBridge 170:e95d10626187 87 {
AnnaBridge 170:e95d10626187 88 init(instance, callback, context);
AnnaBridge 170:e95d10626187 89 }
AnnaBridge 156:ff21514d8981 90
AnnaBridge 170:e95d10626187 91 inline void callback(CCallback callback)
AnnaBridge 170:e95d10626187 92 {
AnnaBridge 172:65be27845400 93 _callback = callback;
AnnaBridge 170:e95d10626187 94 }
AnnaBridge 170:e95d10626187 95
AnnaBridge 170:e95d10626187 96 inline void callback(CCallbackSimple callback)
AnnaBridge 170:e95d10626187 97 {
AnnaBridge 172:65be27845400 98 _callback_simple = callback;
AnnaBridge 170:e95d10626187 99 }
AnnaBridge 156:ff21514d8981 100
AnnaBridge 170:e95d10626187 101 inline void context(void *context)
AnnaBridge 170:e95d10626187 102 {
AnnaBridge 172:65be27845400 103 _context = context;
AnnaBridge 170:e95d10626187 104 }
AnnaBridge 156:ff21514d8981 105
AnnaBridge 170:e95d10626187 106 inline void context(uint32_t context)
AnnaBridge 170:e95d10626187 107 {
AnnaBridge 172:65be27845400 108 _context = (void *)context;
AnnaBridge 170:e95d10626187 109 }
AnnaBridge 156:ff21514d8981 110
AnnaBridge 170:e95d10626187 111 inline uint32_t entry(void)
AnnaBridge 170:e95d10626187 112 {
AnnaBridge 172:65be27845400 113 if (_entry == NULL) {
AnnaBridge 172:65be27845400 114 _entry = cthunk_alloc(this);
AnnaBridge 172:65be27845400 115 }
AnnaBridge 172:65be27845400 116 return (uint32_t)_entry;
AnnaBridge 170:e95d10626187 117 }
AnnaBridge 156:ff21514d8981 118
AnnaBridge 170:e95d10626187 119 /* get thunk entry point for connecting rhunk to an IRQ table */
AnnaBridge 170:e95d10626187 120 inline operator CThunkEntry(void)
AnnaBridge 170:e95d10626187 121 {
AnnaBridge 170:e95d10626187 122 return (CThunkEntry)entry();
AnnaBridge 170:e95d10626187 123 }
AnnaBridge 156:ff21514d8981 124
AnnaBridge 170:e95d10626187 125 /* get thunk entry point for connecting rhunk to an IRQ table */
AnnaBridge 170:e95d10626187 126 inline operator uint32_t(void)
AnnaBridge 170:e95d10626187 127 {
AnnaBridge 170:e95d10626187 128 return entry();
AnnaBridge 170:e95d10626187 129 }
AnnaBridge 156:ff21514d8981 130
AnnaBridge 170:e95d10626187 131 /* simple test function */
AnnaBridge 170:e95d10626187 132 inline void call(void)
AnnaBridge 170:e95d10626187 133 {
AnnaBridge 170:e95d10626187 134 (((CThunkEntry)(entry()))());
AnnaBridge 170:e95d10626187 135 }
AnnaBridge 156:ff21514d8981 136
AnnaBridge 170:e95d10626187 137 private:
AnnaBridge 172:65be27845400 138 T *_instance;
AnnaBridge 172:65be27845400 139 void *_context;
AnnaBridge 172:65be27845400 140 union {
AnnaBridge 172:65be27845400 141 CCallbackSimple _callback_simple;
AnnaBridge 172:65be27845400 142 CCallback _callback;
AnnaBridge 172:65be27845400 143 };
AnnaBridge 172:65be27845400 144
AnnaBridge 172:65be27845400 145 CThunkEntry _entry;
AnnaBridge 156:ff21514d8981 146
AnnaBridge 172:65be27845400 147 static void trampoline(CThunkBase *base)
AnnaBridge 172:65be27845400 148 {
AnnaBridge 172:65be27845400 149 CThunk<T> *self = static_cast<CThunk<T>*>(base);
AnnaBridge 172:65be27845400 150 T *instance = self->_instance;
AnnaBridge 172:65be27845400 151 void *context = self->_context;
AnnaBridge 172:65be27845400 152 CCallback callback = self->_callback;
AnnaBridge 156:ff21514d8981 153
AnnaBridge 172:65be27845400 154 if (instance && callback) {
AnnaBridge 172:65be27845400 155 (instance->*callback)(context);
AnnaBridge 156:ff21514d8981 156 }
AnnaBridge 170:e95d10626187 157 }
AnnaBridge 156:ff21514d8981 158
AnnaBridge 170:e95d10626187 159 inline void init(T *instance, CCallback callback, void *context)
AnnaBridge 170:e95d10626187 160 {
AnnaBridge 172:65be27845400 161 _instance = instance;
AnnaBridge 172:65be27845400 162 _context = context;
AnnaBridge 172:65be27845400 163 _callback = callback;
AnnaBridge 172:65be27845400 164 _trampoline = &trampoline;
AnnaBridge 172:65be27845400 165 _entry = 0;
AnnaBridge 170:e95d10626187 166 }
AnnaBridge 156:ff21514d8981 167 };
AnnaBridge 156:ff21514d8981 168
AnnaBridge 158:1c57384330a6 169 /**@}*/
AnnaBridge 158:1c57384330a6 170
AnnaBridge 158:1c57384330a6 171 /**@}*/
AnnaBridge 158:1c57384330a6 172
AnnaBridge 156:ff21514d8981 173 #endif/*__CTHUNK_H__*/
AnnaBridge 156:ff21514d8981 174