STM32CubeMX学习笔记23---FreeRTOS(任务的挂起与恢复)

news2024/11/25 22:31:16

1、硬件设置

本实验通过freertos创建两个任务来分别控制LED2和LED3的亮灭,需要用到的硬件资源

  • LED2和LED3指示灯
  • 串口

2、STM32CubeMX设置

根据上一章的步骤创建两个任务:STM32CubeMX学习笔记22---FreeRTOS(任务创建和删除)-CSDN博客

在 Include parameters 中把 vTaskSuspend 和 vTaskResumeFromISR 选择 Enabled 使能。

 生成代码。

3、程序编程

(1)、单个任务挂起

osThreadSuspend

挂起指定任务。被挂起的任务绝不会得到 CPU 的使用权,不管该任务具有什么优先级。

函数osThreadSuspend (osThreadId thread_id)
参数thread_id: 挂起指定任务的任务ID
返回值错误码(osStatus )

 要想使用该函数必须在 Include parameters 中把 vTaskSuspend 选择 Enabled 来使能。

 例:

/*
* 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
* 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
* 这个句柄可以为 NULL。
*/
osThreadSuspend (LED2Handle);//挂起LED2
(2)、挂起全部任务

osThreadSuspendAll

函数osThreadSuspendAll (void)
参数
返回值错误码(osStatus )
(3)、单个任务恢复

osThreadResume

让挂起的任务重新进入就绪状态,恢复的任务会保留挂起前的状态信息,在恢复的时候根据挂起时的状态继续运行。如果被恢复任务在所有就绪态任务中,处于最高优先级列表的第一位,那么系统将进行任务上下文的切换。可用在中断服务程序中。

函数osThreadResume (osThreadId thread_id)
参数thread_id: 挂起指定任务的任务ID
返回值错误码(osStatus )

 要想在中断服务程序中使用该函数必须在 Include parameters 中把 vTaskResumeFromISR 选择 Enabled 来使能。

例:

osThreadResume (LED2Handle);//恢复LED2
(4)、全部任务恢复

osThreadResumeAll,将所有的任务都恢复。

函数osStatus osThreadResumeAll (void)
参数
返回值错误码

 osThreadResumeAll 函数的使用方法很简单,但是要注意,调用了多少次 osThreadSuspendAll() 函数就必须同样调用多少次 osThreadResumeAll() 函数。

void vDemoFunction( void )
{
    osThreadSuspendAll();
    /* 处理 xxx 代码 */
    osThreadSuspendAll();
    /* 处理 xxx 代码 */
    osThreadSuspendAll();
    /* 处理 xxx 代码 */
 
    osThreadResumeAll(); 
    osThreadResumeAll(); 
    osThreadResumeAll(); 
}
(5)、中断服务中恢复

使用 xTaskResumeFromISR()的时候有几个需要注意的地方:

  • 当函数的返回值为 pdTRUE 时:恢复运行的任务的优先级等于或高于正在运行的任务,表明在中断服务函数退出后必 须进行一次上下文切换 , 使用 portYIELD_FROM_ISR() 进行上下文切换。当函数的返回值为 pdFALSE 时:恢复运行的任务的优先级低于当前正在运行的任务,表明在中断服务函数退出后不需 要进行上下文切换。
  • xTaskResumeFromISR() 通常被认为是一个危险的函数,因为它的调用并非是固定的,中断可能随时来来临。所以 xTaskResumeFromISR()不能用于任务和中断间的同步,如果中断恰巧在任务被挂起之前到达,这就会导致一次中断丢失(任务还没有挂起,调用 xTaskResumeFromISR()函数是没有意义的,只能等下一次中断)。这种情况下,可以使用信号量或者任务通知来同步就可以避免这种情况。
void vAnExampleISR( void )
{
    BaseType_t xYieldRequired;

    /* 恢复被挂起的任务 */ 
    xYieldRequired = xTaskResumeFromISR( xHandle ); 

    if ( xYieldRequired == pdTRUE ) 
    { 
        /* 执行上下文切换, ISR 返回的时候将运行另外一个任务 */ 
        portYIELD_FROM_ISR(xYieldRequired ); 
    } 
}
(6)、获取任务状态

osThreadGetState,获取任务当前状态。

函数osThreadGetState(osThreadId thread_id)
参数thread_id: 任务ID
返回值以下值(osThreadState )
/* Thread state returned by osThreadGetState */
typedef enum {
	osThreadRunning   = 0x0,	      /*线程正在查询自身的状态,因此必须正在运行。*/
	osThreadReady     = 0x1 ,		  /* 正在查询的线程位于已读或挂起的就绪列表中。 */
	osThreadBlocked   = 0x2,		  /* 正在查询的线程处于阻止状态。 */
	osThreadSuspended = 0x3,	      /*被查询的线程处于“挂起”状态,或者处于“阻止”状态,超时时间无限长。 */
	osThreadDeleted   = 0x4,		  /* 正在查询的线程已被删除,但其TCB尚未释放。 */   
  osThreadError     = 0x7FFFFFFF
} osThreadState;
(7)、编写程序

