
讯享网
当多个发送数据的任务函数向同一个消息队列缓冲区中发送数据,接收数据的任务函数从消息队列缓冲区中接收数据,那么这个模型其实就很有意义了。
#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("send fail\n"); } else {
printf("send done\n"); } 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("send fail\n"); } else {
printf("send done\n"); } vTaskDelay(1000 / portTICK_PERIOD_MS); } } void sendTask3(void *pvParam) {
QueueHandle_t QHandle; QHandle = (QueueHandle_t)pvParam; BaseType_t xStatus; int i = 333; while (1) {
xStatus = xQueueSend(QHandle, &i, 0); if (xStatus != pdPASS) {
printf("send fail\n"); } else {
printf("send done\n"); } vTaskDelay(1000 / portTICK_PERIOD_MS); } } void recTask(void *pvParam) {
QueueHandle_t QHandle; QHandle = (QueueHandle_t)pvParam; BaseType_t xStatus; int i; while (1) {
xStatus = xQueueReceive(QHandle, &i, portMAX_DELAY); if (xStatus != pdPASS) {
printf("rec fail\n"); } else {
printf("rec %d\n", i); } } } void app_main(void) {
QueueHandle_t QHandle; QHandle = xQueueCreate(5, sizeof(int)); if (QHandle != NULL) {
printf("create queue successfully\n"); xTaskCreate(sendTask1, "sendTask1", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask2, "sendTask2", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask3, "sendTask3", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(recTask, "recTask", 1024 * 5, (void *)QHandle, 2, NULL); } else {
printf("can not create queue\n"); } }
讯享网
创建三个发送数据的任务函数,具体的可以参考上一小节,发送数据的函数创建好后,再创建接收数据的函数。

讯享网xStatus = xQueueReceive(QHandle, &i, portMAX_DELAY);
xTaskCreate(sendTask1, "sendTask1", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask2, "sendTask2", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(sendTask3, "sendTask3", 1024 * 5, (void *)QHandle, 1, NULL); xTaskCreate(recTask, "recTask", 1024 * 5, (void *)QHandle, 2, NULL);
这里值得提一句的是,三个发送数据端可以赋予相同的优先级,也可以赋予不同的优先级,这是根据实际情况去调整的。对于接收数据端,要比三个数据端赋予的优先级还要大才可以,这也是为了保证当消息队列缓冲区中存放了数据,接收端的任务函数可以立即取出并进行处理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/52284.html