Skip to content

Commit 82e93af

Browse files
optimize performances
1 parent bd34a75 commit 82e93af

File tree

3 files changed

+55
-29
lines changed

3 files changed

+55
-29
lines changed

test/test_app/main/main.c

+10-18
Original file line numberDiff line numberDiff line change
@@ -146,16 +146,13 @@ TEST_CASE("sx127x_test_fsk_tx_variable_length", "[fsk]") {
146146
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_create(&tx_fixture_config, SX127x_MODULATION_FSK, &fixture));
147147
setup_gpio_interrupts((gpio_num_t) tx_fixture_config.dio1, fixture, GPIO_INTR_NEGEDGE);
148148
sx127x_tx_set_callback(tx_callback, fixture->device);
149-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture->device));
150-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
149+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture));
151150
xSemaphoreTake(fixture->tx_done, TIMEOUT);
152151
vTaskDelay(pdMS_TO_TICKS(50));
153-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_max_single_batch, sizeof(fsk_max_single_batch), fixture->device));
154-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
152+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_max_single_batch, sizeof(fsk_max_single_batch), fixture));
155153
xSemaphoreTake(fixture->tx_done, TIMEOUT);
156154
vTaskDelay(pdMS_TO_TICKS(50));
157-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_max_variable, sizeof(fsk_max_variable), fixture->device));
158-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
155+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_max_variable, sizeof(fsk_max_variable), fixture));
159156
xSemaphoreTake(fixture->tx_done, TIMEOUT);
160157
}
161158

@@ -191,8 +188,7 @@ TEST_CASE("sx127x_test_fsk_tx_fixed_small", "[fsk]") {
191188
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_set_packet_format(SX127X_FIXED, sizeof(fsk_small_message), fixture->device));
192189
setup_gpio_interrupts((gpio_num_t) tx_fixture_config.dio1, fixture, GPIO_INTR_NEGEDGE);
193190
sx127x_tx_set_callback(tx_callback, fixture->device);
194-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture->device));
195-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
191+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture));
196192
xSemaphoreTake(fixture->tx_done, TIMEOUT);
197193
}
198194

@@ -211,8 +207,7 @@ TEST_CASE("sx127x_test_fsk_tx_fixed_batch", "[fsk]") {
211207
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_set_packet_format(SX127X_FIXED, sizeof(fsk_max_single_batch_fixed), fixture->device));
212208
setup_gpio_interrupts((gpio_num_t) tx_fixture_config.dio1, fixture, GPIO_INTR_NEGEDGE);
213209
sx127x_tx_set_callback(tx_callback, fixture->device);
214-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_max_single_batch_fixed, sizeof(fsk_max_single_batch_fixed), fixture->device));
215-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
210+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_max_single_batch_fixed, sizeof(fsk_max_single_batch_fixed), fixture));
216211
xSemaphoreTake(fixture->tx_done, TIMEOUT);
217212
}
218213

@@ -240,9 +235,8 @@ TEST_CASE("sx127x_test_fsk_tx_fixed_max", "[fsk]") {
240235
for (int i = 0; i < FIXED_MAX_LENGTH; i++) {
241236
expected[i] = (i % 10);
242237
}
243-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(expected, FIXED_MAX_LENGTH, fixture->device));
238+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(expected, FIXED_MAX_LENGTH, fixture));
244239
free(expected);
245-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
246240
xSemaphoreTake(fixture->tx_done, TIMEOUT);
247241
}
248242

@@ -266,8 +260,7 @@ TEST_CASE("sx127x_test_fsk_tx_max_baud", "[fsk]") {
266260
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_set_fdev(100000.0, fixture->device));
267261
setup_gpio_interrupts((gpio_num_t) tx_fixture_config.dio1, fixture, GPIO_INTR_NEGEDGE);
268262
sx127x_tx_set_callback(tx_callback, fixture->device);
269-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture->device));
270-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
263+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture));
271264
xSemaphoreTake(fixture->tx_done, TIMEOUT);
272265
}
273266

