freertos.c解析 - 教程

news/2025/9/23 10:57:22/文章来源:https://www.cnblogs.com/lxjshuju/p/19106776

一,代码解析

/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : freertos.c
* Description : Code for freertos applications
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */

版权信息

/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

初始化的头文件

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "user_TasksInit.h"
/* USER CODE END Includes */

用户自定义任务初始化头文件

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */

这些部分都是 STM32CubeMX 预留的用户代码区。目前它们是空的,但用户可以在其中添加自己的类型定义、宏、常量或全局变量。

/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};

defaultTaskHandle : 这是一个 osThreadId_t 类型的变量,用于在任务创建后存储该任务的句柄。通过这个句柄,可以在程序中的其他地方引用并控制这个任务(例如暂停、恢复、删除等)。

defaultTask_attributes : 这是一个 osThreadAttr_t 结构体,定义了 defaultTask 的属性:
.name = “defaultTask”: 给任务一个字符串名称,在调试工具(如 FreeRTOS 的任务查看器)中会显示这个名称,方便识别。

.stack_size = 128 * 4: 定义任务的堆栈大小。

.priority = (osPriority_t) osPriorityNormal: 设置任务的执行优先级。osPriorityNormal 是 CMSIS-RTOS 定义的一个标准优先级。FreeRTOS 调度器总是执行处于就绪态的最高优先级任务。

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void MX_FREERTOS_Init(void);
/* (MISRA C 2004 rule 8.1) */
/* Hook prototypes */
void vApplicationIdleHook(void);
void vApplicationTickHook(void);
/* USER CODE BEGIN 2 */
void vApplicationIdleHook( void )//空闲任务钩子(作用:当没有任何其他任务可以运行时,FreeRTOS 的空闲任务(Idle Task)会被调度执行,而 vApplicationIdleHook() 会在空闲任务的每次迭代中被调用。)
{
/* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle
task. It is essential that code added to this hook function never attempts
to block in any way (for example, call xQueueReceive() with a block time
specified, or call vTaskDelay()). If the application makes use of the
vTaskDelete() API function (as this demo application does) then it is also
important that vApplicationIdleHook() is permitted to return to its calling
function, because it is the responsibility of the idle task to clean up
memory allocated by the kernel to any task that has since been deleted. */
}
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
void vApplicationTickHook( void )时钟节拍钩子(作用:这个函数会在每个 FreeRTOS 时钟节拍中断发生时被调用。时钟节拍中断是 FreeRTOS 调度器的心跳,用于时间管理和任务调度。)
{
/* This function will be called by each tick interrupt if
configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig.h. User code can be
added here, but the tick hook is called from an interrupt context, so
code must not attempt to block, and only the interrupt safe FreeRTOS API
functions can be used (those that end in FromISR()). */
TaskTickHook();
}
/* USER CODE END 3 */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
User_Tasks_Init();
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}

这是 FreeRTOS 的主初始化函数,通常在 main() 函数中通过 MX_FREERTOS_Init(); 调用。
User_Tasks_Init(): 这是用户自定义任务的初始化函数,它会在 defaultTask 创建之前被调用。这意味着用户可以在这个函数中创建其他应用所需的任务。这体现了模块化的设计,将用户自定义任务的创建逻辑与 freertos.c 的骨架分离。
RTOS_MUTEX / SEMAPHORES / TIMERS / QUEUES / THREADS / EVENTS: 这些都是 STM32CubeMX 生成的用户代码区。它们预留了位置,供用户通过 CMSIS-RTOS API 创建:
互斥量 (Mutexes) : 用于保护共享资源,防止多个任务同时访问导致数据不一致。
信号量 (Semaphores) : 用于任务同步或资源计数。
软件定时器 (Timers) : 用于周期性执行代码或在一定时间后执行一次代码。
消息队列 (Queues) : 用于任务间传递数据。
其他线程 (Threads) : 除了 defaultTask,用户可以在这里创建更多自己的任务。
事件标志组 (Events) : 用于任务之间发送和接收事件信号。
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);: 这是实际创建 defaultTask 的代码。
StartDefaultTask: 是该任务的入口函数。
NULL: 表示没有参数传递给 StartDefaultTask 函数。
&defaultTask_attributes: 使用前面定义的任务属性。

/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;
;
)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
osDelay(500);
}
/* USER CODE END StartDefaultTask */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* USER CODE END Application */

这是默认任务执行的代码

二,总结

首先是定义了defaultask的句柄,通过defaultTask_attributes定义了defaulttask的属性(名字,栈的大小,优先级),在MX_FREERTOS_Init(void) 中调用User_Tasks_Init()。最后定义了默认任务

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

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

相关文章

北京网站建设哪家最好网站建设验收确认书免费下载

本节内容为2020年下半年小学教师资格证考试科目二《教育教学知识与能力》小学课堂教学导入考点详解。【考点:小学课堂教学导入】一、课堂教学导入概述(一)教学导入的概念所谓教学导入,是指在上课之初,教师利用几分钟的时间,运用简洁的言语或行为,将学生的注意力吸引…

网站建设调研文档知名的产品设计网站

前言 HTTP/1.1 是目前广泛应用的网络协议之一,虽然已经存在多年,但我们仍然可以通过优化来提升其性能和效率。本文将从优化思路的角度出发,探讨如何在 HTTP/1.1 协议下实现优化,包括避免发送重复 HTTP 请求、减少 HTTP 请求次数、…

微型网站 源码注册德国网站域名

