【FreeRTOS 信号量】互斥信号量

2023-10-30

互斥信号量与二值信号量类似
但是互斥信号量可以解决二值信号量出现的优先级翻转问题,解决办法就是优先级继承

普通互斥信号量创建及运行,参阅安富莱电子demo

/* 互斥信号量句柄 */
static SemaphoreHandle_t  xMutex = NULL;

static void vTaskTaskUserIF(void *pvParameters)
{
    while(1)
    {
    	/* 参数说明:信号量句柄,等待信号量可用的最大等待时间 */
   	 	/* 互斥信号量,xSemaphoreTake和xSemaphoreGive一定要成对的调用 */
		xSemaphoreTake(xMutex, portMAX_DELAY);					
		printf("vTaskTaskUserIF\r\n");
		/* 参数说明:信号量句柄 */
		xSemaphoreGive(xMutex);	
		vTaskDelay(20);
	}
}

static void vTaskLED(void *pvParameters)
{
	TickType_t xLastWakeTime;
	const TickType_t xFrequency = 200;

	/* 获取当前的系统时间 */
    xLastWakeTime = xTaskGetTickCount();
	
    while(1)
    {
       	/* 互斥信号量,xSemaphoreTake和xSemaphoreGive一定要成对的调用 */
		xSemaphoreTake(xMutex, portMAX_DELAY);
		printf("任务vTaskLED在运行\r\n");
		xSemaphoreGive(xMutex);
		/* vTaskDelayUntil是绝对延迟,vTaskDelay是相对延迟。*/
        vTaskDelayUntil(&xLastWakeTime, xFrequency);
    }
}
int main(void)
{
	/* 
	  在启动调度前,为了防止初始化STM32外设时有中断服务程序执行,这里禁止全局中断(除了NMI和HardFault)。
	  这样做的好处是:
	  1. 防止执行的中断服务程序中有FreeRTOS的API函数。
	  2. 保证系统正常启动,不受别的中断影响。
	  3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
	  在移植文件port.c中的函数prvStartFirstTask中会重新开启全局中断。通过指令cpsie i开启,__set_PRIMASK(1)
	  和cpsie i是等效的。
     */
	__set_PRIMASK(1);  
	
	/* 创建任务 ,具体创建任务参阅上一篇【FreeRTOS 任务】任务创建及运行 */
	AppTaskCreate();

	/* 创建互斥信号量 */
    xMutex = xSemaphoreCreateMutex();
	if(xMutex == NULL)
    {
        /* 没有创建成功,用户可以在这里加入创建失败的处理机制 */
    }
    
    /* 启动调度,开始执行任务 */
    vTaskStartScheduler();

	/* 
	  如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的
	  heap空间不足造成创建失败,此要加大FreeRTOSConfig.h文件中定义的heap大小:
	  #define configTOTAL_HEAP_SIZE	      ( ( size_t ) ( 17 * 1024 ) )
	*/
	while(1);
} 

STM32CubeMX 互斥信号量创建及运行

/* Private variables ---------------------------------------------------------*/
osMutexId	myMutexIdHandle = NULL;
/* USER CODE BEGIN PV */

/* USER CODE BEGIN 4 */
void MutexTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
	
	int32_t ret;
  for(;;)
  {
    	/* 参数说明:信号量句柄,等待信号量可用的最大等待时间 */
   	 	/* 互斥信号量,xSemaphoreTake和xSemaphoreGive一定要成对的调用 */
		ret = osMutexWait (myMutexIdHandle,osWaitForever);
		if(ret == osOK)
		{
			HAL_UART_Transmit(&huart1,"MutexTask osMutexRelease\r\n",strlen("MutexTask osMutexRelease\r\n"),1000);
		}
		/* 参数说明:信号量句柄 */
		osMutexRelease(myMutexIdHandle);
		osDelay(2000);
  }
  /* USER CODE END 5 */
}


