avatar

松果工作室

欢迎光临

  • 首页
  • freeRTOS
  • LVGL
  • ESP
  • 开发手册
  • 快速笔记
  • 个人收藏
  • 时事记录
  • 考察日志
  • 工具
Home 互斥锁(Mutex)
文章

互斥锁(Mutex)

Posted 2023-11-18 Updated 2023-12- 8
By YCP
5~7 min read

使用流程

  • 此时有一个变量,存在多个任务,各自会针对该变量进行长达 10ms / 15ms 的处理。
  • 给出一个互斥锁。
  • Task1:开锁->操作10ms->关锁
  • Task2:开锁->操作15ms->关锁
  • 在 Task1/2 关锁前 Task2/1 无法对变量进行操作,此时 Task2/1 会进行阻塞

代码示例

在代码中,使用了 vTaskDelay来模拟变量的处理花费的时间,而不是作为阻塞作用
因为互斥锁本身是有阻塞作用的

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"

SemaphoreHandle_t xMutex;
int sharedResource = 0;

void vTask1(void *pvParameters) {
    while(1) {
        if(xSemaphoreTake(xMutex, portMAX_DELAY)) {
            sharedResource++;
            vTaskDelay(10 / portTICK_PERIOD_MS);
            xSemaphoreGive(xMutex);
        }
    }
}

void vTask2(void *pvParameters) {
    while(1) {
        if(xSemaphoreTake(xMutex, portMAX_DELAY)) {
            sharedResource--;
            vTaskDelay(15 / portTICK_PERIOD_MS);
            xSemaphoreGive(xMutex);
        }
    }
}

void app_main() {
    xMutex = xSemaphoreCreateMutex();

    xTaskCreate(vTask1, "Task1", 2048, NULL, 2, NULL);
    xTaskCreate(vTask2, "Task2", 2048, NULL, 2, NULL);
}
重学 freeRTOS
freeRTOS
License:  CC BY 4.0
Share

Further Reading

May 9, 2024

freeRTOS 高精度定时任务

vTaskDelayUntil()能精确地在每 50ms 调用这个函数 void TASKF(void *ptr) { TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); while (1) { vTask

Dec 8, 2023

事件组(Event Group)

使用流程 创建事件组句柄 定义事件组标志位 Task1:事件组标志位置 1 Task2:创建等待事件组事件;检测事件组标志位是否置 1 注意事项 待补充,纯属一个 Flag。 代码示例 #include <FreeRTOS.h> #include <task.h> #

Dec 7, 2023

软件定时器(Software Timer)

使用流程 创建定时器句柄 启动定时器 注意事项 启动定时器后,延时一个周期再执行定时器回调,不会立刻执行。因此,当定时器句柄中的 pdTure 改成 pdFalse,这就是个延时任务。 延时任务执行一次之后,如果再次执行xTimerStart,会再次执行一次延时任务。 代码示例 #include "

OLDER

FreeRTOS 大纲

NEWER

CPP 面向对象大纲

Recently Updated

  • ESP32(十) BLE OTA
  • ESP32(九) BLE GATTS
  • LVGL(四) 动画
  • LVGL(三) 对象中创建对象
  • LVGL(二) 定时回调

Trending Tags

LVGL WCH Linux Elec freeRTOS STM ESP Flutter Others SwiftUI

Contents

©2025 松果工作室. Some rights reserved.

Using the Halo theme Chirpy