【STM32 FreeRTOS】FreeRTOS的移植

news2024/9/24 11:26:29

其实这篇文章不侧重移植,因为我们会使用CubeMX配置,那样会自动移植FreeRTOS。

关于FreeRTOS,可以参考官网:FreeRTOS - Quick start guide

在这里插入图片描述
当我们在CubeMX中配置了CMSIS_V2后尝试编译的时候会有一个弹窗。
第一个问题就是强烈建议不要使用Systick作为HAL的时基。
在这里插入图片描述
默认情况下,我们会选用Systick(滴答定时器)作为HAL的时基,这个时基有什么用呢?我们看HAL库源码就会发现,在配置时钟树函数中会调用滴答计时器的初始化函数,初始化函数中配置的是1ms一个中断,并且在中断服务函数中在累加一个全局变量,这个变量就是在进行中断计数。

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  /* Configure the SysTick to have interrupt in 1ms time basis*/
  if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
  {
    return HAL_ERROR;
  }

  /* Configure the SysTick IRQ priority */
  if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  {
    HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
    uwTickPrio = TickPriority;
  }
  else
  {
    return HAL_ERROR;
  }

  /* Return function status */
  return HAL_OK;
}

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

HAL_Delay()函数就是在此基础上实现的,他是一种轮询计数的方式实现delay。

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

或者在封装的外设驱动函数中的超时判断,也是使用的Systick。那么为什么加入RTOS后,就不建议我们使用了呢?
RTOS会强制将Systick的中断优先级设置为最低,RTOS还会使用Systick中断服务函数进行任务调度,如果这个时候有一个中断优先级较高(高于Systick中断)的中断服务函数中调用了HAL_Delay(),那么意味着会卡死,因为HAL_Delay()函数中也会等待Systick中断进行计算,但是现在还在执行更高优先级的中断。所以这样是有风险的。。。
但是其实我们是不建议在中断服务函数中进行延迟操作的。但是出于软件健壮的考虑,我们的HAL时基可以使用其他定时器来实现。
在这里插入图片描述
我们现在使用TIM4来作为时基。同样的,在时钟树配置后就会初始化TIM4作为时基。

/**
  * @brief  Period elapsed callback in non blocking mode
  * @note   This function is called  when TIM4 interrupt took place, inside
  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  * a global variable "uwTick" used as application time base.
  * @param  htim : TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM4) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */

  /* USER CODE END Callback 1 */
}

然后,我们也会发现SysTick_Handler函数在cmsis_os2.c文件中定义了。

/*
  SysTick handler implementation that also clears overflow flag.
*/
void SysTick_Handler (void) {
  /* Clear overflow flag */
  SysTick->CTRL;

  if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
    /* Call tick handler */
    xPortSysTickHandler();
  }
}

会在最开始的HAL_Init函数中初始化Systick。

任务调度简介

FreeRTOS一共支持三种任务调度方式:

  • 抢占式调度:主要是针对优先级不同的任务,每一个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
  • 时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。
  • 协程式调度:官方表示不再更新协程式调度。

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

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

相关文章

ubuntu实践

目录 扩容 本机上ping不通新建立的虚拟机 ssh连接 装sshd ssh客户端版本较低&#xff0c;会报key exchange算法不匹配问题 ubuntun上装docker 将centos7下的安装包改造成适配 ubuntu的包 参考文章 扩容 Hyper-V 管理器安装的ubutun扩容磁盘空间说明_hype-v磁盘扩容-…

私域电商丨软件系统开发中,一定要避开的几个坑,看懂少很多弯路

文丨微三云胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 大家好&#xff0c;我是软件开发胡佳东&#xff0c;每天为大家分享互联网资讯干货&#xff01; 在数字化时代的今天&#xff0c;软件开发是已经成为推动科技进步和商业发展的重要…

【软件推荐】“聊崽”聊天机器人

不是广告&#xff01;不是广告&#xff01;不是广告&#xff01; 自己小团队开发的产品&#xff0c;现在正在公测。 前言 什么是聊天机器人&#xff0c;将你自己的微信接入机器人系统&#xff0c;让你的微信能够具备智能客服、游戏交互、问题解答、气氛活跃等能力。 同样的问…

本地化部署一个简单的AI大模型,Llama3.1

7 月 23 日消息&#xff0c;Meta 今晚正式发布llama3.1&#xff0c;提供 8B、70B 及 405B 参数版本。 Meta 称 4050 亿参数的 Llama 3.1-405B 在常识、可引导性、数学、工具使用和多语言翻译等一系列任务中&#xff0c;可与 GPT-4、GPT-4o、Claude 3.5 Sonnet 等领先的闭源模型…

python-绝对值排序(赛氪OJ)

[题目描述] 输入 n 个整数&#xff0c;按照绝对值从大到小排序后输出。保证所有整数的绝对值不同。输入格式&#xff1a; 输入数据有多组&#xff0c;每组占一行&#xff0c;每行的第一个数字为 n ,接着是 n 个整数&#xff0c; n0 表示输入数据的结束&#xff0c;不做处理。输…

实现领域驱动设计(DDD)系列详解:领域模型的持久化

