FreeRTOS的Systick和HAL时基

news2024/12/30 1:18:14

目录

分析

举个例子:

正确的做法:

 总结


我们首先需要知道,使用了FreeRTOS会强制使用systick作为自己的心跳,这个os_tick的优先级是最低的,它主要的作用就是OS任务调度,时间片查询等工作。

在图中,这里设置Timebase是HAL库所使用的基本时钟hal_tick,如果这里也设置成systick,优先级最低,那么在高优先级(优先级高于systick) 中断服务函数中调用HAL_Delay()就会导致错误

当然,我们也经常强调不要在中断中使用延时!不要在中断中使用延时!不要在中断中使用延时!(中断一般是快进快出的)

HAL_Delay()函数在库中是基于所选择的Timebase时钟源来实现的:

/**
  * @brief This function provides minimum delay (in milliseconds) based 
  *        on variable incremented.
  * @note In the default implementation , SysTick timer is the source of time base.
  *       It is used to generate interrupts at regular time intervals where uwTick
  *       is incremented.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @param Delay specifies the delay time length, in milliseconds.
  * @retval None
  */
__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)
  {
  }
}

所以,我们设置成其他定时器,当然建议使用基本定时器TIM6或者TIM7,它的优先级会默认设置成最高。

分析

stm32+freertos之所以要用到两套timebase(一是freertos的心跳(os_tick)二是更底层的与freertos的api无关的hal心跳(hal_tick),譬如systick(这个是强制的os_tick)和timer(譬如timer1、hal_tick));

是因为freertos强制使用systick作为自己的心跳时钟,且systick的优先级被强制设置为最低,如果HAL的心跳也使用systick,也即systick=hal_tick,那么在某些情况下将产生我们意想不到的结果。

举个例子:

systick的中断优先级为最低的5,我们有个中断int_a的优先级为4,显然int_a的优先级要高于systick,systick的中断是不能够抢占int_a的。

考虑以下情形:int_a的中断服务函数里调用了HAL_Delay(10),等待10个tick(HAL_Delay)内部是一个while循环,不断的读取当前的hal_tick来判断是否到时间,hal_tick随着时间的流失是不断增长的,由于只有一个timebase源(systick),hal_tick增长的任务也就交给systick的中断服务了,由于systick不能够抢占int_a,就导致以下的情况:systick无法处理自己的中断服务函数,hal_tick也就不会增长,int_a的HAL_Delay(10)也就永远等不到自己返回的日子,其结果就是int_a中断无法返回,任何优先级低于此中断的中断都无法得到服务,当然也包括os的全部调度,因为os的调度依赖于systick中断。

正确的做法:

timer(譬如timer1)产生HAL心跳,systick产生freertos的心跳,HAL是不依赖于OS API的一套硬件操作接口。

os_tick是如何工作的:

当配置了两套时基时,systick作为os的心跳,它的优先级应该配置为最低,这是因为:

systick的中断服务,主要处理一些os层面的东西,譬如查看是否有blocked的任务已经就绪,然后执行任务切换等工作,作为一个实时操作系统为了保持实时性不打搅其他的中断服务,stm32cubemx里会强制systick的优先级为最低。

hal_tick是如何工作的:

为了保证HAL时基的可靠,防止出现上面讲到的一直忙等待问题,强制设定它的优先级为最高,我们使用基本定时器TIM6或者TIM7作为HAL时基,一般是1ms,HAL_Delay()函数就是使用的这个时基。

 总结

防止在高优先级(优先级高于Systick) 中断服务函数中调用HAL_Delay(),导致中断服务忙等待,这样任何优先级低于该中断的中断都得不到服务(低中断不能打断高中断),当然这里包括os的全部调度。

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

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

相关文章

【未解决乌龟问题】测试ROS是否安装成功

前提说明&#xff1a;虚拟机、ubuntu-18.04.1 1、操作流程&#xff1a; 1&#xff09;参考教程链接1&#xff0c;第一步输入roscore指令查看ROS的版本、节点、端号等内容时出现“Command roscore not found, but can be installed with: sudo apt install python-roslaunch”…

python-docx写入word

目录 字体大小参照 安装python-docx 引入依赖包 使用 标题设置字体、字号、居中、加粗、颜色 正文设置字体、字号、居中、加粗、颜色 添加图片 官方文档 字体大小参照 字号‘八号’对应磅值5 字号‘七号’对应磅值5.5 字号‘小六’对应磅值6.5 字号‘六号’对应磅值7.…

Java8-19新特性一览 ,认识全新的前沿技术

文章目录Java8-19新特性一览 ,认识全新的前沿技术前言你的收获Java发展趋势准备工作新特性1、接口private1&#xff09;、说明2&#xff09;、案例3&#xff09;、注意2、类型推断1&#xff09;、说明2&#xff09;、案例3&#xff09;、注意3、空指针优化1&#xff09;、说明2…

