Merge pull request #9245 from kjbracey-arm/lorawan_atomic_flag

LoRAWAN: volatile bool -> atomic_flag
pull/9427/head
Martin Kojtal 2019-01-16 09:31:29 +01:00 committed by GitHub
commit 51a8c39088
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 17 additions and 8 deletions

View File

@ -35,6 +35,7 @@ set(unittest-test-sources
stubs/LoRaPHY_stub.cpp stubs/LoRaPHY_stub.cpp
stubs/LoRaMac_stub.cpp stubs/LoRaMac_stub.cpp
stubs/mbed_assert_stub.c stubs/mbed_assert_stub.c
stubs/mbed_critical_stub.c
stubs/LoRaMacCrypto_stub.cpp stubs/LoRaMacCrypto_stub.cpp
stubs/LoRaMacChannelPlan_stub.cpp stubs/LoRaMacChannelPlan_stub.cpp
stubs/LoRaWANTimer_stub.cpp stubs/LoRaWANTimer_stub.cpp

View File

@ -39,7 +39,6 @@ LoRaWANStack::LoRaWANStack()
_app_port(12), _app_port(12),
_link_check_requested(false), _link_check_requested(false),
_automatic_uplink_ongoing(false), _automatic_uplink_ongoing(false),
_ready_for_rx(true),
_queue(NULL) _queue(NULL)
{ {
} }

View File

@ -49,6 +49,15 @@ void core_util_critical_section_exit(void)
{ {
} }
bool core_util_atomic_flag_test_and_set(volatile core_util_atomic_flag *flagPtr)
{
return false;
}
void core_util_atomic_flag_clear(volatile core_util_atomic_flag *flagPtr)
{
}
bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue) bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue)
{ {
return false; return false;

View File

@ -73,11 +73,11 @@ LoRaWANStack::LoRaWANStack()
_app_port(INVALID_PORT), _app_port(INVALID_PORT),
_link_check_requested(false), _link_check_requested(false),
_automatic_uplink_ongoing(false), _automatic_uplink_ongoing(false),
_ready_for_rx(true),
_queue(NULL) _queue(NULL)
{ {
_tx_metadata.stale = true; _tx_metadata.stale = true;
_rx_metadata.stale = true; _rx_metadata.stale = true;
core_util_atomic_flag_clear(&_rx_payload_in_use);
#ifdef MBED_CONF_LORA_APP_PORT #ifdef MBED_CONF_LORA_APP_PORT
if (is_port_valid(MBED_CONF_LORA_APP_PORT)) { if (is_port_valid(MBED_CONF_LORA_APP_PORT)) {
@ -519,11 +519,10 @@ void LoRaWANStack::tx_interrupt_handler(void)
void LoRaWANStack::rx_interrupt_handler(const uint8_t *payload, uint16_t size, void LoRaWANStack::rx_interrupt_handler(const uint8_t *payload, uint16_t size,
int16_t rssi, int8_t snr) int16_t rssi, int8_t snr)
{ {
if (!_ready_for_rx || size > sizeof _rx_payload) { if (size > sizeof _rx_payload || core_util_atomic_flag_test_and_set(&_rx_payload_in_use)) {
return; return;
} }
_ready_for_rx = false;
memcpy(_rx_payload, payload, size); memcpy(_rx_payload, payload, size);
const uint8_t *ptr = _rx_payload; const uint8_t *ptr = _rx_payload;
@ -709,13 +708,13 @@ void LoRaWANStack::process_reception(const uint8_t *const payload, uint16_t size
mlme_confirm_handler(); mlme_confirm_handler();
if (_loramac.get_mlme_confirmation()->req_type == MLME_JOIN) { if (_loramac.get_mlme_confirmation()->req_type == MLME_JOIN) {
_ready_for_rx = true; core_util_atomic_flag_clear(&_rx_payload_in_use);
return; return;
} }
} }
if (!_loramac.nwk_joined()) { if (!_loramac.nwk_joined()) {
_ready_for_rx = true; core_util_atomic_flag_clear(&_rx_payload_in_use);
return; return;
} }
@ -744,7 +743,7 @@ void LoRaWANStack::process_reception(const uint8_t *const payload, uint16_t size
mlme_indication_handler(); mlme_indication_handler();
} }
_ready_for_rx = true; core_util_atomic_flag_clear(&_rx_payload_in_use);
} }
void LoRaWANStack::process_reception_timeout(bool is_timeout) void LoRaWANStack::process_reception_timeout(bool is_timeout)

View File

@ -42,6 +42,7 @@
#include <stdint.h> #include <stdint.h>
#include "events/EventQueue.h" #include "events/EventQueue.h"
#include "platform/mbed_critical.h"
#include "platform/Callback.h" #include "platform/Callback.h"
#include "platform/NonCopyable.h" #include "platform/NonCopyable.h"
#include "platform/ScopedLock.h" #include "platform/ScopedLock.h"
@ -504,7 +505,7 @@ private:
uint8_t _app_port; uint8_t _app_port;
bool _link_check_requested; bool _link_check_requested;
bool _automatic_uplink_ongoing; bool _automatic_uplink_ongoing;
volatile bool _ready_for_rx; core_util_atomic_flag _rx_payload_in_use;
uint8_t _rx_payload[LORAMAC_PHY_MAXPAYLOAD]; uint8_t _rx_payload[LORAMAC_PHY_MAXPAYLOAD];
events::EventQueue *_queue; events::EventQueue *_queue;
lorawan_time_t _tx_timestamp; lorawan_time_t _tx_timestamp;