领域驱动设计主要通过限界上下文应对复杂度&#xff0c;它是绑定业务架构、应用架构和数据架构的关键架构单元。设计由领域而非数据驱动&#xff0c;且为了保证定义了领域模型的应用架构和定义了数据模型的数据架构的变化方向相同&#xff0c;就应该在领域建模阶段率先定义领域…

【MSP430】DriverLib库函数,GPIO相关函数介绍

采用了DriverLib库函数&#xff0c;以下是对GPIO相关函数的介绍 MSP430F5xx_6xx_DriverLib_Users_Guide-2_91_13_01(函数库手册).pdf 在MSP430单片机中&#xff0c;GPIO相关的函数提供了一套完整的接口用于配置和控制GPIO引脚。这些函数可以方便地管理引脚的输入输出模式、电平…

【微信小程序实战教程】之微信小程序 WXS 语法详解

WXS语法 WXS是微信小程序的一套脚本语言&#xff0c;其特性包括&#xff1a;模块、变量、注释、运算符、语句、数据类型、基础类库等。在本章我们主要介绍WXS语言的特性与基本用法&#xff0c;以及 WXS 与 JavaScript 之间的不同之处。 1 WXS介绍 在微信小程序中&#xff0c…

利用换元法计算积分的常见题型(考研高数复习)

考研中常见的几种换元法积分计算题 (1)被积式仅包含一个根式&#xff1a;根号下为有 a a a 和 x x x 的平方和/平方差 此种类型的积分题型&#xff0c;可以通过构造单个锐角大小为 t t t 的直角三角形&#xff0c;利用勾股定理和三角函数进行代换。 平方和的情况 形如 ∫…

40V/4.5A的AH6240直接替代PT2470的直流有刷电机驱动芯片

135-3806-7573本文将详细介绍AH6240直流有刷电机驱动芯片如何直接替代PT2470&#xff0c;并探讨其在实际应用中的优势。 一、AH6240与PT2470的对比分析 AH6240是一款高性能的直流有刷电机驱动芯片&#xff0c;具有40V/4.5A的输出能力&#xff0c;支持宽电压范围输入&#xff0…

【Android】Activity生命周期与四种启动模式

文章目录 生命周期返回栈Activity状态生命周期方法 启动模式standard模式singleTask模式singleTop模式singleInstance模式配置方式 生命周期 返回栈 每个Activity的状态由它在Activity栈&#xff08;又叫“回退栈back stack”&#xff09;中的位置决定&#xff0c;是所有当前…

scratch笔记

一、图章 练习题&#xff1a; 【画笔】 一、选择题 1.怎样修改图章的颜色&#xff1f;&#xff08;D &#xff09; A. 只需要一个数字来设置颜色 B. 设置RGB的值 C. 在画笔中设置颜色、饱和度、亮度 D. 在外观中设置或修改角色颜色特效 2.执行下面程序&#xff0c;最后可能出…

idea中如何创建yml、yaml、properties配置文件

目录 1、配置文件 2、创建yml配置文件 3、配置文件的优先级 1、配置文件 我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件…

视频加密软件哪个好?怎么进行视频文件加密?

员工A&#xff1a;“最近公司有很多重要视频资料需要保存和分享&#xff0c;但担心安全问题&#xff0c;你有什么好推荐吗&#xff1f;” 员工B&#xff1a;“当然有&#xff0c;市面上有很多视频加密软件&#xff0c;其中我觉得域智盾非常不错。它是一款功能强大的企业文件加…

【Beyond Compare】Beyond Compare下载、安装与使用详细教程

目录 &#x1f33a;1 概述 &#x1f384;2 Beyond Compare 安装包下载 &#x1f33c;3 安装详细教程 &#x1f342;4 免费注册 &#x1f30d;5 使用详情 &#x1f33a;1 概述 Beyond Compare 是一款强大的文件和文件夹比较工具&#xff0c;广泛应用于软件开发、文档管理和…

【基础算法总结】优先级队列

优先级队列 1.最后一块石头的重量2.数据流中的第 K 大元素4.前K个高频单词4.数据流的中位数 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1…

Unity UGUI 之 Mask

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是遮罩 遮罩是一…

docker搭建python3的私有源--devpi

一、部署 # docker run -d --name devpi-lib -p 7104:7104 --env DEVPISERVER_HOST0.0.0.0 --env DEVPISERVER_PORT7104 --env DEVPISERVER_ROOT_PASSWORDpassword --env DEVPISERVER_USERlowinli --env DEVPISERVER_PASSWORDpassword --env DEVPISERVER_MIRROR_INDEXpypi --…

赋能未来教育,3DCAT助力深圳鹏程技师学院打造5G+XR实训室

随着国家对教育行业的重视&#xff0c;实训室建设已成为推动教育现代化的关键。《教育信息化2.0行动计划》、《职业教育示范性虚拟仿真实训基地建设指南》等政策文件&#xff0c;明确指出了加强虚拟仿真实训教学环境建设的重要性。 在这一大背景下&#xff0c;教育行业对于实训…

Open3D 计算点云的占地面积

目录 一、概述 1.1实现步骤 1.2应用 二、代码实现 1.1关键函数 1.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 前期试读&#xff0c;后续会将博客加入下列链接的专栏&#xff0c;欢迎订阅 Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、概述 该博客在…