freertos不同任务间怎么传输数据

主要包括队列(Queue)、信号量(Semaphore)、互斥量(Mutex)、事件组(Event Groups)、和消息缓冲区(Message Buffer)等。

队列:传输数据

队列是 FreeRTOS 中最常用的任务间通信机制。它们用于在不同任务之间传递数据。队列具有先进先出(FIFO)的特性,即数据项按照它们被发送的顺序接收。

  • 用法:队列可以用于传递基本数据类型(如 intfloat 等)以及复杂的数据结构(如 struct)。
  • 创建队列:使用 xQueueCreate() 创建一个队列。
  • 发送数据:使用 xQueueSend()xQueueSendToBack()(将数据放到队列尾部)或 xQueueSendToFront()(将数据放到队列头部)发送数据。
  • 接收数据:使用 xQueueReceive() 从队列中接收数据。

例如:

QueueHandle_t xQueue;

void Task1(void *pvParameters) {
    int dataToSend = 100;
    xQueueSend(xQueue, &dataToSend, portMAX_DELAY);  // 发送数据到队列
    vTaskDelay(1000 / portTICK_PERIOD_MS);  // 任务延时
}

void Task2(void *pvParameters) {
    int receivedData;
    if (xQueueReceive(xQueue, &receivedData, portMAX_DELAY) == pdPASS) {  // 从队列接收数据
        printf("Received: %d\n", receivedData);
    }
}

int main() {
    xQueue = xQueueCreate(10, sizeof(int));  // 创建一个队列
    xTaskCreate(Task1, "Task1", 1000, NULL, 1, NULL);
    xTaskCreate(Task2, "Task2", 1000, NULL, 1, NULL);
    vTaskStartScheduler();  // 启动调度器
    return 0;
}

信号量

信号量用于任务间的同步,而不是数据传输。信号量可以用于防止多个任务同时访问共享资源(如临界区),从而避免数据竞争。

  • 二值信号量 (Binary Semaphore):用于简单的任务同步,比如两个任务之间的信号通知。
  • 计数信号量 (Counting Semaphore):用于实现多个资源的访问控制,比如多个任务访问同一个有限的共享资源。
  • 用法:使用 xSemaphoreGive() 释放信号量,xSemaphoreTake() 获取信号量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值