当前位置: 首页 > news >正文

FreeRTOS—互斥信号量

文章目录

  • 一、互斥信号量
    • 1.1.简介
    • 1.2.优先级继承
    • 1.3.注意事项
    • 1.4.互斥信号量相关的API函数
  • 二、实验
    • 2.1.实验设计
    • 2.2.软件设计

一、互斥信号量

1.1.简介

互斥信号量是一个拥有优先级继承的二值信号量,在同步的应用中二值信号量最适合,互斥信号量适用与需要互斥访问的应用中。

1.2.优先级继承

当一个互斥信号量正在被一个低优先级的任务持有时,如果此时有一个高优先级的任务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞,不过这个高优先级的任务会将低优先级任务的优先级提升至与自己相同的优先级。

1.3.注意事项

优先级继承不能完全的消除优先级翻转的问题,它只是尽可能的降低优先级翻转带来的影响;互斥信号量不能用于中断服务函数中,原因如下:

  • 互斥信号量有任务优先级继承的机制,但中断不是任务,没有任务优先级,所以互斥信号量只能用于任务中,不能用于中断服务函数
  • 中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态

1.4.互斥信号量相关的API函数

使用互斥信号量之前,先将宏configUSE_MUTEXES置一;它的使用流程:创建互斥信号量 - 获取信号量 - 释放信号量。

函数描述
xSemaphoreCreateMutex( )使用动态方法创建互斥信号量
xSemaphoreCreateMutexStatic( )使用静态方法创建互斥信号量

还需注意:创建互斥信号量时,会主动释放一次信号量;互斥信号量的释放和获取函数与二值信号量相同,只不过互斥信号量不支持中断中调用。

#define xSemaphoreCreateMutex()xQueueCreateMutex(queueQUEUE_TYPE_MUTEX)

下面表格是它的返回值:

返回值描述
NULL创建失败
其他值创建成功返回互斥信号量的句柄

二、实验

2.1.实验设计

本次实验设计四个任务,步骤与优先级翻转问题的文章一致,将创建二值信号量改为创建互斥信号量即可。

2.2.软件设计

在入口函数里创建互斥信号量并自动生成资源:

void freertos_demo(void)
{mutex_semphr_handle = xSemaphoreCreateMutex();if(mutex_semphr_handle != NULL){printf("二值信号量创建成功\r\n");}xTaskCreate((TaskFunction_t)    start_task,(char*)             "start_task",(uint16_t)          START_TASK_STACK_SIZE,(void*)             NULL,(UBaseType_t)       START_TASK_PRIO,(TaskHandle_t*)     &start_task_handler);vTaskStartScheduler();  		
}
void low_task(void *pvParameters)
{while(1){xSemaphoreTake(semphr_handle, portMAX_DELAY);	printf("低优先级任务获取信号量成功\r\n");printf("低优先级任务正在运行\r\n");delay_ms(5000);printf("低优先级任务释放信号量\r\n");xSemaphoreGive(semphr_handle);vTaskDelay(1000);}
}void middle_task(void *pvParameters)
{uint8_t i = 0;while(1){printf("中等任务运行:%d\r\n",++i);vTaskDelay(1000);}
}void high_task(void *pvParameters)
{while(1){xSemaphoreTake(semphr_handle, portMAX_DELAY);printf("高优先级任务获取信号量成功\r\n");printf("高优先级任务正在运行\r\n");delay_ms(1000);printf("高优先级任务释放信号量\r\n");xSemaphoreGive(semphr_handle);vTaskDelay(1000);}
}

下图是运行结果:

在这里插入图片描述

使用了互斥信号量,使得任务按规定优先级运行,创建互斥信号量之后,高优先级任务就会先一步获得信号量,接着运行至低优先级,低优先级任务获取信号量之后,进行 5s 的时间运行任务,这个时候低优先级任务的优先级高优先级任务的优先级一样,这时,高优先级的任务和中等优先级的任务一同进入就绪态,但是高优先级的任务它的优先级较高,因此,接下来就会先是运行高优先级的任务再按顺序到低优先级的任务。

http://www.dtcms.com/a/298628.html

相关文章:

  • Sweet Home 3D:一款免费的室内装修辅助设计软件
  • 【集合】JDK1.8 HashMap 底层数据结构深度解析
  • 第二章: 解密“潜在空间”:AI是如何“看见”并“记住”世界的?
  • 深入解析C语言三路快速排序算法
  • 动态规划:从入门到精通
  • 多品种小批量如何实现柔性排产?
  • 无感交互,创意飞扬:AI摄像头动捕赋能中小学AI人工智能实训室
  • Python Requests-HTML库详解:从入门到实战
  • 环境变量-进程概念(7)
  • 对自定义域和 GitHub 页面进行故障排除(Windows)
  • 批改作业小工具(一)-read report
  • InfluxDB Line Protocol 协议深度剖析(一)
  • 07 51单片机之定时器
  • 10BASE-T1S核心机制——PLCA参数详解
  • 关于AI编程的分析报告
  • 【通识】算法案例
  • 【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(10):ような复习
  • [科普] 快速傅里叶变换(FFT)和离散傅里叶变换(DFT)的差异
  • WordPress WPBookit插件任意文件上传漏洞(CVE-2025-6058)
  • 魔百和M401H_国科GK6323V100C_安卓9_不分地区免拆卡刷固件包
  • 一键搭建博客脚本LNMP(非编译)Wordpress
  • 【论文解读】MambaVision: A Hybrid Mamba-Transformer Vision Backbone
  • 深度学习入门(1)
  • 深度学习篇---剪裁缩放
  • 人工智能——插值方法、边缘填充、图像矫正、图像掩膜、ROI切割、图像添加水印、图像噪点消除
  • 微观低代码
  • ubuntu 多网络路由优先级问题
  • 3020雕刻机脱机自定义指令
  • SIP广播对讲系统:构建高效智能的语音通信网络