mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
Diff: drivers/InterruptManager.cpp
- Revision:
- 187:0387e8f68319
- Parent:
- 180:96ed750bd169
- Child:
- 189:f392fc9709a3
--- a/drivers/InterruptManager.cpp Fri Jun 22 16:45:37 2018 +0100 +++ b/drivers/InterruptManager.cpp Thu Sep 06 13:40:20 2018 +0100 @@ -32,12 +32,13 @@ typedef void (*pvoidf)(void); -InterruptManager* InterruptManager::_instance = (InterruptManager*)NULL; +InterruptManager *InterruptManager::_instance = (InterruptManager *)NULL; -InterruptManager* InterruptManager::get() { +InterruptManager *InterruptManager::get() +{ if (NULL == _instance) { - InterruptManager* temp = new InterruptManager(); + InterruptManager *temp = new InterruptManager(); // Atomically set _instance core_util_critical_section_enter(); @@ -55,28 +56,33 @@ return _instance; } -InterruptManager::InterruptManager() { +InterruptManager::InterruptManager() +{ // No mutex needed in constructor - memset(_chains, 0, NVIC_NUM_VECTORS * sizeof(CallChain*)); + memset(_chains, 0, NVIC_NUM_VECTORS * sizeof(CallChain *)); } -void InterruptManager::destroy() { +void InterruptManager::destroy() +{ // Not a good idea to call this unless NO interrupt at all // is under the control of the handler; otherwise, a system crash // is very likely to occur if (NULL != _instance) { delete _instance; - _instance = (InterruptManager*)NULL; + _instance = (InterruptManager *)NULL; } } -InterruptManager::~InterruptManager() { - for(int i = 0; i < NVIC_NUM_VECTORS; i++) - if (NULL != _chains[i]) +InterruptManager::~InterruptManager() +{ + for (int i = 0; i < NVIC_NUM_VECTORS; i++) + if (NULL != _chains[i]) { delete _chains[i]; + } } -bool InterruptManager::must_replace_vector(IRQn_Type irq) { +bool InterruptManager::must_replace_vector(IRQn_Type irq) +{ lock(); int ret = false; @@ -90,19 +96,22 @@ return ret; } -pFunctionPointer_t InterruptManager::add_common(void (*function)(void), IRQn_Type irq, bool front) { +pFunctionPointer_t InterruptManager::add_common(void (*function)(void), IRQn_Type irq, bool front) +{ lock(); int irq_pos = get_irq_index(irq); bool change = must_replace_vector(irq); pFunctionPointer_t pf = front ? _chains[irq_pos]->add_front(function) : _chains[irq_pos]->add(function); - if (change) + if (change) { NVIC_SetVector(irq, (uint32_t)&InterruptManager::static_irq_helper); + } unlock(); return pf; } -bool InterruptManager::remove_handler(pFunctionPointer_t handler, IRQn_Type irq) { +bool InterruptManager::remove_handler(pFunctionPointer_t handler, IRQn_Type irq) +{ int irq_pos = get_irq_index(irq); bool ret = false; @@ -117,24 +126,29 @@ return ret; } -void InterruptManager::irq_helper() { +void InterruptManager::irq_helper() +{ _chains[__get_IPSR()]->call(); } -int InterruptManager::get_irq_index(IRQn_Type irq) { +int InterruptManager::get_irq_index(IRQn_Type irq) +{ // Pure function - no lock needed return (int)irq + NVIC_USER_IRQ_OFFSET; } -void InterruptManager::static_irq_helper() { +void InterruptManager::static_irq_helper() +{ InterruptManager::get()->irq_helper(); } -void InterruptManager::lock() { +void InterruptManager::lock() +{ _mutex.lock(); } -void InterruptManager::unlock() { +void InterruptManager::unlock() +{ _mutex.unlock(); }