mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

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

Committer:
bogdanm
Date:
Wed Aug 07 16:43:59 2013 +0300
Revision:
15:4892fe388435
Child:
36:ab3ee77451e7
Added LPC4088 target and interrupt chaining code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 15:4892fe388435 1 #include "CallChain.h"
bogdanm 15:4892fe388435 2 #include "cmsis.h"
bogdanm 15:4892fe388435 3
bogdanm 15:4892fe388435 4 namespace mbed {
bogdanm 15:4892fe388435 5
bogdanm 15:4892fe388435 6 CallChain::CallChain(int size) : _size(size), _elements(0) {
bogdanm 15:4892fe388435 7 _chain = new pFunctionPointer_t[size]();
bogdanm 15:4892fe388435 8 }
bogdanm 15:4892fe388435 9
bogdanm 15:4892fe388435 10 CallChain::~CallChain() {
bogdanm 15:4892fe388435 11 clear();
bogdanm 15:4892fe388435 12 delete _chain;
bogdanm 15:4892fe388435 13 }
bogdanm 15:4892fe388435 14
bogdanm 15:4892fe388435 15 pFunctionPointer_t CallChain::add(void (*function)(void)) {
bogdanm 15:4892fe388435 16 return common_add(new FunctionPointer(function));
bogdanm 15:4892fe388435 17 }
bogdanm 15:4892fe388435 18
bogdanm 15:4892fe388435 19 pFunctionPointer_t CallChain::add_front(void (*function)(void)) {
bogdanm 15:4892fe388435 20 return common_add_front(new FunctionPointer(function));
bogdanm 15:4892fe388435 21 }
bogdanm 15:4892fe388435 22
bogdanm 15:4892fe388435 23 int CallChain::size() const {
bogdanm 15:4892fe388435 24 return _elements;
bogdanm 15:4892fe388435 25 }
bogdanm 15:4892fe388435 26
bogdanm 15:4892fe388435 27 pFunctionPointer_t CallChain::get(int i) const {
bogdanm 15:4892fe388435 28 if (i < 0 || i >= _elements)
bogdanm 15:4892fe388435 29 return NULL;
bogdanm 15:4892fe388435 30 return _chain[i];
bogdanm 15:4892fe388435 31 }
bogdanm 15:4892fe388435 32
bogdanm 15:4892fe388435 33 int CallChain::find(pFunctionPointer_t f) const {
bogdanm 15:4892fe388435 34 for (int i = 0; i < _elements; i++)
bogdanm 15:4892fe388435 35 if (f == _chain[i])
bogdanm 15:4892fe388435 36 return i;
bogdanm 15:4892fe388435 37 return -1;
bogdanm 15:4892fe388435 38 }
bogdanm 15:4892fe388435 39
bogdanm 15:4892fe388435 40 void CallChain::clear() {
bogdanm 15:4892fe388435 41 __disable_irq();
bogdanm 15:4892fe388435 42 for(int i = 0; i < _elements; i ++) {
bogdanm 15:4892fe388435 43 delete _chain[i];
bogdanm 15:4892fe388435 44 _chain[i] = NULL;
bogdanm 15:4892fe388435 45 }
bogdanm 15:4892fe388435 46 _elements = 0;
bogdanm 15:4892fe388435 47 __enable_irq();
bogdanm 15:4892fe388435 48 }
bogdanm 15:4892fe388435 49
bogdanm 15:4892fe388435 50 bool CallChain::remove(pFunctionPointer_t f) {
bogdanm 15:4892fe388435 51 int i;
bogdanm 15:4892fe388435 52
bogdanm 15:4892fe388435 53 if ((i = find(f)) == -1)
bogdanm 15:4892fe388435 54 return false;
bogdanm 15:4892fe388435 55 __disable_irq();
bogdanm 15:4892fe388435 56 if (i != _elements - 1)
bogdanm 15:4892fe388435 57 memmove(_chain + i, _chain + i + 1, (_elements - i - 1) * sizeof(pFunctionPointer_t));
bogdanm 15:4892fe388435 58 delete f;
bogdanm 15:4892fe388435 59 _elements --;
bogdanm 15:4892fe388435 60 __enable_irq();
bogdanm 15:4892fe388435 61 return true;
bogdanm 15:4892fe388435 62 }
bogdanm 15:4892fe388435 63
bogdanm 15:4892fe388435 64 void CallChain::call() {
bogdanm 15:4892fe388435 65 for(int i = 0; i < _elements; i++)
bogdanm 15:4892fe388435 66 _chain[i]->call();
bogdanm 15:4892fe388435 67 }
bogdanm 15:4892fe388435 68
bogdanm 15:4892fe388435 69 void CallChain::_check_size() {
bogdanm 15:4892fe388435 70 if (_elements < _size)
bogdanm 15:4892fe388435 71 return;
bogdanm 15:4892fe388435 72 __disable_irq();
bogdanm 15:4892fe388435 73 _size = (_size < 4) ? 4 : _size + 4;
bogdanm 15:4892fe388435 74 pFunctionPointer_t* new_chain = new pFunctionPointer_t[_size]();
bogdanm 15:4892fe388435 75 memcpy(new_chain, _chain, _elements * sizeof(pFunctionPointer_t));
bogdanm 15:4892fe388435 76 delete _chain;
bogdanm 15:4892fe388435 77 _chain = new_chain;
bogdanm 15:4892fe388435 78 __enable_irq();
bogdanm 15:4892fe388435 79 }
bogdanm 15:4892fe388435 80
bogdanm 15:4892fe388435 81 pFunctionPointer_t CallChain::common_add(pFunctionPointer_t pf) {
bogdanm 15:4892fe388435 82 _check_size();
bogdanm 15:4892fe388435 83 _chain[_elements] = pf;
bogdanm 15:4892fe388435 84 _elements ++;
bogdanm 15:4892fe388435 85 return pf;
bogdanm 15:4892fe388435 86 }
bogdanm 15:4892fe388435 87
bogdanm 15:4892fe388435 88 pFunctionPointer_t CallChain::common_add_front(pFunctionPointer_t pf) {
bogdanm 15:4892fe388435 89 _check_size();
bogdanm 15:4892fe388435 90 __disable_irq();
bogdanm 15:4892fe388435 91 memmove(_chain + 1, _chain, _elements * sizeof(pFunctionPointer_t));
bogdanm 15:4892fe388435 92 _chain[0] = pf;
bogdanm 15:4892fe388435 93 _elements ++;
bogdanm 15:4892fe388435 94 __enable_irq();
bogdanm 15:4892fe388435 95 return pf;
bogdanm 15:4892fe388435 96 }
bogdanm 15:4892fe388435 97
bogdanm 15:4892fe388435 98 } // namespace mbed