From ce2cc57bf1c13ef09e41f34497c8c4703e9c8be1 Mon Sep 17 00:00:00 2001 From: Joe Finney Date: Thu, 8 Oct 2015 23:49:14 +0100 Subject: [PATCH] microbit: Optimisation of internal Message Bus listeners All message bus listeners with the micro:bit runtie are non blocking, and safe to be called in an interrupt context. As such, these have now all been declared MESSAGE_BUS_LISTENER_IMMEDIATE which should mitigate all unbounded event queueing effects. --- inc/MicroBitListener.h | 2 ++ source/MicroBitFiber.cpp | 2 +- source/MicroBitMultiButton.cpp | 4 ++-- source/ble-services/MicroBitAccelerometerService.cpp | 2 +- source/ble-services/MicroBitButtonService.cpp | 4 ++-- source/ble-services/MicroBitEventService.cpp | 2 +- source/ble-services/MicroBitMagnetometerService.cpp | 2 +- source/ble-services/MicroBitTemperatureService.cpp | 2 +- 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/inc/MicroBitListener.h b/inc/MicroBitListener.h index 46f2939..af7bf22 100644 --- a/inc/MicroBitListener.h +++ b/inc/MicroBitListener.h @@ -14,6 +14,8 @@ #define MESSAGE_BUS_LISTENER_DROP_IF_BUSY 0x0020 #define MESSAGE_BUS_LISTENER_NONBLOCKING 0x0040 #define MESSAGE_BUS_LISTENER_URGENT 0x0080 +#define MESSAGE_BUS_LISTENER_IMMEDIATE (MESSAGE_BUS_LISTENER_NONBLOCKING | MESSAGE_BUS_LISTENER_URGENT) + struct MicroBitListener { diff --git a/source/MicroBitFiber.cpp b/source/MicroBitFiber.cpp index 67b3351..3c41084 100644 --- a/source/MicroBitFiber.cpp +++ b/source/MicroBitFiber.cpp @@ -310,7 +310,7 @@ void fiber_wait_for_event(uint16_t id, uint16_t value) queue_fiber(f, &waitQueue); // Register to receive this event, so we can wake up the fiber when it happens. - uBit.MessageBus.listen(id, value, scheduler_event, MESSAGE_BUS_LISTENER_NONBLOCKING); + uBit.MessageBus.listen(id, value, scheduler_event, MESSAGE_BUS_LISTENER_IMMEDIATE); // Finally, enter the scheduler. schedule(); diff --git a/source/MicroBitMultiButton.cpp b/source/MicroBitMultiButton.cpp index b37bbb5..f477756 100644 --- a/source/MicroBitMultiButton.cpp +++ b/source/MicroBitMultiButton.cpp @@ -35,8 +35,8 @@ MicroBitMultiButton::MicroBitMultiButton(uint16_t id, uint16_t button1, uint16_t this->button1 = button1; this->button2 = button2; - uBit.MessageBus.listen(button1, MICROBIT_EVT_ANY, onMultiButtonEvent); - uBit.MessageBus.listen(button2, MICROBIT_EVT_ANY, onMultiButtonEvent); + uBit.MessageBus.listen(button1, MICROBIT_EVT_ANY, onMultiButtonEvent, MESSAGE_BUS_LISTENER_IMMEDIATE); + uBit.MessageBus.listen(button2, MICROBIT_EVT_ANY, onMultiButtonEvent, MESSAGE_BUS_LISTENER_IMMEDIATE); } uint16_t MicroBitMultiButton::otherSubButton(uint16_t b) diff --git a/source/ble-services/MicroBitAccelerometerService.cpp b/source/ble-services/MicroBitAccelerometerService.cpp index ab76a8c..3ab777f 100644 --- a/source/ble-services/MicroBitAccelerometerService.cpp +++ b/source/ble-services/MicroBitAccelerometerService.cpp @@ -42,7 +42,7 @@ MicroBitAccelerometerService::MicroBitAccelerometerService(BLEDevice &_ble) : ble.gattServer().write(accelerometerPeriodCharacteristicHandle, (const uint8_t *)&accelerometerPeriodCharacteristicBuffer, sizeof(accelerometerPeriodCharacteristicBuffer)); ble.onDataWritten(this, &MicroBitAccelerometerService::onDataWritten); - uBit.MessageBus.listen(MICROBIT_ID_ACCELEROMETER, MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE, this, &MicroBitAccelerometerService::accelerometerUpdate, MESSAGE_BUS_LISTENER_NONBLOCKING | MESSAGE_BUS_LISTENER_URGENT); + uBit.MessageBus.listen(MICROBIT_ID_ACCELEROMETER, MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE, this, &MicroBitAccelerometerService::accelerometerUpdate, MESSAGE_BUS_LISTENER_IMMEDIATE); } /** diff --git a/source/ble-services/MicroBitButtonService.cpp b/source/ble-services/MicroBitButtonService.cpp index 459b7ac..e752298 100644 --- a/source/ble-services/MicroBitButtonService.cpp +++ b/source/ble-services/MicroBitButtonService.cpp @@ -39,8 +39,8 @@ MicroBitButtonService::MicroBitButtonService(BLEDevice &_ble) : ble.gattServer().write(buttonADataCharacteristicHandle,(uint8_t *)&buttonADataCharacteristicBuffer, sizeof(buttonADataCharacteristicBuffer)); ble.gattServer().write(buttonBDataCharacteristicHandle,(uint8_t *)&buttonBDataCharacteristicBuffer, sizeof(buttonBDataCharacteristicBuffer)); - uBit.MessageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, this, &MicroBitButtonService::buttonAUpdate, MESSAGE_BUS_LISTENER_NONBLOCKING | MESSAGE_BUS_LISTENER_URGENT); - uBit.MessageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, this, &MicroBitButtonService::buttonBUpdate, MESSAGE_BUS_LISTENER_NONBLOCKING | MESSAGE_BUS_LISTENER_URGENT); + uBit.MessageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, this, &MicroBitButtonService::buttonAUpdate, MESSAGE_BUS_LISTENER_IMMEDIATE); + uBit.MessageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, this, &MicroBitButtonService::buttonBUpdate, MESSAGE_BUS_LISTENER_IMMEDIATE); } diff --git a/source/ble-services/MicroBitEventService.cpp b/source/ble-services/MicroBitEventService.cpp index 6719d98..6f76f04 100644 --- a/source/ble-services/MicroBitEventService.cpp +++ b/source/ble-services/MicroBitEventService.cpp @@ -73,7 +73,7 @@ void MicroBitEventService::onDataWritten(const GattWriteCallbackParams *params) // Read and register for all the events given... while (len >= 4) { - uBit.MessageBus.listen(e->type, e->reason, this, &MicroBitEventService::onMicroBitEvent, MESSAGE_BUS_LISTENER_NONBLOCKING | MESSAGE_BUS_LISTENER_URGENT); + uBit.MessageBus.listen(e->type, e->reason, this, &MicroBitEventService::onMicroBitEvent, MESSAGE_BUS_LISTENER_IMMEDIATE); len-=4; e++; diff --git a/source/ble-services/MicroBitMagnetometerService.cpp b/source/ble-services/MicroBitMagnetometerService.cpp index 2af76e6..3bbf944 100644 --- a/source/ble-services/MicroBitMagnetometerService.cpp +++ b/source/ble-services/MicroBitMagnetometerService.cpp @@ -48,7 +48,7 @@ MicroBitMagnetometerService::MicroBitMagnetometerService(BLEDevice &_ble) : ble.gattServer().write(magnetometerPeriodCharacteristicHandle, (const uint8_t *)&magnetometerPeriodCharacteristicBuffer, sizeof(magnetometerPeriodCharacteristicBuffer)); ble.onDataWritten(this, &MicroBitMagnetometerService::onDataWritten); - uBit.MessageBus.listen(MICROBIT_ID_COMPASS, MICROBIT_COMPASS_EVT_DATA_UPDATE, this, &MicroBitMagnetometerService::magnetometerUpdate, MESSAGE_BUS_LISTENER_NONBLOCKING | MESSAGE_BUS_LISTENER_URGENT); + uBit.MessageBus.listen(MICROBIT_ID_COMPASS, MICROBIT_COMPASS_EVT_DATA_UPDATE, this, &MicroBitMagnetometerService::magnetometerUpdate); uBit.MessageBus.listen(MICROBIT_ID_COMPASS, MICROBIT_COMPASS_EVT_CONFIG_NEEDED, this, &MicroBitMagnetometerService::samplePeriodUpdateNeeded); } diff --git a/source/ble-services/MicroBitTemperatureService.cpp b/source/ble-services/MicroBitTemperatureService.cpp index c6be771..c1e7790 100644 --- a/source/ble-services/MicroBitTemperatureService.cpp +++ b/source/ble-services/MicroBitTemperatureService.cpp @@ -31,7 +31,7 @@ MicroBitTemperatureService::MicroBitTemperatureService(BLEDevice &_ble) : temperatureDataCharacteristicHandle = temperatureDataCharacteristic.getValueHandle(); ble.gattServer().write(temperatureDataCharacteristicHandle,(uint8_t *)&temperatureDataCharacteristicBuffer, sizeof(temperatureDataCharacteristicBuffer)); - uBit.MessageBus.listen(MICROBIT_ID_THERMOMETER, MICROBIT_THERMOMETER_EVT_UPDATE, this, &MicroBitTemperatureService::temperatureUpdate, MESSAGE_BUS_LISTENER_NONBLOCKING | MESSAGE_BUS_LISTENER_URGENT); + uBit.MessageBus.listen(MICROBIT_ID_THERMOMETER, MICROBIT_THERMOMETER_EVT_UPDATE, this, &MicroBitTemperatureService::temperatureUpdate, MESSAGE_BUS_LISTENER_IMMEDIATE); } /**