【5】SCI易中期刊推荐——计算机科学(中科院2区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

阿里云k8s一键部署有状态StatefulSet nacos2.0.3

阿里云k8s一键部署有状态StatefulSet nacos2.0.3 项目目录 centos 配置连接集群 kubectl 客户端执行k8s脚本 kubectl 执行结果&#xff0c;一键生成StatefulSetpodServiceconfig Deployment pod重启ip和名称随机分配&#xff0c;适合java服务类部署 StatefulSet pod重启ip和名…

再学C语言31:函数——递归

C允许一个函数调用其自身&#xff0c;这种调用过程被称为递归&#xff08;recursion&#xff09; 使用递归的风险&#xff1a;如果程序中没有设定可以终止递归的条件检测&#xff0c;会无限制地执行递归调用 所以涉及递归的程序需要谨慎设计 递归一般可以替代循环语句使用&a…

Mozi僵尸网络(P2P僵尸网络Mozi)

Mozi僵尸网络概述 Mozi僵尸网络是于2019年底首次出现在针对路由器和DVR 的攻击场景上的一种P2P僵尸网络。主要攻击物联网&#xff08;IoT&#xff09;设备&#xff0c;包括网件、D-Link和华为等路由设备。它本质上是Mirai的变种&#xff0c;但也包含Gafgyt和IoT Reaper的部分代…

springboot mybatis mysql快速开始(详细入门操作)(二)

七、创建service类。要注意相应的注解service,autowired不能丢&#xff0c;不然系统识别不到这些组件。里面写对应的mapper方法。Service public class SplineService { private static final Logger log LoggerFactory.getLogger(SplineService.class); Autowired private Sp…

国产音频ADC芯片的应用以及选型

想要让模拟信号和数字信号顺利“交往”&#xff0c;就需要一座像“鹊桥”一样的中介&#xff0c;将两种不同的语言转变成统一的语言&#xff0c;消除无语言障碍。这座鹊桥就是转换器芯片&#xff0c;也就是ADC芯片。ADC芯片的全称是Analog-to-Digital Converter, 即模拟数字转换…

设计模式_创建型模式 -《单例模式》

设计模式_创建型模式 -《单例模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 创建型模式的主要关注点是“怎样创建对象&#xff1f;”&#xff0c;它的主要特点是“将对象的创建与使用分离”。 这样…

广州蓝景分享—Web前端开发培训机构如何选择

首先Web前端培训机构如何选择&#xff1f;相信很多人都不是很清楚&#xff0c;就是听别人推荐哪家好哪家不好&#xff0c;没有合理性的去实地了解&#xff0c;看看是否符合自己。所以&#xff0c;最好的方法就是自己在网上可以找一些判断web前端培训机构的条件&#xff0c;然后…

nacos原理和实战问题解决方案

nacos原理和集群搭建实战&#xff0c;在开始之前、我们先要知道nacos的官网并熟悉其基本特性 官网介绍 一、原理&#xff1a; 1、多种注册中心对比 2、nacos作为注册中心的核心功能 2.1、服务注册&#xff1a; Nacos Client会通过发送REST请求的方式向Nacos Server注册自己…

ArcGIS基础实验操作100例--实验82聚集点空间特征分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验82 聚集点空间特征分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

Leetcode.60 排列序列

题目链接 Leetcode.60 排列序列 题目描述 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n!n!n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n3n 3n3 时, 所有排列如下&#xff1a; "123" "132" "213" …

二、TTY子系统框架

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、TTY子系统框架分析2、TTY数据处理流程3、驱动的目录结构及核心文件4、TTY在Linux下的分布1、TTY子系…

微信小程序使用

微信开发介绍微信公众号的二次开发&#xff0c;主要点后端配置交互&#xff0c;前端负责h5页面微信小程序和微信小游戏的开发&#xff0c;必须要依托于微信&#xff0c;方便宣传开放平台&#xff0c;公众平台小程序介绍2016年出来的&#xff0c;取缔app应用。传统的App应用开发…

Vue中动态展示数据的字典项

问题描述 今天在写自己网站的时候&#xff0c;遇到一个问题&#xff0c;不知道各位前端初学者有没有遇到过这个问题 如图所示&#xff1a;我通过接口查询到一些信息&#xff0c;有两个属性是枚举数据(魔法值) 我们称这种数据为字典项&#xff0c;因为开发中一般称0&#xff…

AWS Markeplace 上的 DolphinDB MGR 快速上手

1. AWS 上的 DolphinDB MGR 简介 DolphinDB MGR 是部署于 Kubernetes 上的 DolphinDB 集群自动运维系统&#xff0c;提供包括部署、升级、扩缩容、配置变更的 DolphinDB 全生命周期管理。通过 DolphinDB MGR&#xff0c;DolphinDB 可以无缝运行在公有云或私有部署的 Kubernete…

openEuler RISC-V 的 Firefox 性能大升级,最高 40 倍性能提升

RISC-V SIG 择日即将发布 openEuler RISC-V 22.03 V2 版本镜像。本次发版会提供带有 SpiderMonkey JIT 编译支持的 Firefox 最新版本和带有 LLVMpipe 优化的 Mesa 最新版本安装源供使用者选装测试&#xff0c;预期图形界面使用性能会获得可观优化。 新版本的 Firefox 开启 JIT…

5.3、UDP 和 TCP 的对比

在使用 TCP/IP 体系结构的网络通信中&#xff0c;这两个协议的使用频率仅次于网际层的 IP 协议 TCP/IP 体系结构应用层中的某些协议需要使用运输层的 TCP 提供的服务 而另一些协议需要使用运输层的 UDP 提供的服务 1、UCP(无连接) & TCP(面向连接) 1.1、UDP 如下所示&am…