【STM32 FreeRTOS】FreeRTOS的移植

其实这篇文章不侧重移植,因为我们会使用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。

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

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

相关文章

Qt中的项目文件

QT core gui#core 核心模块 gui 窗口界面模块 # 在Qt4中 core gui widgets 是一体的 greaterThan(QT_MAJOR_VERSION, 4): QT widgets CONFIG c11 #使用C11标准编译 # The following define makes your compiler emit warnings if you use # any Qt feature that h…

Symfony vs. Laravel:框架比较与选择指南

Symfony vs. Laravel&#xff1a;框架比较与选择指南 引言 Symfony和Laravel是PHP领域中两个非常流行的框架&#xff0c;各自拥有庞大的用户群和丰富的功能。然而&#xff0c;它们在设计理念、使用场景和开发体验等方面存在显著差异。本文将深入比较Symfony和Laravel&#xf…

【深度学习】yolov8-det目标检测训练,拼接图的分割复原

项目背景 https://blog.csdn.net/x1131230123/article/details/140606459 似乎这个任务是简单的&#xff0c;利用目标检测是否可以完成得好呢? 生成数据集 利用这个代码产生数据集&#xff1a; 为了将标签转换为YOLOv5格式&#xff0c;需要将左上角和右下角的坐标转换为Y…

【性能测试-登录时密码加密存储如何传参】

目的】 登录接口&#xff0c;密码加密传输&#xff0c;开发不做处理的情况下&#xff0c;密码如何加密传输 【方案】 使用前置处理器&#xff1a;JSR223 预处理程序&#xff0c;主要是在执行登录接口前将密码按照加密算法获得对应的加密密码&#xff0c;并传入接口 【说明】前…

MVC(Model-View-Controller)架构简介

MVC&#xff08;Model-View-Controller&#xff09;架构是一种常用的软件设计模式&#xff0c;特别是在Web应用程序开发中。它将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&…

如何对视频文件加密_如何加密视频文件_视频文件如何加密

“嘿&#xff0c;小李&#xff0c;你知道咱们公司的新项目资料都是视频形式的吗&#xff1f;这些视频里有很多机密信息&#xff0c;我们需要好好保护起来。” “是啊&#xff0c;我也在想这个问题。你有没有什么好办法来加密这些视频文件呢&#xff1f;” “我听说有个叫域智盾…

apt update 报错移除ppa

1. 列出所有 PPA 源 首先&#xff0c;列出所有已添加的 PPA 源&#xff0c;以确认哪些需要移除 ls /etc/apt/sources.list.d/ 2. 移除特定的 PPA 源 cd /etc/apt/sources.list.d/rm 想要移除的的ppa

VUE3——001(03)、开发环境配置(node.js/mvn/java/ngix/tomact/vue3)

嫌麻烦的请下载安装包&#xff0c;有点强迫&#xff08;懒的&#xff09;可以看看。 解释&#xff1a;安装目录&#xff0c;即软件安装所在目录&#xff0c;如 node.js 我装在 D:\AppFolder\nodejs 系统变量修改 path增加 安装目录 在系统变量 p…

生成式AI的双重路径:Chat与Agent的融合与竞争

文章目录 每日一句正能量前言整体介绍对话系统&#xff08;Chat&#xff09;自主代理&#xff08;Agent&#xff09;结论 技术对比技术差异优势与劣势技术挑战结论 未来展望发展趋势Chat与Agent的前景社会和经济影响结论 后记 每日一句正能量 在避风的港湾里&#xff0c;找不到…

代码随想录算法训练营第38天|LeetCode 322. 零钱兑换、279.完全平方数、139.单词拆分

1. LeetCode 322. 零钱兑换 题目链接&#xff1a;https://leetcode.cn/problems/coin-change/description/ 文章链接&#xff1a;https://programmercarl.com/0322.零钱兑换.html 视频链接&#xff1a;https://www.bilibili.com/video/BV14K411R7yv/ 思路&#xff1a; 硬币无限…

泛型中的类型擦除

Java中的泛型是伪泛型&#xff0c;在编译期间会将所有与泛型有关的信息去掉&#xff0c;替换为原始类型。把泛型类的字节码进行反编译就可以看到是没有的。 关于原始类型&#xff0c;如果使用了上界和下界通配符&#xff0c;那么原始类型就是上界和下界&#xff0c;如何没有就…

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

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

我的世界!

每位冒险家在《我的世界》中的出生点都各不相同&#xff0c; 有的出生在桦木森林&#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 等领先的闭源模型…

Qt遇到qt自身组件找不到

比如在使用qtcharts的时候&#xff0c;找不到 解决方法&#xff1a; 在cmakelist中添加 find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Charts REQUIRED) 是一个 CMake 命令&#xff0c;用于查找并配置 Qt 库中的特定组件。这条命令的作用是找到 Qt 的主要版本&#xff08;…

ST Stellar-E SR5E1 22KW OBC combo 3KW DC-DC汽车充电器解决方案

对于全球的环境保护意识抬头&#xff0c;全球的汽车产业慢慢步入电动化的时代&#xff0c;以减少碳排放。整车系统主要是由电池、电驱、电控的三电所构成&#xff0c;其中电池系统是整车的动力来源&#xff0c;而对电池充电的OBC系统更甚重要。一具高度安全性且高效的OBC系统&a…

MybatisPlus设置动态表名

对于一些数据量比较大的表&#xff0c;为了提高查询性能&#xff0c;我们一般将表拆分成多张表&#xff0c;常见的是根据数据量&#xff0c;按年分表或者按月分表&#xff1b;分表虽然太高了查询性能&#xff0c;但是在查询的时候&#xff0c;如何才能查询执行分表数据呢&#…

7.25扣...

思路&#xff1a;别的语言都可以不用辅助数组&#xff0c;我Java就得用&#xff01; c:先计算字符串中数字个数&#xff0c;然后利用双指针将原本字符串逆序从数组最后往前插入&#xff0c;若遇到数字则替换为逆序的“number”&#xff0c;这个过程会使新字符串从后往前覆盖&am…

为什么 Java 开发中时区设定用 Asia/Shanghai 而不是 GMT+8(防止踩雷)

在全球化的背景下&#xff0c;时区管理对于开发人员来说是个重要但复杂的问题。虽然中国的标准时间是 UTC8&#xff0c;但在实际开发中&#xff0c;特别是 Java 开发中&#xff0c;我们应尽量使用时区数据库中的区域/位置形式&#xff08;例如 Asia/Shanghai&#xff09;&#…

【View】Android 事件分发难道你还不会吗?

Android事件分发机制决定了触摸事件如何从顶层窗口传递到具体的视图。主要涉及到三个核心方法&#xff1a;dispatchTouchEvent(), onInterceptTouchEvent(), 和 onTouchEvent()。 1. dispatchTouchEvent() 这是事件分发的入口点。Activity, ViewGroup, 和 View 都重写了这个方…