首页 > 其他分享 >FreeRTOS中的中断中能否使用互斥量

FreeRTOS中的中断中能否使用互斥量

时间:2023-12-24 11:00:40浏览次数:18  
标签:FreeRTOS 中断 互斥 CRITICAL include xMutex

在嵌入式系统中,实时操作系统(RTOS)是为了确保任务的实时性和协同工作而设计的。FreeRTOS作为一款流行的RTOS,提供了丰富的同步和通信机制,其中互斥量是一种用于保护共享资源的关键工具。然而,开发者在使用FreeRTOS时,经常会面临一个问题,即在中断中是否可以安全地使用互斥量。本文将深入讨论这一问题,并提供详细的代码演示,阐明正确的实践方法。

1. 互斥量的基本概念

互斥量是一种常用的同步机制,用于防止多个任务或中断同时访问共享资源,以避免数据不一致性问题。在FreeRTOS中,互斥量通过SemaphoreHandle_t类型来表示,使用xSemaphoreCreateMutex函数创建。

#include "FreeRTOS.h"
#include "semphr.h"

SemaphoreHandle_t xMutex;

void vMutexInit() {
    // 创建互斥量,初始值为1
    xMutex = xSemaphoreCreateMutex();
}

2. FreeRTOS中的中断

FreeRTOS允许中断与任务共享资源,并在资源访问时保持同步。在中断服务程序(ISR)中,有一些FreeRTOS API是允许使用的,例如xSemaphoreGiveFromISRxSemaphoreTakeFromISR

3. 中断中使用互斥量的问题

在中断中使用互斥量时,需要注意中断上下文和任务上下文之间的差异。中断上下文是在中断服务程序执行期间,而任务上下文是在任务执行期间。由于中断可能发生在任何时候,中断上下文中有一些限制,例如中断上下文中不能阻塞。

因此,直接在中断中使用互斥量可能导致系统的不可预测行为,甚至可能引发严重的错误。

4. 正确的中断中互斥量使用方法

为了在中断中使用互斥量,可以利用FreeRTOS提供的taskENTER_CRITICALtaskEXIT_CRITICAL宏。这两个宏用于禁用和启用调度器,并在这期间,中断是被禁用的,从而避免了使用互斥量时的阻塞问题。

#include "FreeRTOS.h"
#include "semphr.h"

SemaphoreHandle_t xMutex;

void vMutexInit() {
    // 创建互斥量,初始值为1
    xMutex = xSemaphoreCreateMutex();
}

void vExampleInterruptHandler() {
    // 禁用调度器,防止中断发生时任务切换
    taskENTER_CRITICAL();

    // 获取互斥量,防止多个中断同时访问共享资源
    if (xSemaphoreTakeFromISR(xMutex, NULL) == pdTRUE) {
        // 中断处理逻辑

        // 释放互斥量
        xSemaphoreGiveFromISR(xMutex, NULL);
    }

    // 启用调度器,允许中断发生时任务切换
    taskEXIT_CRITICAL();
}

5. 代码演示

以下是一个包含互斥量的FreeRTOS程序,并演示了在中断中使用互斥量的正确方法:

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

SemaphoreHandle_t xMutex;

void vMutexInit() {
    // 创建互斥量,初始值为1
    xMutex = xSemaphoreCreateMutex();
}

void vTask(void *pvParameters) {
    while (1) {
        // 获取互斥量,保护共享资源
        if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {
            // 临界区代码

            // 释放互斥量
            xSemaphoreGive(xMutex);
        }

        // 任务逻辑
    }
}

void vExampleInterruptHandler() {
    // 禁用调度器,防止中断发生时任务切换
    taskENTER_CRITICAL();

    // 获取互斥量,防止多个中断同时访问共享资源
    if (xSemaphoreTakeFromISR(xMutex, NULL) == pdTRUE) {
        // 中断处理逻辑

        // 释放互斥量
        xSemaphoreGiveFromISR(xMutex, NULL);
    }

    // 启用调度器,允许中断发生时任务切换
    taskEXIT_CRITICAL();
}