@@ -289,8 +282,7 @@ TEST_CASE("sx127x_test_fsk_tx_filtered", "[fsk]") {
289282
if (i != 0) {
290283
vTaskDelay(pdMS_TO_TICKS(50));
291284
}
292-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission_with_address(fsk_small_message, sizeof(fsk_small_message), addresses[i], fixture->device));
293-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device));
285+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission_with_address(fsk_small_message, sizeof(fsk_small_message), addresses[i], fixture));
294286
xSemaphoreTake(fixture->tx_done, TIMEOUT);
295287
}
296288
}
@@ -401,11 +393,11 @@ TEST_CASE("sx127x_test_ook_tx_variable_length", "[ook]") {
401393
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_create(&tx_fixture_config, SX127x_MODULATION_OOK, &fixture));
402394
setup_gpio_interrupts((gpio_num_t) tx_fixture_config.dio1, fixture, GPIO_INTR_NEGEDGE);
403395
sx127x_tx_set_callback(tx_callback, fixture->device);
404-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture->device));
396+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_small_message, sizeof(fsk_small_message), fixture));
405397
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_OOK, fixture->device));
406398
xSemaphoreTake(fixture->tx_done, TIMEOUT);
407399
vTaskDelay(pdMS_TO_TICKS(50));
408-
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fsk_ook_tx_set_for_transmission(fsk_max_single_batch, sizeof(fsk_max_single_batch), fixture->device));
400+
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_fixture_fsk_ook_tx_set_for_transmission(fsk_max_single_batch, sizeof(fsk_max_single_batch), fixture));
409401
TEST_ASSERT_EQUAL_INT(SX127X_OK, sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_OOK, fixture->device));
410402
xSemaphoreTake(fixture->tx_done, TIMEOUT);
411403
}

test/test_app/main/sx127x_fixture.c

+40-11
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,22 @@
1717
} while (0)
1818

1919
static const char *TAG = "sx127x_test";
20-
static SemaphoreHandle_t xBinarySemaphore;
20+
const UBaseType_t xArrayIndex = 0;
2121

2222
void IRAM_ATTR handle_interrupt_fromisr(void *arg) {
23+
sx127x_fixture_t *fixture = (sx127x_fixture_t *) arg;
2324
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
24-
xSemaphoreGiveFromISR(xBinarySemaphore, &xHigherPriorityTaskWoken);
25-
if (xHigherPriorityTaskWoken == pdTRUE) {
26-
portYIELD_FROM_ISR();
27-
}
25+
vTaskNotifyGiveIndexedFromISR(fixture->handle_interrupt, xArrayIndex, &xHigherPriorityTaskWoken);
26+
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
2827
}
2928

