FreeRTOS入门教程(同步与互斥)

简介: FreeRTOS入门教程(同步与互斥)

前言

前几篇文章一直在围绕FreeRTOS中的任务创建,删除,优先级,调度算法进行讲解,那么从本篇文章开始将围绕同步与互斥来展开讲解。

一、同步与互斥概念

当多个任务或线程共享资源并发执行时,同步和互斥是两个关键的概念。

1.同步(Synchronization) 是指协调多个任务或线程的执行顺序和相互之间的行为,以确保它们按照一定的顺序、时机和约束进行执行。同步的目的是保证任务或线程之间的有序交互,使它们能够按照预期的顺序完成各自的操作或实现特定的约束条件。常见的同步场景包括等待其他任务完成、等待某个条件满足、协调任务之间的依赖关系等。

2.互斥(Mutual Exclusion) 是指限制共享资源在任何时刻只能被一个任务或线程访问的机制。当多个任务或线程需要访问共享资源时,互斥机制用于确保只有一个任务或线程可以进入临界区(即代码区段),并对共享资源进行操作。互斥的目的是避免竞争条件,保证共享资源的访问互不干扰,从而避免数据不一致性和冲突。

二、在FreeRTOS中如何实现同步和互斥

同步:

任务通信机制: FreeRTOS 提供了多种任务通信机制,如队列(Queue)、信号量(Semaphore)、事件组(Event Group)等,用于在任务之间进行同步和通信。这些通信机制可以实现任务的等待和唤醒,以及数据传递和共享。

队列(Queue): 任务可以通过队列在彼此之间发送消息或数据。任务可以阻塞等待队列中的消息,并在消息到达时被唤醒。

信号量(Semaphore): 信号量可以用于任务之间的同步,用于控制对共享资源的访问。任务在访问共享资源之前需要获取信号量,获取成功时可以访问资源,否则会阻塞等待信号量的释放。

事件标志组(Event Group): 事件标志组是一种用于任务同步的机制,它允许任务等待一组事件的发生。任务可以等待某个或某些事件发生,并在事件满足时被唤醒继续执行。

互斥:

在 FreeRTOS 中,互斥可以通过使用互斥锁(Mutex)来实现。互斥锁用于保护共享资源的访问,一次只允许一个任务获取互斥锁并访问共享资源,其他任务需要等待互斥锁的释放。

使用互斥锁的步骤如下:

创建互斥锁对象(xSemaphoreCreateMutex())。

获取互斥锁(xSemaphoreTake()):任务在访问共享资源前调用该函数来获取互斥锁。

访问共享资源:获取互斥锁后,任务可以访问共享资源。

释放互斥锁(xSemaphoreGive()):任务在访问共享资源完成后,释放互斥锁,使其他任务能够获取互斥锁并访问共享资源。

通过互斥锁的使用,可以确保一次只有一个任务能够访问共享资源,避免竞争条件和数据不一致性的问题。

综上所述,FreeRTOS 中的同步可以通过任务通信机制(如队列和信号量)和事件标志组来实现,用于任务之间的等待、唤醒和共享数据。而互斥可以通过使用互斥锁来保护共享资源的访问,确保一次只有一个任务能够修改共享资源。这些机制能够有效地处理并发执行和资源共享的问题。

三、同步和互斥各类方法对比

1.二进制信号量(Binary Semaphore):

特点:Binary Semaphore是一种轻量级的同步机制,只有两种状态,通常用于实现互斥或任务之间的通信。

优点:简单且高效,适用于简单的同步需求。

缺点:只能表示两种状态(信号量可用或不可用),不能用于计数或更复杂的同步需求。

2.计数信号量(Counting Semaphore):

特点:Counting Semaphore是一种可用于表示多个状态的信号量,通常用于资源管理和多生产者-多消费者问题。

优点:支持多个状态,适用于更复杂的同步和资源管理需求。

缺点:相对于二进制信号量来说,稍微复杂一些。

3.互斥信号量(Mutex Semaphore):

特点:Mutex Semaphore是一种特殊的二进制信号量,用于实现互斥,确保只有一个任务可以访问共享资源。

优点:提供了互斥访问的机制,可以防止竞态条件。

缺点:仅适用于互斥访问,不支持其他同步需求。

4.消息队列(Message Queue):

特点:消息队列允许任务之间通过发送和接收消息进行同步和通信。

优点:支持灵活的任务通信和同步,可以传递复杂的数据。

缺点:相对于信号量来说,实现起来可能稍微复杂一些。

5.事件组(Event Groups):

特点:事件组是一种用于任务之间事件同步的机制,允许任务等待和设置特定的事件标志。

优点:支持任务等待多个事件,提供了更灵活的同步选项。

缺点:相对于信号量来说,使用起来可能需要更多的代码。

6.互斥锁(Mutex):

特点:互斥锁是用于实现互斥访问的一种高级同步机制,通常用于多线程应用程序。

优点:提供了更高级别的互斥机制,可以防止资源的并发访问。

缺点:相对于信号量和二进制信号量,使用起来更复杂。

总结

本篇文章主要讲解了同步和互斥的基本概念。


相关文章
|
19天前
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)(3)
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)
35 0
|
19天前
|
C++ 调度
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)(2)
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)
33 0
|
19天前
|
算法 安全 调度
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)(1)
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)
30 0
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)(1)
|
19天前
|
缓存 算法 Java
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)(4)
操作系统(8)---进程的同步与互斥以及信号量机制(万字总结~)
33 0
|
20天前
|
消息中间件 调度
FreeRTOS入门教程(任务状态)
FreeRTOS入门教程(任务状态)
92 0
|
20天前
|
算法 调度
FreeRTOS入门教程(互斥锁的概念和函数使用)
FreeRTOS入门教程(互斥锁的概念和函数使用)
120 0
|
20天前
FreeRTOS入门教程(信号量的具体使用)
FreeRTOS入门教程(信号量的具体使用)
57 0
|
20天前
|
存储 Rust Linux
Linux驱动开发(同步与互斥)
Linux驱动开发(同步与互斥)
33 0
|
20天前
|
存储
FreeRTOS深入教程(信号量源码分析)
FreeRTOS深入教程(信号量源码分析)
81 0
|
20天前
|
存储 缓存 Linux
Linux驱动开发(锁和信号量的概念及实现原理)
Linux驱动开发(锁和信号量的概念及实现原理)
56 0

热门文章

最新文章