[C] 纯文本查看 复制代码 #include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include"freertos/queue.h"
void SendTask1(void *pvParam){
QueueHandle_t QHandle;
QHandle = (QueueHandle_t)pvParam;
BaseType_t xStatus;
int i=111;
while (1){
xStatus = xQueueSend(QHandle, &i, 0);
if (xStatus != pdPASS)
{
printf("[Task1] Fail,Queue is FULL,Reset!.\n");
xQueueReset(QHandle);
}
else
{
printf("[Task1] Success,Have [ %d ] Loca.\n" ,uxQueueSpacesAvailable(QHandle));
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void SendTask2(void *pvParam){
QueueHandle_t QHandle;
QHandle = (QueueHandle_t)pvParam;
BaseType_t xStatus;
int i=222;
while (1){
xStatus = xQueueSend(QHandle, &i, 0);
if (xStatus != pdPASS)
{
printf("[Task2],Queue is FULL,Reset!.\n");
xQueueReset(QHandle);
}
else
{
printf("[Task2] Success Have [ %d ] Loca.\n" ,uxQueueSpacesAvailable(QHandle));
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void ReceiveTask(void *pvParam){
QueueHandle_t QHandle;
QHandle = (QueueHandle_t)pvParam;
BaseType_t xStatus;
int j = 0;
while (1)
{
xStatus = xQueueReceive(QHandle, &j, 0);
if (xStatus != pdPASS){
printf("Receive Fail.\n");
}
else{
printf("*******************************\n");
printf("Receive Success.i = <%d>.\n", j);
printf("队列可用消息 = %d.\n", uxQueueMessagesWaiting(QHandle));
printf("*******************************\n");
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void app_main(void)
{
QueueHandle_t QHandle;
QHandle = xQueueCreate(5, sizeof(int));
if (QHandle != NULL)
{
printf("Creat queue Successfully.\n");
xTaskCreate(SendTask1, "SendTask1", 1024 * 5, (void *)QHandle, 1, NULL);
xTaskCreate(SendTask2, "SendTask2", 1024 * 5, (void *)QHandle, 1, NULL);
xTaskCreate(ReceiveTask, "ReceiveTask", 1024 * 5, (void *)QHandle, 3, NULL);
}
else{
printf("Not Creat.\n");
}
}
/*TAsk1和TASk2公用一个队列,后创建的先运行,循环发送数据,待队列满进行重启,始终都是TASK1重启
*/
终端显示:
[Task2] Success Have [ 4 ] Loca.
[Task1] Success,Have [ 3 ] Loca.
*******************************
Receive Success.i = <222>.
队列可用消息 = 1.
*******************************
[Task2] Success Have [ 3 ] Loca.
[Task1] Success,Have [ 2 ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 2.
*******************************
[Task2] Success Have [ 2 ] Loca.
[Task1] Success,Have [ 1 ] Loca.
*******************************
Receive Success.i = <222>.
队列可用消息 = 3.
*******************************
[Task2] Success Have [ 1 ] Loca.
[Task1] Success,Have [ 0 ] Loca.
*******************************
Receive Success.i = <111>.
队列可用消息 = 4.
*******************************
[Task2] Success Have [ 0 ] Loca.
[Task1] Fail,Queue is FULL,Reset!.
Receive Fail.
问题描述:
两个Task往同一个队列传数据,接收函数接收到立即传出,并且接收函数优先级高于发送函数,为什么通过uxQueueSpaceAvaliable查询队列空间再减少。
FreeRTos不是接收数据后就销毁吗,如果空间不断减少,那对于大量数据的接收不是太浪费空间了吗。
初来论坛,问题描述可能不够精确,望海涵。
|