void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
	int32_t ret;
  for(;;)
  {
      	/* 参数说明:信号量句柄,等待信号量可用的最大等待时间 */
   	 	/* 互斥信号量,xSemaphoreTake和xSemaphoreGive一定要成对的调用 */
		ret = osMutexWait (myMutexIdHandle,osWaitForever);
		if(ret == osOK)
		{
			HAL_UART_Transmit(&huart1,"StartDefaultTask\r\n",strlen("StartDefaultTask\r\n"),1000);	
		}
		/* 参数说明:信号量句柄 */
		osMutexRelease(myMutexIdHandle);
	  osDelay(500);	
  }
  /* USER CODE END 5 */
}
/* USER CODE END 4 */


int main(void)
{
  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
 
  /* 参数说明: 宏展开的的方式定义一个互斥信号量的结构体(名字可以自定义,无需声明)*/
  osMutexDef(myMutex);
  /* 参数说明: 使用宏展开的方式取定义好的互斥信号量结构体地址*/
  myMutexIdHandle = osMutexCreate(osMutex(myMutex));
 /* USER CODE END RTOS_MUTEX */
  
  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
	
  osThreadDef(defaultTask, StartDefaultTask, osPriorityLow, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  osThreadDef(MutexTask, MutexTask, osPriorityHigh, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(MutexTask), NULL);
  /* USER CODE END RTOS_THREADS */
  
  /* Start scheduler */
  osKernelStart();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【FreeRTOS 信号量】互斥信号量 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • FreeRTOS-内核控制函数

    FreeRTOS 内核控制函数 FreeRTOS中有一些内核函数 一般来说这些内核函数在应用层不会使用 但是内核控制函数是理解FreeRTOS中断的基础 接下来我们逐一分析这些内核函数 taskYIELD 该函数的作用是进行任务切换 这是一
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • FreeRTOS记录(九、一个裸机工程转FreeRTOS的实例)

    记录一下一个实际项目由裸机程序改成FreeRTOS 以前产品的平台还是C8051单片机上面的程序 硬件平台改成了STM32L051 同时使用STM32CubeMX生成的工程 使用FreeRTOS系统 EEPROM数据存储读取函数修改更新 2
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 视频生成: 基于Stable Diffusion的微调方法

    chatGPT带来了几个月的AIGC热度 文本图像生成模型大行其道 但AI在视频生成任务上尚没有较好的开源仓库 并受限于 缺那么几百块A100 的资源问题 大多数人无法展开视频生成的研究 好在目前有不少针对视频生成的相关paper 也有不少
  • python在with open()函数中,如何在文件名设置中引用变量

    用format 函数 name wz age 25 with open C Users 0 1 txt format name age w encoding utf 8 as f1 f1 write hellow world 则文件名为 w
  • C++ 模板函数、模板类:如果没有被使用就不会被实例化

    C 中如果一个模板函数没有使用过 那么其局部静态变量都不会被实例化 class A public A edward print A ctor template
  • 【2】浅析Vue组件

    组件的基本概念 Vue中有一个概念叫做组件化 就是把页面分成一个个小的部分 每个部分有自己的功能 且可以复用 最外层的组件即根组件 除此之外会有很多子组件 子组件分为两种 全局组件和局部组件 全局组件 用 Vue component 组件名
  • 基础学习——numpy与tensor张量的转换

    系列文章目录 Numpy学习 创建数组及常规操作 数组创建 切片 维度变换 索引 筛选 判断 广播 Tensor学习 创建张量及常规操作 创建 切片 索引 转换 维度变换 拼接 基础学习 numpy与tensor张量的转换 基础学习 关于l
  • 怎么用微信打开wifi连接到服务器,微信一键连wifi在哪里 微信一键连wifi怎么使用...

    类型 社交聊天大小 45 4M语言 中文 评分 5 0 标签 立即下载 微信这款软件使用可以不用流量了 这款软件推出了wifi一键连小程序 帮助用户走到哪里都有无线网 但是有很多伙伴不知道在哪里 怎么连接 想知道的伙伴可以在西西看看相关的教
  • fiddler设置网速模拟弱网络测试

    在测试过程中 经常会要求测试弱网络情况时的一些特殊情况 这时候IOS还好说 在开发者选项中调整网络模式即可 但android就只能通过别的方式了 这里整理了通过fiddler抓包工具来设置弱网模式 在fiddler可以设置自己想要的网速 或
  • CTF练题(3) jpg图片隐写 使用jphs05工具和stegslove

    题目一概述 解题过程 1 根据题目提示 判断为图片隐写 800度的眼镜 我理解为不同色通道下观看图片 由此打开stegslove分析该图片 2 点击右方向键调整不同的色通道 发现乱码隐约组成六个字 我好喜欢你 如图 可能这六个字为本题fla
  • java代码编译和运行在命令行中完成

    背景 集成开发环境用多了 最近想学一下 java 基础 用命令行来编译和运行一下 发现举步维艰 于是 创作这篇文章与大家共享 基础知识梳理 在写代码之前 我们先花点时间来了解一下 java 编译和运行的过程 如下图 里面涉及到 两个 命令符
  • CentOS安装PostgreSQL

    版本信息 CentOS版本 CentOS 7 x86 64 Minimal 1810 PostgreSQL版本 PostgreSQL 10 10 64 bit 第一部分 PostgresSQL的安装 1 安装rpm文件 yum instal
  • 华为云云耀云服务器L实例评测|轻松购买 快速使用 上云如此简单【详细版】

    华为云云耀云服务器L实例评测 轻松购买 快速使用 上云如此简单 详细版 轻量级云服务器 即开即用 轻松运维 开启简单上云第一步 文章目录 华为云云耀云服务器L实例评测 轻松购买 快速使用 上云如此简单 详细版 1 云耀云服务器介绍 2 购买
  • Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

    本篇文章聊聊 Stable Diffusion WebUI 中的核心组件 强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情 写在前面 本篇文章的主角是开源项目 TencentARC GFPGAN 和上一篇文章 Stable Diff
  • scrollview中使用recyclerview莫名自动上滑

    1 scrollview中加入 android descendantFocusability blocksDescendants 2 为scrollView中的根view加入android focusableInTouchMode true
  • USB详解

    转载自http blog 163 com zhsh email blog static 19786900200611259521640 usb作为一种串行接口 应用日益广泛 如同每个工程设计人员必须掌握I2C RS232这些接口一样 我们也
  • int最大值是多少

    int最大值 根据编译器类型不同而变化 具体如下 1 对于16位编译器 int占16位 2字节 int的最大值为32767 2 对于32位和64位编译器 int占32位 4字节 int的最大值为2147483647 java语言中 int最
  • SQL语句中case、when、then的使用

    使用语法为 select pro id AS id pro title AS title pro name AS name pro ltime AS ltime pro place AS place pro linkman AS linkm
  • 【100天精通Python】Day58:Python 数据分析_Pandas时间序列数据处理,创建和解析时间数据pd.to_datetime(),.loc[],resample() 用法示例

    目录 时间序列数据处理 1 解析日期和时间数据 2 创建时间索引 3 访问时间索引数据 3 1 按年 月 日等级别访问数据 loc 3 2 使用部分日期作为索引 loc loc 3 3 使用时间索引的属性 index 4 时间索引的切片 5
  • 51单片机入门教程(2)——实现流水灯

    51单片机入门教程 2 实现流水灯 一 搭建流水灯电路 二 流水灯程序 2 1 延时程序 2 2 延时函数 2 3 按字节寻址 2 4 逻辑移位 2 5 条件判断 一 搭建流水灯电路 在Proteus中搭建流水灯电路如图 二 流水灯程序 我
  • 为什么我这么累?

    本月十六日 我和媳妇喜爱的歌手姚贝娜去世了 你是个好歌手 真正的热爱音乐 希望你在天堂里面开心的唱歌 我是个参加工作不久的小程序员 过着家 地铁 公司三点一线的生活 每天早上七点二十出门 地铁上一个多小时 8点五十到公司 下午六点下班 一个
  • 【FreeRTOS 信号量】互斥信号量

    互斥信号量与二值信号量类似 但是互斥信号量可以解决二值信号量出现的优先级翻转问题 解决办法就是优先级继承 普通互斥信号量创建及运行 参阅安富莱电子demo 互斥信号量句柄 static SemaphoreHandle t xMutex NU