在任务函数中编写程序,让LED1计数到10时挂起LED2,当计数到15时恢复LED2.

void LED1_Task1(void const * argument)
{
  /* USER CODE BEGIN LED1_Task1 */
  /* Infinite loop */
	int i=0;
  for(;;)
  {
		HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);   //LED1状态每500s翻转一次
		printf("this LED1 run %d\r\n",i);
		
		if(i++==10)
		{
			osThreadSuspend (LED2Handle);//挂起LED2
			printf("挂起LED2 \r\n");
		}
		
		if(i==15) 
		{
			printf("恢复LED2 \r\n");
			osThreadResume (LED2Handle);//恢复LED2
			
		}
    osDelay(1001);
  }
  /* USER CODE END LED1_Task1 */
}

/* USER CODE END Header_LED2_Task03 */
void LED2_Task03(void const * argument)
{
  /* USER CODE BEGIN LED2_Task03 */
  /* Infinite loop */
	    /* 用于保存上次时间。调用后系统自动更新 */ 
    static portTickType PreviousWakeTime; 
    /* 设置延时时间,将时间转为节拍数 */ 
    const portTickType TimeIncrement = pdMS_TO_TICKS(1000); 

    /* 获取当前系统时间 */ 
    PreviousWakeTime = osKernelSysTick();
	int i=0;
  for(;;)
  {
		 /* 调用绝对延时函数,任务时间间隔为 1000 个 tick */ 
    osDelayUntil( &PreviousWakeTime,TimeIncrement ); 
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);   //LED1状态每500s翻转一次
		printf("this LED2 run %d \r\n",i++);
   // osDelay(900);
  }
  /* USER CODE END LED2_Task03 */
}

4、下载验证

程序编译无误后下载到板子上,可以看到LED1计数到10时挂起LED2,当计数到15时恢复LED2。

注:在不同任务(任务优先级相同)中同时使用同一个中断会导致任务轮流使用该中断,如LED1和LED2都延时1000ms后同时使用printf,则会出现以下情况,即两个任务轮流使用printf,就导致了中间的遗漏了。(优先级不同则不会出现该情况)

5、参考文献

STM32CubeMX学习笔记(28)——FreeRTOS实时操作系统使用(任务管理)_stm32 rtos 任务固定时间运行-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1531141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XMind:让思维可视化,提升工作效率的利器

XMind是一款全球领先的开源思维导图和头脑风暴软件,它应用全球最先进的Eclipse RCP软件架构,拥有优秀的用户体验,凭借简单易用、功能强大的特点,在2013年被著名互联网媒体Lifehacker评选为全球最受欢迎的思维导图软件。目前&#…

小程序用什么SSL证书比较好?

小程序开发时为了实现HTTPS加密通信,可以选择以下几种类型的SSL证书: 1.域名验证型SSL证书 - DV证书是最基础的SSL证书类型,主要验证域名的所有权。对于个人开发者或小型企业的小程序,特别是展示类小程序或无需进行深度身份验证的…

可下载九大报纸种类的下载工具

今天给大家分享一个可以下载中国证券报,人民日报,农民日报,工人日报,江西日报,科技日报,NEWS,经济日报,解放军报,赣南日报的下载工具。 一、主要特点: 1.可以…

shardingsphere-elastic-job-ui 管理界面安装

shardingsphere-elasticjob 从 3.0.0-alpha 版本开始,将console管理界面单独拆分出来 下载前需要 安装 maven 配置环境变量 安装 nodejs 配置环境变量 下载ui源码,安装 官方并未直接提供可执行的二进制文件,需要下载源码编译,目前发行版 3.0.2 https://github.com/…

Docker使用(四)Docker常见问题分析和解决收集整理

Docker使用(四)Docker常见问题分析和解决收集整理 五、常见问题 1、 启动异常 【描述】: 【分析】:[rootlocalhost ~]# systemctl status docker 【解决】: (1)卸载后重新安装,不能解决这个问题。 …

日本370公告 各类材质餐具进出口检测 报告出具

食品接触材料指的是在正常使用过程中与食品进行接触的材料,涉及的产品包括:食品包装,餐具、厨具,食品加工机械,厨电产品等,但是由于其在生产过程中使用了一些化学原材料及化学助剂等,使得他们在…

Figure 公司推出首款集成 OpenAI 大模型的自主人形机器人,开启与人类全面对话的新纪元

2024年3月13日,Figure,一家在人工智能机器人领域引领创新的公司,宣布推出了一款革命性的自主人形机器人。这款全新的 demo 机器人不仅标志着商业上可行的自主人形机器人技术的突破,更是通过整合 OpenAI 的先进大模型技术&#xff…

