FreeRTOS的互斥锁(互斥信号量)使用
文章目录
- 互斥锁的作用
- 互斥锁的使用
- 需要引用的头文件
- 定义声明
- 创建
- 使用
互斥锁的作用
互斥锁(mutex)的作用是同步对共享资源的访问,确保在任意时刻只有一个线程可以访问共享资源,从而避免竞争条件(race condition)的发生。
具体来说,互斥锁有以下几个作用:
-
保护共享资源:当多个线程同时访问共享资源时,互斥锁可以确保只有一个线程可以访问该资源,避免出现数据不一致或错误的情况。
-
防止竞态条件:互斥锁可以用来解决竞态条件(race condition)的问题。竞态条件指的是当多个线程同时执行时,最终的结果取决于线程的执行顺序。通过使用互斥锁,可以防止竞态条件的发生,保证结果的可靠性。
-
实现线程互斥:互斥锁可以用来实现对共享资源的互斥访问,即同一时刻只有一个线程可以访问共享资源,其他线程需要等待互斥锁释放才能继续执行。
总的来说,互斥锁的作用是确保多个线程对共享资源的安全访问,避免出现数据竞争和不一致的情况。
互斥锁的使用
需要引用的头文件
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
定义声明
QueueHandle_t MutexSemaphore;
创建
在main函数中创建
MutexSemaphore = xSemaphoreCreateMutex();
使用
一般来说是为了解决资源争抢问题,所以用的情况是:
A要用B特有的资源,比如说数组、结构体,A用的时候B不能用,B用的时候A不能用
下面的这个例子就是page_update()内含cont_update(),而cont_update被另外一个线程调用的情况。
void test()
{xSemaphoreTake(MutexSemaphore, portMAX_DELAY); /* 获取互斥信号量 */cont_update();xSemaphoreGive(MutexSemaphore); /* 释放互斥信号量 */
}void task1()
{task1_init();while(1){xSemaphoreTake(MutexSemaphore, portMAX_DELAY); /* 获取互斥信号量 */page_update();xSemaphoreGive(MutexSemaphore); /* 释放互斥信号量 */}
}void task2()
{task2_init();while(1){...(省略若干函数逻辑)......test();...}
}