int main() {
    // 初始化互斥量
    vMutexInit();

    // 创建示例任务
    xTaskCreate(vTask, "Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    // 启动FreeRTOS调度器
    vTaskStartScheduler();

    // 正常情况下不会执行到这里
    return 0;
}

6. 总结

在FreeRTOS中,在中断中使用互斥量时需要谨慎。通过合理使用taskENTER_CRITICALtaskEXIT_CRITICAL宏,可以在中断中安全地使用互斥量,确保共享资源的同步和任务的实时性。希望本文的讨论和代码演示能够帮助开发者更好地理解FreeRTOS中中断和互斥量的协同工作方式。

标签:FreeRTOS,中断,互斥,CRITICAL,include,xMutex
From: https://blog.51cto.com/u_16193759/8954739

相关文章

  • xv6 磁盘中断流程和启动时调度流程
    本文讲述xv6中的一些细节流程,还有对之前文中遗留的问题做一些补充说明,主要有以下几个问题:一次完整的磁盘中断流程进入调度器后的详细流程sched函数中的条件判断scheduler函数中为什么要周期性关中断一次完整的磁盘流程此节讲述完整的磁盘读写流程,读写的流程总体差不多,这里以读......
  • 51 单片机【外部中断、定时器中断、回调函数】
    51单片机【外部中断、定时器中断、回调函数】​ 这里的外部中断类似监听器,时时刻刻监视某引脚的电平变化;这里的定时器中断类似于定时任务,可以定时执行某函数;这里将回调函数和中断结合起来,案例里有点设计模式的味道(忘了哪个了,也可能就是感觉,关于高层不能调用低层的解决),也有点函数......
  • [C++] 互斥锁(unique_lock、lock_guard)
    作者:丶布布......
  • FreeRTOS中的任务优先级划分策略
    FreeRTOS是一款广泛应用的实时操作系统,它采用任务优先级来调度不同任务的执行顺序。在多任务系统中,合理的任务优先级划分策略是确保系统稳定性和性能的关键之一。本文将深入探讨FreeRTOS中的任务优先级划分策略,以及通过详细的代码演示展示如何灵活地配置任务的优先级。1.任务优先......
  • 通用定时器及定时器中断实验
    定时器:顾名思义是用来定时的一个外设。stm32有八个定时器,分三类计数器计数模式又分为三种:向上,向下,向上/下计数。向上:计数器从零计数到自动加载值,然后重新从零开始并产生一个计数器溢出事件。向下:计数器从自动加载值计数到零,然后重新从自动加载值开始并产生一个计数器溢出事件......
  • [香橙派开发系列]中断?不!中断!
    目录前言一、什么是中断二、普通单片机和系统单片机的区别三、中断的区别四、配置香橙派的中断1.进程版2.wiringPi库函数版3.线程版3.1Linux内核的线程总结前言中断这个在很多单片机中都是比较常见的,像什么51单片机,stm32单片机都是可以通过自己的设置来实现中断的。在香橙派这......
  • 4.进程同步与互斥
    生产者消费者问题一组生产者进程和一组消费者进程共享一个初始为空,大小为n的缓冲区。当缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待,只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或一个消费者从中取出消息。......
  • RTSP流媒体视频平台LiteNVR播放HLS流,出现中断且无法自动恢复的原因排查
    有用户反映,在使用安防视频LiteNVR平台时,取平台分发的hls地址在移动端播放一段时间就会停止,且无法自动恢复播放。今天我们来介绍下该问题的排查与解决方法。LiteNVR是基于RTSP/Onvif协议推出的安防视频监控管理平台,它可实现设备接入、实时直播、录像、检索与回放、存储、视频分发......
  • FreeRTOS中信号量和互斥量背后的原理
    FreeRTOS是一个流行的嵌入式实时操作系统,提供了信号量和互斥量等同步机制来协调任务之间的访问共享资源。本文将深入探讨FreeRTOS中信号量和互斥量的背后原理,以及如何使用这些机制确保系统的稳定性和性能。1.信号量和互斥量的概念1.1信号量信号量是一种计数器,用于控制多个任务对......
  • 最高法--票据权利时效均系可中断时间,对票据时效起诉后再撤诉也应当视为中断。
    1.(2022)最高法民申727号  陕西能源凉水井矿业有限责任公司、陕西华山创业有限公司等票据追索权纠纷民事申请再审审查民事裁定书申请人主张:凉水井公司、华山创业公司、陕西能源公司依据《中华人民共和国民事诉讼法》第二百零七条规定申请再审,请求:1.裁定中止本案原审判决执行;2.撤销......