<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnESP32" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/LearnESP32" width="100%"></iframe>
说明
esp32里面跑的是freertos,如果需要传递数据需要使用内部的缓存管理.
代码
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" char data[10]="01234567"; static xQueueHandle xQueueHandle1 = NULL; //任务函数 static void function(void *pvParameters) { char datarecv[12]; while(1) { //如果缓存里面有数据;则取出数据(存储到datarecv); 无限期的等着(portMAX_DELAY),直到有数据 if(xQueueReceive(xQueueHandle1, &datarecv, portMAX_DELAY)) { printf("datarecv=%s\n", datarecv); fflush(stdout); } } } //任务函数 static void function_1(void *pvParameters) { while(1) { vTaskDelay(1000 / portTICK_PERIOD_MS);//延时约1000ms //向缓存管理中存储数据; 如果缓存不够,则等待(最长等待10ms); 存储失败返回 pdFALSE xQueueSend(xQueueHandle1, (void *) &data, 10/portTICK_PERIOD_MS); } } void app_main(void) { //初始化缓存管理,缓存数据的最大条数是5条,每条数据的长度是10字节 xQueueHandle1 = xQueueCreate(5, 10); xTaskCreate(function, "function", 2048, NULL, 10, NULL); xTaskCreate(function_1, "function_1", 2048, NULL, 11, NULL); }
注意
初始化缓存的时候设置的数据长度是10字节
往缓存里面存储数据的时候,内部就会拷贝10字节.
所以大家伙一定要记住:你设置了缓存时的每一条数据是多大小,那么每次往缓存里面放数据的时候,内部就会拷贝多大小的数据.
如果在中断里面发送数据需要使用下面的函数(在后面的gpio章节中使用了这个)
xQueueSendFromISR
xQueueSendFromISR 和 xQueueSend 函数前两个参数相同
xQueueSendFromISR 的最后一个参数可以写 null
最后一个参数用于保存是否有高优先级任务准备就绪。
如果函数执行完毕后,此参数的数值是pdTRUE,说明有高优先级任务要执行,否则没有
portBASE_TYPE xHigherPriorityTaskWoken;
xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken ){ /* 实际宏使用了特殊接口 */ 有高优先级别的任务要运行,可以在此切换任务. }
如果在中断里面接收数据需要使用下面的函数
xQueueSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken );