首页 > 其他分享 >FreeRTOS入门教程(同步与互斥)

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

时间:2023-10-04 18:32:01浏览次数:98  
标签:共享资源 同步 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):

特点:互斥锁是用于实现互斥访问的一种高级同步机制,通常用于多线程应用程序。 优点:提供了更高级别的互斥机制,可以防止资源的并发访问。 缺点:相对于信号量和二进制信号量,使用起来更复杂。

总结

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

标签:共享资源,同步,FreeRTOS,入门教程,信号量,互斥,任务,访问共享
From: https://blog.51cto.com/u_16153875/7705559

相关文章

  • FreeRTOS 原理 --- heap 堆内存的使用
    FreeRTOS一共提供了5种申请内存的方案heap1只申请不释放,内存利用率最高。申请出来的内存块,没有内存块头记录这个内存的大小,所以也无法释放,也正是没有内存块头,内存利用率高使用场景:不需要频繁申请内存heap2能申请能释放,不能合并内存块。每个内存块都有一个内存块头,有一个链表......
  • C++ thread 互斥操作
    ThreadMutexstd::mutex是C++11最基本的互斥量,该类的实例化对象提供了资源独占所有权的特性,用于保护共享数据免受多个线程同时访问的同步原语。Mutex用法头文件#include<mutex>类型std::mutex最基础的Mutex类std::recursive_mutex递归的Mutex类std......
  • Spring Boot 入门教程
    大家好,我是深码青年,作为一名迄今为止已经有四年码龄的人来说,springboot已经深入了自己的脑子里面,所以借此机会,我们来仔细说一说关于springboot2.0的那些事儿一、SpringBoot是什么以下截图自[SpringBoot官方文档](https://spring.io/projects/spring-boot"SpringBoot官方......
  • FreeRTOS 原理 --- 软件定时器
     简介 有一个定时器任务,任务内读队列。启动定时器,会向队列发送消息,定时器任务读到消息后把定时器回调函数等信息作为一个链表项插入链表。当链表有链表项,算出还剩多长时间执行定时器回调函数,这个时间作为定时器任务阻塞时间。所以定时器任务重新运行要么是时间到准备运行定时器......
  • FreeRTOS 原理 --- 任务通知
    简介任务通知核心包含是一个32位的无符号整数和一个8位的通知状态,这两个在任务控制块中,通知任务就是一个任务或者中断改写另外一个任务中的32位的无符号整数,改写这个整数的方式可以有所不同可以让这个整数加1,模拟信号量设置该整数的指定的某些位,模拟事件组直接选择覆盖或者不......
  • FreeRTOS 原理 --- 事件组
    简介信号量,队列。它们都具有一下特性:它们允许在阻塞态下等待单个事件的发送。它们在事件发送时可以取消阻塞的单个任务。事件组是FreeRTOS提供另一种事件传递的方法,它与队列和信号量的不同点:时间组允许任务在阻塞态下等待一个或多个事件。事件发生时,事件组将取消阻塞等待......
  • C++引用10分钟入门教程
    C++引用10分钟入门教程< C++引用C++引用在本质上是什么,它和指针到底有什么区别? > 我们知道,参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。对于像char、bool、int、float等基本类型的数据,它们占用的内......
  • 并发_管程(同步互斥)
               ......
  • FreeRTOS 原理 --- 任务调度机制
    任务的状态运行态就绪态阻塞态(被动让出CPU)挂起态(主动让出CPU)就绪链表就绪态,每个任务优先级对应一个链表,如下:PRIVILEGED_DATAstaticList_tpxReadyTasksLists[configMAX_PRIORITIES]={0};/*<Prioritisedreadytasks.*/ xPortPendSVHandler中断只会从高......
  • semaphore互斥失败导致出core
    先看堆栈(gdb)bt#0bnet_neigh_event_thread(dummy=dummy@entry=0x0)at/vob/jenkins/workspace/_build_8.8.3/sdk/src/customer_smm/l3.c:1303#10x0000000002172cb0inthread_boot(ti_void=0x1c99dc10)at/vob_yukon/xzhou_streams/smm_88x/sdk/src/sal/core/unix......