3029
void handle_interrupt_task(void *arg) {
30+
sx127x_fixture_t *fixture = (sx127x_fixture_t *) arg;
3131
while (1) {
32-
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
33-
sx127x_handle_interrupt((sx127x *) arg);
32+
if (ulTaskNotifyTakeIndexed(xArrayIndex, pdTRUE, portMAX_DELAY) > 0) {
33+
xSemaphoreTake(fixture->xMutex, portMAX_DELAY);
34+
sx127x_handle_interrupt(fixture->device);
35+
xSemaphoreGive(fixture->xMutex);
3436
}
3537
}
3638
}
@@ -64,7 +66,7 @@ int sx127x_fixture_create_base(sx127x_fixture_config_t *config, sx127x_fixture_t
6466
.mode = 0};
6567
spi_device_handle_t spi_device;
6668
sx127x *device = malloc(sizeof(struct sx127x_t));
67-
if( device == NULL ) {
69+
if (device == NULL) {
6870
return -1;
6971
}
7072
ERROR_CHECK(spi_bus_add_device(HSPI_HOST, &dev_config, &spi_device));
@@ -144,14 +146,14 @@ int sx127x_fixture_create(sx127x_fixture_config_t *config, sx127x_modulation_t m
144146
return SX127X_ERR_INVALID_ARG;
145147
}
146148

147-
xBinarySemaphore = xSemaphoreCreateBinary();
148-
if (xBinarySemaphore == NULL) {
149+
result->xMutex = xSemaphoreCreateMutex();
150+
if (result->xMutex == NULL) {
149151
ESP_LOGE(TAG, "unable to create semaphore");
150152
sx127x_fixture_destroy(result);
151153
return SX127X_ERR_INVALID_ARG;
152154
}
153155

154-
BaseType_t task_code = xTaskCreatePinnedToCore(handle_interrupt_task, "handle interrupt", 8196, result->device, 2, &(result->handle_interrupt), xPortGetCoreID());
156+
BaseType_t task_code = xTaskCreatePinnedToCore(handle_interrupt_task, "handle interrupt", 8196, result, 2, &(result->handle_interrupt), xPortGetCoreID());
155157
if (task_code != pdPASS) {
156158
ESP_LOGE(TAG, "can't create task %d", task_code);
157159
sx127x_fixture_destroy(result);
@@ -166,6 +168,30 @@ int sx127x_fixture_create(sx127x_fixture_config_t *config, sx127x_modulation_t m
166168
return SX127X_OK;
167169
}
168170

171+
int sx127x_fixture_fsk_ook_tx_set_for_transmission(const uint8_t *data, uint16_t data_length, sx127x_fixture_t *fixture) {
172+
xSemaphoreTake(fixture->xMutex, portMAX_DELAY);
173+
int code = sx127x_fsk_ook_tx_set_for_transmission(data, data_length, fixture->device);
174+
if (code != SX127X_OK) {
175+
xSemaphoreGive(fixture->xMutex);
176+
return code;
177+
}
178+
code = sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device);
179+
xSemaphoreGive(fixture->xMutex);
180+
return code;
181+
}
182+
183+
int sx127x_fixture_fsk_ook_tx_set_for_transmission_with_address(const uint8_t *data, uint16_t data_length, uint8_t address_to, sx127x_fixture_t *fixture) {
184+
xSemaphoreTake(fixture->xMutex, portMAX_DELAY);
185+
int code = sx127x_fsk_ook_tx_set_for_transmission_with_address(data, data_length, address_to, fixture->device);
186+
if (code != SX127X_OK) {
187+
xSemaphoreGive(fixture->xMutex);
188+
return code;
189+
}
190+
code = sx127x_set_opmod(SX127x_MODE_TX, SX127x_MODULATION_FSK, fixture->device);
191+
xSemaphoreGive(fixture->xMutex);
192+
return code;
193+
}
194+
169195
void sx127x_fixture_destroy(sx127x_fixture_t *fixture) {
170196
if (fixture == NULL) {
171197
return;
@@ -188,5 +214,8 @@ void sx127x_fixture_destroy(sx127x_fixture_t *fixture) {
188214
if (fixture->rx_done != NULL) {
189215
vSemaphoreDelete(fixture->rx_done);
190216
}
217+
if (fixture->xMutex != NULL) {
218+
vSemaphoreDelete(fixture->xMutex);
219+
}
191220
free(fixture);
192221
}

test/test_app/main/sx127x_fixture.h

+5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ typedef struct {
2626
spi_device_handle_t spi_device;
2727
SemaphoreHandle_t tx_done;
2828
SemaphoreHandle_t rx_done;
29+
SemaphoreHandle_t xMutex;
2930

3031
TaskHandle_t handle_interrupt;
3132
uint8_t rx_data[2048];
@@ -36,6 +37,10 @@ int sx127x_fixture_create(sx127x_fixture_config_t *config, sx127x_modulation_t m
3637

3738
int sx127x_fixture_create_base(sx127x_fixture_config_t *config, sx127x_fixture_t **fixture);
3839

40+
int sx127x_fixture_fsk_ook_tx_set_for_transmission(const uint8_t *data, uint16_t data_length, sx127x_fixture_t *fixture);
41+
42+
int sx127x_fixture_fsk_ook_tx_set_for_transmission_with_address(const uint8_t *data, uint16_t data_length, uint8_t address_to, sx127x_fixture_t *fixture);
43+
3944
void sx127x_fixture_destroy(sx127x_fixture_t *fixture);
4045

4146
void setup_gpio_interrupts(gpio_num_t gpio, sx127x_fixture_t *fixture, gpio_int_type_t type);

0 commit comments

Comments
 (0)