esp32里面跑的是freertos,如果需要传递数据需要使用内部的缓存管理.
任务间同步
RTOS中的同步,是指不同任务之间或者任务与外部事件之间的协同工作方式,确保多个并发执行的任务按照预期的顺序或时机执行。它设计到线程或任务间的通信和协调机制,目的是为了避免数据竞争、解决竞态条件,并确保系统的正确行为。
互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性。
![[Pasted image 20250518093926.png]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxltemSize );
BaseType_t xQueueSend( QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait );
BaseType_t xQueueSendToBack( QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait );
BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait );
BaseType_t xQueueSendFromISR( QueueHandle_t xQueue, const void * pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken );
|
实例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <stdio.h> #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "string.h"
QueueHandle_t queue_handle = NULL;
typedef struct { int value; } queue_data_t;
void TaskA(void * param) { queue_data_t data; while (1) { if(pdTRUE == xQueueReceive(queue_handle, &data, 100)) { ESP_LOGI("queue", "receive queue value: %d", data.value); } } }
void TaskB(void * param) { queue_data_t data; memset(&data, 0, sizeof(queue_data_t));
while (1) { xQueueSend(queue_handle, &data, 100);
vTaskDelay(pdMS_TO_TICKS(1000));
data.value++; } }
void app_main(void) { queue_handle = xQueueCreate(10, sizeof(queue_data_t));
xTaskCreatePinnedToCore(TaskA, "taskA", 2048, NULL, 3, NULL, 1);
xTaskCreatePinnedToCore(TaskB, "taskB", 2048, NULL, 3, NULL, 1); }
|
![[Pasted image 20250518104230.png]]