B站:啥都会一点的研究生公众号:啥都会一点的研究生 前言 YOLOv10 由清华大学研究人员在 Ultralytics版基础上进行进一步开发,引入了一种新的实时目标检测方法,解决了以前版本 YOLO 在后处理和模型架构方面的不足。通过消除非最大…

网站ip地址范围上海网站建设公司怎么分辨好坏

问题描述 最近碰到一个奇怪的问题,DS 创建工作流成功,但是一旦执行,始终在转,而且没有任何执行的痕迹,后来到数据库一查发现压根没创建任务实例。 我们都知道一个工作流里面可以挂多个任务节点,执行工作流…

天行健公司网站建设宁波网站建设服务公司电话

字符串的声明字符串是内存中连续排列的0个或多个字符。不变字符串是指字符串一旦创建,其内容就不能改变,Java中使用String类来处理不变字符串,在对String类的实例进行查找、比较、拼接等操作时,既不能输入新字符,又不能…

建设刷单网站铁路建设网站多少

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-14)山西电力市场全天平均日前电价为491.16元/MWh。其中,最高日前电价为804.44元/MWh,预计出现在16:15。最低日前电价为336.28元/MWh,预计…

网站简繁体转换.rar商务网站开发实训体会

JDK 13已于2019年9月17日上线GA, 此处列出了重要的新功能。 新功能之一是“文本块”。 这样可以轻松地编写多行字符串,而不必在拆分成不同的行时进行串联。 让我们快速了解创建多行字符串的不同方法: String aBlock """ SE…

网站建设公司86215河南专业网站建设开发团队

LabVIEW 中调用动态库接口时,如果是值传递的结构体,可以根据字段拆解为多个参数;如果参数为结构体指针,可用簇(Cluster)来匹配,其内存连续相当于单字节对齐。 1.值传递 接口定义: …

从缺陷管理到质量协作:现代Bug工具的范式升级

从缺陷管理到质量协作:现代Bug工具的范式升级 在持续交付成为标配的今天,传统Bug跟踪系统正面临前所未有的挑战。最新行业调研显示,67%的研发团队认为现有缺陷管理工具与DevOps工作流存在明显断层,这促使新一代协作…

【html组件】简易漫画阅读器

【html组件】简易漫画阅读器<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge&…

21 C++ 哈希表入门:unordered_set/unordered_map 用法 + 与 set/map 性能 / 迭代器差异全解 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ubuntu安装mysql2

# 1. 更新系统包列表 sudo apt update# 2. 安装 MySQL 服务器 sudo apt install mysql-server -y# 3. 启动 MySQL 服务并设置开机自启 sudo apt install mysql-server -y sudo systemctl enable mysql# 4. 验证 MySQL …

生鲜电商网站建设策划书重庆市网站建设

刚开始看到这个功能的时候一定觉得so easy&#xff0c;开始的时候我也是这么觉得的&#xff0c;这还不简单&#xff0c;然而真正写的时候才发现并没有想象的那么简单。 先上图&#xff0c;不上图你们都不想看&#xff0c;我难啊&#xff0c;到Github&#xff1a; https://gith…

学校网站建设的建议上海高品质网站建设

01 河道周围垃圾堆放 场景描述&#xff1a;基于河道漂浮物容易通过水流的影响&#xff0c;被推在河道周围的岸边&#xff0c;因此通过对河道周围的垃圾堆放24h实时识别&#xff0c;目的提高治理河道垃圾的时效性且减少环保工人的工作量 适用场所&#xff1a;适用白天或夜间光…

网站推广方法汇总苏州沧浪做网站哪家好

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9866068.html在本文中&#xff0c;我将解释命令模式&#xff0c;以及如何利用基于命令模式的第三方库来实现它们&#xff0c;以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此…

网站开发项目实战视频建一个网站的技术解决方案

10月18日云栖大会开放日上&#xff0c;阿里云基于新一代无影架构的两款一体机已对观众展出。两款新品分为23.8寸标准版和27寸Pro版&#xff0c;Pro版为手绘场景配有触控屏和触控笔&#xff0c;官方介绍为首款设计师云电脑。 在云栖大会展区&#xff0c;观众已经可以对一体机进…

设计一个网站多少钱网站设计网上培训学校

来源&#xff1a;扬子晚报一般来说科学本是最讲求真实性的&#xff0c;但近些年来所谓轰动一时的科学“成果”中&#xff0c;却颇多假冒伪劣产品。1、百慕大“死亡三角”在众多科学骗局中&#xff0c;“百慕大”传说是影响最大且流传最广的一例&#xff0c;但它的起因只是第二次…

宁波网站搭建wordpress图片加框架

搜集日志&#xff1b;日志处理器&#xff1b;索引平台&#xff1b;提供视图化界面&#xff1b;客户端登录 日志收集者&#xff1a;负责监控微服务的日志&#xff0c;并记录 日志存储者&#xff1a;接收日志&#xff0c;写入 日志harbor&#xff1a;负责去连接多个日志收集者&am…

网站收录怎么做黄南州wap网站建设公司

完全禁用Microsoft Compatibility Telemetry Win S 中搜索 任务计划程序 /Microsoft/Windows/Application Experience 禁用 Microsoft Compatibility Appraiser 如果不管用 服务里禁用 Diagnostic Policy Service

一个虚拟主机可以做两个网站吧传奇网页游戏排行

单表优化最佳左前缀原则为&#xff0c;保持索引的定义和使用顺序的一致性将含In的范围查询&#xff0c;放到where条件语句的最后。索引需要逐步优化两表优化小表驱动大表避免索引失效的一些原则&#xff1a;复合索引&#xff0c;不要跨列或无序使用&#xff08;最佳左前缀&…