mbed.h verzija za koristenje na predmetu PAI

Committer:
esokic
Date:
Tue Mar 10 09:51:52 2015 +0000
Revision:
0:05aad811ea07
mbed.h verzija od marta 2014, za koristenje na predmetu PAI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
esokic 0:05aad811ea07 1 #ifndef MBED_INTERRUPTMANAGER_H
esokic 0:05aad811ea07 2 #define MBED_INTERRUPTMANAGER_H
esokic 0:05aad811ea07 3
esokic 0:05aad811ea07 4 #include "cmsis.h"
esokic 0:05aad811ea07 5 #include "CallChain.h"
esokic 0:05aad811ea07 6 #include <string.h>
esokic 0:05aad811ea07 7
esokic 0:05aad811ea07 8 namespace mbed {
esokic 0:05aad811ea07 9
esokic 0:05aad811ea07 10 /** Use this singleton if you need to chain interrupt handlers.
esokic 0:05aad811ea07 11 *
esokic 0:05aad811ea07 12 * Example (for LPC1768):
esokic 0:05aad811ea07 13 * @code
esokic 0:05aad811ea07 14 * #include "InterruptManager.h"
esokic 0:05aad811ea07 15 * #include "mbed.h"
esokic 0:05aad811ea07 16 *
esokic 0:05aad811ea07 17 * Ticker flipper;
esokic 0:05aad811ea07 18 * DigitalOut led1(LED1);
esokic 0:05aad811ea07 19 * DigitalOut led2(LED2);
esokic 0:05aad811ea07 20 *
esokic 0:05aad811ea07 21 * void flip(void) {
esokic 0:05aad811ea07 22 * led1 = !led1;
esokic 0:05aad811ea07 23 * }
esokic 0:05aad811ea07 24 *
esokic 0:05aad811ea07 25 * void handler(void) {
esokic 0:05aad811ea07 26 * led2 = !led1;
esokic 0:05aad811ea07 27 * }
esokic 0:05aad811ea07 28 *
esokic 0:05aad811ea07 29 * int main() {
esokic 0:05aad811ea07 30 * led1 = led2 = 0;
esokic 0:05aad811ea07 31 * flipper.attach(&flip, 1.0);
esokic 0:05aad811ea07 32 * InterruptManager::get()->add_handler(handler, TIMER3_IRQn);
esokic 0:05aad811ea07 33 * }
esokic 0:05aad811ea07 34 * @endcode
esokic 0:05aad811ea07 35 */
esokic 0:05aad811ea07 36 class InterruptManager {
esokic 0:05aad811ea07 37 public:
esokic 0:05aad811ea07 38 /** Return the only instance of this class
esokic 0:05aad811ea07 39 */
esokic 0:05aad811ea07 40 static InterruptManager* get();
esokic 0:05aad811ea07 41
esokic 0:05aad811ea07 42 /** Destroy the current instance of the interrupt manager
esokic 0:05aad811ea07 43 */
esokic 0:05aad811ea07 44 static void destroy();
esokic 0:05aad811ea07 45
esokic 0:05aad811ea07 46 /** Add a handler for an interrupt at the end of the handler list
esokic 0:05aad811ea07 47 *
esokic 0:05aad811ea07 48 * @param function the handler to add
esokic 0:05aad811ea07 49 * @param irq interrupt number
esokic 0:05aad811ea07 50 *
esokic 0:05aad811ea07 51 * @returns
esokic 0:05aad811ea07 52 * The function object created for 'function'
esokic 0:05aad811ea07 53 */
esokic 0:05aad811ea07 54 pFunctionPointer_t add_handler(void (*function)(void), IRQn_Type irq) {
esokic 0:05aad811ea07 55 return add_common(function, irq);
esokic 0:05aad811ea07 56 }
esokic 0:05aad811ea07 57
esokic 0:05aad811ea07 58 /** Add a handler for an interrupt at the beginning of the handler list
esokic 0:05aad811ea07 59 *
esokic 0:05aad811ea07 60 * @param function the handler to add
esokic 0:05aad811ea07 61 * @param irq interrupt number
esokic 0:05aad811ea07 62 *
esokic 0:05aad811ea07 63 * @returns
esokic 0:05aad811ea07 64 * The function object created for 'function'
esokic 0:05aad811ea07 65 */
esokic 0:05aad811ea07 66 pFunctionPointer_t add_handler_front(void (*function)(void), IRQn_Type irq) {
esokic 0:05aad811ea07 67 return add_common(function, irq, true);
esokic 0:05aad811ea07 68 }
esokic 0:05aad811ea07 69
esokic 0:05aad811ea07 70 /** Add a handler for an interrupt at the end of the handler list
esokic 0:05aad811ea07 71 *
esokic 0:05aad811ea07 72 * @param tptr pointer to the object that has the handler function
esokic 0:05aad811ea07 73 * @param mptr pointer to the actual handler function
esokic 0:05aad811ea07 74 * @param irq interrupt number
esokic 0:05aad811ea07 75 *
esokic 0:05aad811ea07 76 * @returns
esokic 0:05aad811ea07 77 * The function object created for 'tptr' and 'mptr'
esokic 0:05aad811ea07 78 */
esokic 0:05aad811ea07 79 template<typename T>
esokic 0:05aad811ea07 80 pFunctionPointer_t add_handler(T* tptr, void (T::*mptr)(void), IRQn_Type irq) {
esokic 0:05aad811ea07 81 return add_common(tptr, mptr, irq);
esokic 0:05aad811ea07 82 }
esokic 0:05aad811ea07 83
esokic 0:05aad811ea07 84 /** Add a handler for an interrupt at the beginning of the handler list
esokic 0:05aad811ea07 85 *
esokic 0:05aad811ea07 86 * @param tptr pointer to the object that has the handler function
esokic 0:05aad811ea07 87 * @param mptr pointer to the actual handler function
esokic 0:05aad811ea07 88 * @param irq interrupt number
esokic 0:05aad811ea07 89 *
esokic 0:05aad811ea07 90 * @returns
esokic 0:05aad811ea07 91 * The function object created for 'tptr' and 'mptr'
esokic 0:05aad811ea07 92 */
esokic 0:05aad811ea07 93 template<typename T>
esokic 0:05aad811ea07 94 pFunctionPointer_t add_handler_front(T* tptr, void (T::*mptr)(void), IRQn_Type irq) {
esokic 0:05aad811ea07 95 return add_common(tptr, mptr, irq, true);
esokic 0:05aad811ea07 96 }
esokic 0:05aad811ea07 97
esokic 0:05aad811ea07 98 /** Remove a handler from an interrupt
esokic 0:05aad811ea07 99 *
esokic 0:05aad811ea07 100 * @param handler the function object for the handler to remove
esokic 0:05aad811ea07 101 * @param irq the interrupt number
esokic 0:05aad811ea07 102 *
esokic 0:05aad811ea07 103 * @returns
esokic 0:05aad811ea07 104 * true if the handler was found and removed, false otherwise
esokic 0:05aad811ea07 105 */
esokic 0:05aad811ea07 106 bool remove_handler(pFunctionPointer_t handler, IRQn_Type irq);
esokic 0:05aad811ea07 107
esokic 0:05aad811ea07 108 private:
esokic 0:05aad811ea07 109 InterruptManager();
esokic 0:05aad811ea07 110 ~InterruptManager();
esokic 0:05aad811ea07 111
esokic 0:05aad811ea07 112 // We declare the copy contructor and the assignment operator, but we don't
esokic 0:05aad811ea07 113 // implement them. This way, if someone tries to copy/assign our instance,
esokic 0:05aad811ea07 114 // he will get an error at compile time.
esokic 0:05aad811ea07 115 InterruptManager(const InterruptManager&);
esokic 0:05aad811ea07 116 InterruptManager& operator =(const InterruptManager&);
esokic 0:05aad811ea07 117
esokic 0:05aad811ea07 118 template<typename T>
esokic 0:05aad811ea07 119 pFunctionPointer_t add_common(T *tptr, void (T::*mptr)(void), IRQn_Type irq, bool front=false) {
esokic 0:05aad811ea07 120 int irq_pos = get_irq_index(irq);
esokic 0:05aad811ea07 121 bool change = must_replace_vector(irq);
esokic 0:05aad811ea07 122
esokic 0:05aad811ea07 123 pFunctionPointer_t pf = front ? _chains[irq_pos]->add_front(tptr, mptr) : _chains[irq_pos]->add(tptr, mptr);
esokic 0:05aad811ea07 124 if (change)
esokic 0:05aad811ea07 125 NVIC_SetVector(irq, (uint32_t)&InterruptManager::static_irq_helper);
esokic 0:05aad811ea07 126 return pf;
esokic 0:05aad811ea07 127 }
esokic 0:05aad811ea07 128
esokic 0:05aad811ea07 129 pFunctionPointer_t add_common(void (*function)(void), IRQn_Type irq, bool front=false);
esokic 0:05aad811ea07 130 bool must_replace_vector(IRQn_Type irq);
esokic 0:05aad811ea07 131 int get_irq_index(IRQn_Type irq);
esokic 0:05aad811ea07 132 void irq_helper();
esokic 0:05aad811ea07 133 void add_helper(void (*function)(void), IRQn_Type irq, bool front=false);
esokic 0:05aad811ea07 134 static void static_irq_helper();
esokic 0:05aad811ea07 135
esokic 0:05aad811ea07 136 CallChain* _chains[NVIC_NUM_VECTORS];
esokic 0:05aad811ea07 137 static InterruptManager* _instance;
esokic 0:05aad811ea07 138 };
esokic 0:05aad811ea07 139
esokic 0:05aad811ea07 140 } // namespace mbed
esokic 0:05aad811ea07 141
esokic 0:05aad811ea07 142 #endif
esokic 0:05aad811ea07 143