update

Committer:
kwengryn3
Date:
Thu Apr 08 16:43:07 2021 +0000
Revision:
0:bfff72fb3650
update;

Who changed what in which revision?

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