Sora没体验资格?开源项目:Open-Sora,复现类Sora视频生成方案

项目简介 Open-Sora项目是一项高效制作高质量视频的工作,明确所有权使用其模型、工具和内容的计划。通过采用开源原则,Open-Sora 不仅实现了先进的视频生成技术的普及,还提供了一个专业且用户界面的方案,简化了视频制作的复杂性。…

【Web应用技术基础】HTML(3)——表格

目录 题目1:原始表格 题目2:width、height 题目3: cellpadding 题目4:cellspacing、cellpadding 题目5:caption 题目6:rowspan 题目7:colspan 题目8:汇总题 题目1&#xff1…

vue脚手架中,如何解决控制台打印不显示源代码对应的行数而是打包后的JS文件的行数?

直接上图说话: 原因: 当你在浏览器的控制台看到的错误行数是打包后的 JavaScript 文件的行数,而不是源代码的行数,这通常是因为你的项目没有配置或者没有正确配置 source map。 source map 是一个映射文件,它可以将打…

电脑屏幕监控软件下载(一键下载,终身使用)

很多企业都想要对员工进行电脑监控管理,方便了解员工工作状态如何。 但是,如何选择软件,以及下载方法,是很多人首先会考虑的问题。 对于监控软件来说,首先,我们需要明确电脑屏幕监控软件的重要性。 对于企…

MySQL日志的一些疑惑解答

1.两阶段提交,要是在binlog写入磁盘后,redolog还没处于commit状态,这时事务会回滚吗? 我们先来看一下崩溃恢复时的判断规则。 如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交&…

C语言例:(m=a==b)||(n=a==b);求解m,n的值

题目&#xff1a;设int a0,b0,m0,n0;执行语句(mab)||(nab);求解m,n的值。 #include<stdio.h> int main(void) {int a0,b0,m0,n0;(mab)||(nab);printf("m%d\n",m);printf("n%d\n",n);return 0; } 优先级: () 优先 优先 a b -->为真&am…

Linux--文件系统:数据的存储和组织之道

引言 文件系统是计算机操作系统中的重要组成部分&#xff0c;它负责管理计算机存储设备上的数据以及对数据进行组织和访问。一个高效可靠的文件系统对于系统性能和数据安全至关重要。 文件系统的基本概念 文件系统是操作系统中用于管理和存储文件的软件结构。它定义了如何在…

MT6825编码器在STM32中的使用

文章目录 1、PWM 绝对值位置读取功能1.1 DataSheet说明1.2 硬件支持1.3 Cubemax配置及使用1.4 项目代码实现1.5 效果验证1.6 注意事项 2、SPI 绝对值位置读取功能2.2 硬件支持2.3 Cubemax配置及使用2.4 项目代码实现 1、PWM 绝对值位置读取功能 1.1 DataSheet说明 1.2 硬件支持…

【计算机网络篇】物理层(4)信道的极限容量,信道复用技术

文章目录 &#x1f354;信道的极限容量&#x1f6f8;造成信号失真的主要因素⭐码元的传输速率 &#x1f6f8;奈氏准则&#x1f6f8;香农公式&#x1f388;练习 &#x1f5d2;️小结 &#x1f354;信道复用技术⭐常见的信道复用技术&#x1f388;频分复用FDM&#x1f388;时分复…

TouchGFX之性能测量

TouchGFX Core开放了几个信号&#xff0c;可用于测量性能。 当这些信号在内部触发时&#xff0c;用户可在应用程序中同步触发单个GPIO&#xff0c;从而实现“渲染时间”和其他有用信号的可视化。 信号在GPIO.hpp中定义 /* 用于操作GPIO的接口类&#xff0c;以便在目标硬件上进…

ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY

论文题目&#xff1a; ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY 发表会议&#xff1a;ICLR 2022 论文地址&#xff1a;https://openreview.net/pdf?idLzQQ89U1qm_ 论文代码&#xff1a;https://github.com/thuml/Anomaly-Transforme…

“惠才俊·暖同行”成都蓉北商圈“政策进楼宇”系列活动第二站

活动时间 2024年3月27日下午14:00活动地点 四川省成都市金牛区福堤路99号数媒大厦(5楼共享会议室)主办单位 成都蓉北商圈发展服务局 成都市金牛区新经济和科技局 成都树莓信息技术有限公司协办单位 蓉北人力资源服务产业园 主讲单位 蓉北商圈服务局、区新经济和科技局、国…

PyQt上手指南

文章目录 前言PyQt的好处从一个最简单的例子入手PyQt5基础组件体系源码结构 Qt Designer基础布局高级界面Web控件 多线程列表图形绘制PyQt5.QtGuiPyQtGraphmatplotlib和PyQt结合和mplfinance结合 工具使用打包链接 前言 用户界面开发&#xff0c;我搞过visual C MFC、Delphi V…