Skip to content

Commit bcaa8cb

Browse files
committed
Fix 2 for #5680, added guard for thread ID around os signalling
1 parent 9ebefcd commit bcaa8cb

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,16 @@ static void rf_device_unregister(void)
487487
}
488488
}
489489

490+
/*
491+
* \brief Function wraps thread signals to only send when thread is active
492+
*
493+
*/
494+
static void rf_thread_signal(osThreadId id, int32_t signal) {
495+
if (id != NULL) {
496+
osSignalSet(id, signal);
497+
}
498+
}
499+
490500
/*
491501
* \brief Function starts the CCA process before starting data transmission and copies the data to RF TX FIFO.
492502
*
@@ -899,7 +909,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
899909
*/
900910
case RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT:
901911
#ifdef MBED_CONF_RTOS_PRESENT
902-
osSignalSet(rf_thread_id, SL_RSSI_DONE);
912+
rf_thread_signal(rf_thread_id, SL_RSSI_DONE);
903913
#else
904914
SL_DEBUG_PRINT("RSSI done (%d)\n", RAIL_GetAverageRssi(gRailHandle));
905915
#endif
@@ -913,7 +923,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
913923
if(waiting_for_ack) {
914924
waiting_for_ack = false;
915925
#ifdef MBED_CONF_RTOS_PRESENT
916-
osSignalSet(rf_thread_id, SL_ACK_TIMEOUT);
926+
rf_thread_signal(rf_thread_id, SL_ACK_TIMEOUT);
917927
#else
918928
device_driver.phy_tx_done_cb( rf_radio_driver_id,
919929
current_tx_handle,
@@ -930,7 +940,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
930940
*/
931941
case RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT:
932942
#ifdef MBED_CONF_RTOS_PRESENT
933-
osSignalSet(rf_thread_id, SL_RXFIFO_ERR);
943+
rf_thread_signal(rf_thread_id, SL_RXFIFO_ERR);
934944
#else
935945
SL_DEBUG_PRINT("RX near full (%d)\n", RAIL_GetRxFifoBytesAvailable(gRailHandle));
936946
#endif
@@ -995,7 +1005,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
9951005
last_ack_pending_bit = (packetBuffer[2+1] & (1 << 4)) != 0;
9961006
/* Tell the stack we got an ACK */
9971007
#ifdef MBED_CONF_RTOS_PRESENT
998-
osSignalSet(rf_thread_id, SL_ACK_RECV | (last_ack_pending_bit ? SL_ACK_PEND : 0));
1008+
rf_thread_signal(rf_thread_id, SL_ACK_RECV | (last_ack_pending_bit ? SL_ACK_PEND : 0));
9991009
#else
10001010
SL_DEBUG_PRINT("rACK\n");
10011011
device_driver.phy_tx_done_cb( rf_radio_driver_id,
@@ -1023,10 +1033,10 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
10231033
if (((rx_queue_head + 1) % RF_QUEUE_SIZE) != rx_queue_tail) {
10241034
rx_queue[rx_queue_head] = (void*)packetBuffer;
10251035
rx_queue_head = (rx_queue_head + 1) % RF_QUEUE_SIZE;
1026-
osSignalSet(rf_thread_id, SL_RX_DONE);
1036+
rf_thread_signal(rf_thread_id, SL_RX_DONE);
10271037
} else {
10281038
free(packetBuffer);
1029-
osSignalSet(rf_thread_id, SL_QUEUE_FULL);
1039+
rf_thread_signal(rf_thread_id, SL_QUEUE_FULL);
10301040
}
10311041
#else
10321042
SL_DEBUG_PRINT("rPKT %d\n", rxPacket[2] - 2);
@@ -1117,7 +1127,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
11171127
*/
11181128
case RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT:
11191129
#ifdef MBED_CONF_RTOS_PRESENT
1120-
osSignalSet(rf_thread_id, SL_TXFIFO_ERR);
1130+
rf_thread_signal(rf_thread_id, SL_TXFIFO_ERR);
11211131
#else
11221132
SL_DEBUG_PRINT("TX near empty (%d)\n", spaceAvailable);
11231133
#endif
@@ -1131,7 +1141,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
11311141
*/
11321142
case RAIL_EVENT_TX_PACKET_SENT_SHIFT:
11331143
#ifdef MBED_CONF_RTOS_PRESENT
1134-
osSignalSet(rf_thread_id, SL_TX_DONE);
1144+
rf_thread_signal(rf_thread_id, SL_TX_DONE);
11351145
#else
11361146
if(device_driver.phy_tx_done_cb != NULL) {
11371147
device_driver.phy_tx_done_cb( rf_radio_driver_id,
@@ -1158,7 +1168,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
11581168
/* Occurs when a TX is aborted by the user */
11591169
case RAIL_EVENT_TX_ABORTED_SHIFT:
11601170
#ifdef MBED_CONF_RTOS_PRESENT
1161-
osSignalSet(rf_thread_id, SL_TX_TIMEOUT);
1171+
rf_thread_signal(rf_thread_id, SL_TX_TIMEOUT);
11621172
#else
11631173
device_driver.phy_tx_done_cb(rf_radio_driver_id,
11641174
current_tx_handle,
@@ -1175,7 +1185,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
11751185
/* Occurs when a TX is blocked by something like PTA or RHO */
11761186
case RAIL_EVENT_TX_BLOCKED_SHIFT:
11771187
#ifdef MBED_CONF_RTOS_PRESENT
1178-
osSignalSet(rf_thread_id, SL_TX_TIMEOUT);
1188+
rf_thread_signal(rf_thread_id, SL_TX_TIMEOUT);
11791189
#else
11801190
device_driver.phy_tx_done_cb(rf_radio_driver_id,
11811191
current_tx_handle,
@@ -1192,7 +1202,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
11921202
/* Occurs when the TX buffer underflows */
11931203
case RAIL_EVENT_TX_UNDERFLOW_SHIFT:
11941204
#ifdef MBED_CONF_RTOS_PRESENT
1195-
osSignalSet(rf_thread_id, SL_TX_TIMEOUT);
1205+
rf_thread_signal(rf_thread_id, SL_TX_TIMEOUT);
11961206
#else
11971207
device_driver.phy_tx_done_cb(rf_radio_driver_id,
11981208
current_tx_handle,
@@ -1212,7 +1222,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
12121222
/* Occurs when CCA/CSMA/LBT fails */
12131223
case RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT:
12141224
#ifdef MBED_CONF_RTOS_PRESENT
1215-
osSignalSet(rf_thread_id, SL_TX_TIMEOUT);
1225+
rf_thread_signal(rf_thread_id, SL_TX_TIMEOUT);
12161226
#else
12171227
device_driver.phy_tx_done_cb(rf_radio_driver_id,
12181228
current_tx_handle,
@@ -1252,7 +1262,7 @@ static void radioEventHandler(RAIL_Handle_t railHandle,
12521262
*/
12531263
case RAIL_EVENT_CAL_NEEDED_SHIFT:
12541264
#ifdef MBED_CONF_RTOS_PRESENT
1255-
osSignalSet(rf_thread_id, SL_CAL_REQ);
1265+
rf_thread_signal(rf_thread_id, SL_CAL_REQ);
12561266
#else
12571267
SL_DEBUG_PRINT("!!!! Calling for calibration\n");
12581268
#endif

0 commit comments

Comments
 (0)