FreeRTOS 多任务系统——任务切换、任务管理方式心得

2023-05-16

目前在进行对使用FreeRTOS的项目的代码升级,之前采用的主逻辑任务切换模式:由一个任务来进行逻辑上为串行的不同功能切换,其他任务分别负责通信实时传输、传感器检测和电机控制,系统中断中采用变量传递参数而非二值信号量。

这个模式有两个问题:

(1)传感器的信号传递过于复杂:当一个传感器信号(如上升沿)到来时,改变传感器标志变量的值,然后等待任务轮询到该变量的改变,再改变任务中的逻辑步骤变量值,来使任务下一次轮询时进入下一步逻辑,且任务通过轮询来不断检测来自队列的逻辑执行命令。这样的机制会导致传感器信号传递的实时性降低。
(2)由于需要接收队列中的命令的同时还需要自动执行当前的逻辑步骤,任务设计就必须设计成轮询机制,这样无法利用阻塞机制来提高系统资源的利用率,还大大增加了任务设计的复杂性,出BUG概率大大增加,且修改BUG牵一发动全身的现象极其严重。

基于以上原因我决定重新设计任务切换、管理系统,以充分利用RTOS任务阻塞和二值信号量同步中断、任务的优点。

这个项目的特点是:

1.功能性任务不可同时运行
2.对传感器信号和串口通信实时性要求高
3.对电机的电流检测实时性要求高
4.每次执行功能性任务都要求从任务头开始执行,即使中途被其他功能性任务中断

基于以上特点,我决定采用添加/删除任务的方式来进行任务切换。
在串口接收任务中进行任务的创建,每个功能性任务都由以下结构组成,以系统初始化任务举例:

void InitTask(void const * argument)
{
  /* USER CODE BEGIN InitTask */
	PeriStatus.SystemStatue = TASK_Init;//记录任务类型用于状态上传
	HandleTemp = TaskInitHandle;//记录任务句柄
	if(PeriStatus.FeedRest != Motor_Init)MotorCtrl(FeedRestType, Motor_Reset);//电机1复位
	FLASH_EEPROM_Write();//写入FLASH
	RotateReset();//主执行机构复位
	if(PeriStatus.Hold != Motor_Init)MotorCtrl(HoldType, Motor_Reset);//电机2复位
	if(PeriStatus.Slide != Motor_Init)MotorCtrl(SlideType, Motor_Reset);//电机3复位
  /* Infinite loop */
  for(;;)
  {
	if((PeriStatus.Hold == Motor_Init)&&
	(PeriStatus.Slide == Motor_Init)&&
	(PeriStatus.Rotate == Motor_Init)&&
	(PeriStatus.FeedRest == Motor_Init)&&
	(PeriStatus.Feed == Motor_Init))//所有机构复位完成
	{
		PeriStatus.SystemStatue = TASK_Default;//清除当前任务类型
		HandleTemp = defaultTaskHandle;//任务句柄恢复为默认任务
		vTaskDelete(NULL);//删除当前任务
	}
    osDelay(50);
  }
  /* USER CODE END InitTask */
}

任务在执行完毕后会自行删除,如果中途串口接收任务想要创建别的功能性任务,只需利用HandleTemp储存的当前任务句柄将任务删除,再创建新的任务即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS 多任务系统——任务切换、任务管理方式心得 的相关文章

随机推荐

  • 一字节内的位序(bit)大端小端分析

    相信字节序 大端 小端的概念相关资料很多 xff0c 大家都比较清楚了 这里说明下一字节内部位序 xff08 bit xff09 的概念 在计算机中底层一个存储单元是字节 xff0c 因此你的指令寻址是不可能找到一字节内部的bit的 xff
  • RPLIDAR十分钟极速入门教程

    本教程由 臭皮匠机器人 原创 转载请注明出处 收到一个RPLidar后 xff0c 干的第一件事应该是先让雷达跑起来 xff0c 边做边学是最高效的 本教程 xff0c 将教你只用简单的三步 xff0c 花10分钟即可上手 本教程RPLid
  • RPLIDAR最强参数详解

    本教程由 臭皮匠机器人 原创 转载请注明出处 有的同学跟我们说 xff0c RPLIDAR的参数看不懂 xff0c 感觉理解起来困难 其实也不难懂的 xff0c 本篇将带你了解这些重要的指标 xff0c 给你讲清说透 由于RPLIDAR还在
  • 如何避免头文件被重复包含?

    在实际的工程中我们很有可能重复包含某一个头文件 xff0c 比如下面这种情况 xff1a 开发人员B和开发人员C在自己的头文件中都包含了开发人员A的头文件 xff0c 而开发人员D在自己的编译单元中包含了B和C的头文件 xff0c 此时D就
  • VScode配置C/C++编程总结(GCC+Clang+CMake)

    VScode配置C C 43 43 编程总结 xff08 GCC 43 Clang 43 CMake xff09 自己存下档纪念一下2019 12 18 Visual Studio Code VScode全称Visual Studio Co
  • 关于锂电池的二三事

    为了解释的更清楚 xff0c 我录制了一个视频 xff0c 详情可以参看 xff1a 我的这个B站视频 这是目录0 0 背景参数指标一些使用方法 背景 锂电池是我们日常生活中和制造东西时经常见到和使用的一种东西 xff0c 但是有很多细节可
  • 单片机堆栈知识总结

    堆栈 在片内RAM中 xff0c 常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出 LIFO FILO 的原则 xff0c 这个RAM区叫堆栈 其实堆栈就是单片机中的一些存储单元 xff0c 这些存储单元被指定保存一些
  • STM32串口发送中断试验、在初始化时不能使能串口发送中断

    问题描述 在测试STM32串口发送完成中断的应用中 xff0c 遇到了一个很奇怪的问题 xff0c 在初始化完成之后直接就进入了串口中断函数的发送完成服务中断函数部分 本测试代码是在原来的基础上更改的 xff0c 原来只使能了接受中断 xf
  • java,http post请求,多个不同方式请求示例

    以下是 Java 中进行 HTTP POST 请求的示例代码 xff0c 包括使用 HttpURLConnection 和 HttpClient 两种方式 xff0c 供您参考 使用 HttpURLConnection 发送 POST 请求
  • 【STM32】HAL库开发教程(一)—基本使用

    前言 提示 xff1a 本系列本章针对STM32F207 xff0c 基于Cubemx和Keil进行程序开发 本系列文章并不是一步一操作的傻瓜式教程 xff0c 而更希望是一个向导 xff0c 引导读者去思考去开发 做为一个开发者应该是在思
  • 【STM32】HAL库开发教程(五)—RTC使用

    前言 不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 一 RTC简介 STM32F2的实时时钟 RTC 是一个独立的BCD Binary Coded Decimal 定时器 计时器 xff0c 提供了一
  • 【STM32】HAL库开发教程(七)—SPI使用

    前言 不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 本文主要介绍STM32 HAL库开发中SPI通信的使用 一 开发步骤 1 STM32CubeMX配置 在左侧引脚配置处勾选SPI进行配置在SPI模式
  • 【通信技术】信噪比及单位

    信噪比 xff1a 一个电子设备或者电子系统中信号与噪声的比例 计量单位 dB xff0c 其计算方法是10lg Ps Pn xff0c 其中Ps和Pn分别代表信号和噪声的有效功率 功率单位 xff1a dBm是一个考征功率绝对值的值 xf
  • 【C语言】字符串打印(定长)

    目的 xff1a 打印长度可控的字符串 char ucBuf uint8 t ucLen char ucString 256 memcpy ucString ucBuf ucLen ucString ucLen 61 39 0 39 pri
  • 【卫星】卫星通信基本概念与知识

    不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 卫星通信基本概念与知识 上行链路 xff1a 从地球站发射信号到通信卫星所经过的通信路径成为上行链路 下行链路 xff1a 通信卫星将信号再转发到其他地球
  • 计算机基础笔记(三)—操作系统

    前言 不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 目录 前言一 概述二 操作系统分类三 组成部分用户界面内存管理器进程管理进程同步设备管理文件管理 四 主流操作系统UNIXLinuxWindows
  • 计算机基础笔记(四)—数据结构

    前言 不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 目录 前言数组链表栈 xff08 LIFO xff09 队列 xff08 FIFO xff09 广义线性表树图 定义 有特殊关系的数据的集合 xff
  • 计算机基础笔记(五)—数据库

    前言 不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 目录 前言文件结构顺序文件索引文件散列文件目录 数据库数据库体系结构数据库模型数据库的设计其他数据库 文件结构 文件是数据记录的集合 xff0c 每
  • 陀螺仪数据处理(BMI088)

    1 BMI088惯性传感器介绍 1 1传感器原理图 传感器采用3 3V供电 xff0c 使用SPI IIC通讯模式 xff08 本文采用SPI通讯协议 xff09 1 2传感器功能介绍 注 xff1a 这里提到的数据读取频率 2000Hz是
  • FreeRTOS 多任务系统——任务切换、任务管理方式心得

    目前在进行对使用FreeRTOS的项目的代码升级 xff0c 之前采用的主逻辑任务切换模式 xff1a 由一个任务来进行逻辑上为串行的不同功能切换 xff0c 其他任务分别负责通信实时传输 传感器检测和电机控制 xff0c 系统中断中采用变