FreeRTos学习记录--1.工程创建与源码概述

news2025/4/22 13:09:39

1.工程创建与源码概述

1.1 工程创建

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用STM32CubeMX,可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本课程不想严重依赖STM32CubeMX,所以不会使用STM32CubeMX来添加这些对象,而是手写代码来使用这些对象。

使用STM32CubeMX时,有一个默认任务,此任务无法删除,只能修改其名称和函数类型,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里工程创建设计rtos后的特别之处就这些,其他部分与正常的裸机工程一样。

STM32CubeMX只是帮我们初始化了所配置的硬件模块,你要实现什么功能,需要自己添加代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面分析几个问题:

1.在嵌入式开中经常遇到的CMSIS是什么?

2.在STM32CubeMX里面配置工程,经常说的中间件是啥?

上面其实是分立的问题,那么我们这参考佬的讲解:

Keil MDK5软件包的组成、Cortex微控制器软件接口标准CMSIS,重点介绍CMSIS-CORE的组成和使用_mdk软件中器件支持包的组成以及子文件夹的作用-CSDN博客


嵌入式系统的应用开发需要基于目标机-宿主机的交叉编译系统,在集成开发环境的支持下进行,应用程序通常采用高级编程语言C/C++进行编写。使用MDK开发工具进行STM32微控制器的应用开发需要安装软件包,软件包包括:

设备驱动程序库STM32F1XXX_DFP.XXX.pack(对于Keil MDK5而言是根据开发设备的不同选择性安装,MDK4之前的版本都是默认全部安装)Cortex微控制器软件接口标准CMSIS库(默认安装)中间件Middleware(默认安装)以及代码模板、示例等,如下图所示。


CMSIS(Cortex Microcontroller Software Interface Standard)是ARM公司为其Cortex-M系列微控制器定义的一套软件接口标准,旨在简化微控制器的软件开发,使得开发者可以更容易地开发跨不同Cortex-M处理器系列和供应商的嵌入式应用程序。

CMSIS pack主要由以下几部分组成:

  • CMSIS-CORE提供了Cortex-M处理器的核心功能接口,**包括NVIC、SysTick、处理器的寄存器访问、中断向量和中断函数名称。**从软件开发角度看,CMSIS-CORE进行了一系列标准化工作:标准化处理器外设定义、标准化处理器特性的访问函数、标准化系统异常处理程序的函数名等。用户的应用程序既可以通过CMSIS层提供的函数(包括设备厂商提供的外设驱动程序)访问微控制器硬件,也可以利用CMSIS的标准化定义直接对外设编程,控制底层的设备。如果移植了实时操作系统,用户应用程序也可以调用操作系统函数。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • CMSIS-DSP是一个为Cortex-M处理器优化的数字信号处理库,提供了丰富的DSP函数,如FFT、滤波器、矩阵运算等。

  • CMSIS-RTOS为实时操作系统提供了一个标准的API接口,使得开发者可以轻松地在不同的RTOS之间切换。

对于STM32 MCU,我们只需要关心 CMSIS-RTOS,因为在STM32 代码中只有 FreeRTOS提供了cmsis 接口,驱动层还是要使用 HAL库。CMSIS是ARM为Cortex-M系列MCU提供的标准API,而各个使用该内核的芯片厂商(比如NXP、ST、intel),通常会在这些接口的基础上进一步开发适用于自家芯片的开发库,比如ST的HAL、LL、SPL库。


在STM32CubeMX中,“Middleware and Software Packs”(中间件和软件包)部分用于配置和管理与STM32微控制器相关的软件组件。这些组件可以包括文件系统、操作系统、通信协议等,你可以选择需要的组件,并进行相应的配置,如设置文件系统参数、配置任务优先级等。这些配置会生成相应的代码,集成到你的项目中,从而简化开发过程。

常见的中间件和软件包包括:

  1. FATFS:这是一个通用的文件系统模块,支持FAT文件系统,允许在嵌入式系统中读写文件。
  2. FreeRTOS:这是一个实时操作系统内核,适用于需要多任务处理的嵌入式系统。它提供了任务管理、同步机制、内存管理等功能。
  3. USB_DEVICE:这是一个USB设备栈,用于实现STM32微控制器作为USB设备的功能,支持USB通信和设备模式。

中间件的作用:

  • 抽象硬件细节:中间件提供了一层抽象,使得开发者可以不必深入了解硬件的具体实现细节,从而简化开发过程。
  • 提高代码复用性:通过使用中间件,开发者可以重用已有的代码库,减少重复开发的工作量。
  • 增强功能:中间件通常提供了一些高级功能,如网络通信、文件系统支持等,这些功能对于嵌入式系统来说可能难以自行实现。
  • 简化开发:中间件简化了复杂功能的实现,使得开发者可以更专注于应用逻辑的开发。

1.2 源码概述

移植时涉及的文件

移植FreeRTOS时涉及的文件放在 FreeRTOS/Source/portable/[compiler]/[architecture] 目录下,比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS或Keil工具上的移植文件。 里面有2个文件:

  • port.c
  • portmacro.h

核心文件

FreeRTOS的最核心文件只有2个:

  • FreeRTOS/Source/tasks.c

  • FreeRTOS/Source/list.c

    其他文件的作用也一起列表如下:

头文件

内存管理

文件在Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang下,它也是放在“portable”目录下,表示你可以提供自己的函数。源码中默认提供了5个文件,对应内存管理的5种方法。

入口函数

在Core\Src\main.c的main函数里,初始化了FreeRTOS环境、创建了任务,然后启动调度器。源码如下:

/* Init scheduler */
  osKernelInitialize();  /* 初始化FreeRTOS运行环境 */
  MX_FREERTOS_Init();    /* 创建任务 */

  /* Start scheduler */
  osKernelStart();       /* 启动调度器 */

  1. osKernelInitialize():这个函数初始化FreeRTOS的内核环境。它设置了一些基本的内核参数,如时间片、任务优先级等,为后续的任务创建和调度做准备。
  2. MX_FREERTOS_Init():这个函数通常是由STM32CubeMX工具自动生成的,用于创建和管理FreeRTOS任务。它可能会初始化任务堆栈、设置任务优先级、创建任务等。
  3. osKernelStart():这个函数启动FreeRTOS的调度器,开始任务调度。一旦调用这个函数,FreeRTOS将接管CPU的控制权,开始按照任务优先级和调度策略执行任务。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实就是各种初始化,然后启动调度器,进入第一个任务。我们之前设计的RVOS,上电后首先运行的是Bootloader。Bootloader负责初始化硬件环境,包括设置时钟、配置内存等,确保系统环境适合RTOS的运行。一旦系统环境准备就绪,Bootloader将控制权转移给 main 函数。

参考:

https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter6.html

Keil MDK5软件包的组成、Cortex微控制器软件接口标准CMSIS,重点介绍CMSIS-CORE的组成和使用_mdk软件中器件支持包的组成以及子文件夹的作用-CSDN博客

[STM32 固件库与 CMSIS 标准如何理解? - 一郎哥哥 - 博客园]

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

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

相关文章

进程控制(linux+C/C++)

目录 进程创建 写时拷贝 fork 进程终止 退出码 进程退出三种情况对应退出信号 :退出码: 进程退出方法 进程等待 两种方式 阻塞等待和非阻塞等待 小知识 进程创建 1.在未创建子进程时,父进程页表对于数据权限为读写,对于…

TensorBoard如何在同一图表中绘制多个线条

1. 使用不同的日志目录 TensorBoard 会根据日志文件所在的目录来区分不同的运行。可以为每次运行指定一个独立的日志目录,TensorBoard 会自动将这些目录中的数据加载并显示为不同的运行。 示例(TensorFlow): import tensorflow…

微软Entra新安全功能引发大规模账户锁定事件

误报触发大规模锁定 多家机构的Windows管理员报告称,微软Entra ID新推出的"MACE"(泄露凭证检测应用)功能在部署过程中产生大量误报,导致用户账户被大规模锁定。这些警报和锁定始于昨夜,部分管理员认为属于误…

基于FPGA的一维时间序列idct变换verilog实现,包含testbench和matlab辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 DCT离散余弦变换 4.2 IDCT逆离散余弦变换 4.3 树结构实现1024点IDCT的原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) matlab仿真结果 FPGA仿真结果 由于FP…

Linux进程5-进程通信常见的几种方式、信号概述及分类、kill函数及命令、语法介绍

目录 1.进程间通信概述 1.1进程通信的主要方式 1.2进程通信的核心对比 2.信号 2.1 信号的概述 2.1.1 信号的概念 2.2信号的核心特性 2.3信号的产生来源 2.4信号的处理流程 2.5关键系统调用与函数 2.6常见信号的分类及说明 2.6.1. 标准信号(Standard Sig…

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析 服务展示: 运行脚本: 剩余服务: 一、脚本设计背景与核心价值 在Linux服务器运维中,服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…

C++算法(10):二叉树的高度与深度,(C++代码实战)

引言 在二叉树的相关算法中,高度(Height)和深度(Depth)是两个容易混淆的概念。本文通过示例和代码实现,帮助读者清晰区分二者的区别。 定义与区别 属性定义计算方式深度从根节点到该节点的边数根节点深度…

Psychology 101 期末测验(附答案)

欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…

安全协议分析概述

一、概念 安全协议(security protocol),又称密码协议。是以密码学为基础的消息交换协议,在网络中提供各种安全服务。(为解决网络中的现实问题、满足安全需求) 1.1 一些名词 那什么是协议呢? …

基础学习:(7)nanoGPT 剩下的细节

文章目录 前言3 继续巴拉结构3.1 encode 和 embedding3.2 全局layernorm3.3 lm_head(language modeling) 和 softmax3.4 softmax 和 linear 之间的 temperature和topk3.5 weight tying 前言 在 基础学习:(6)中, 在运行和训练代码基础上,向代…

Spark-SQL连接Hive总结及实验

一、核心模式与配置要点 1. 内嵌Hive 无需额外配置,直接使用,但生产环境中几乎不使用。 2. 外部Hive(spark-shell连接) 配置文件:将hive-site.xml(修改数据库连接为node01)、core-site.xml、…

Linux Wlan-四次握手(eapol)框架流程

协议基础 基于 IEEE 802.1X 标准实现的协议 抓包基础 使用上一章文章的TPLINK wn722n v1网卡在2.4G 频段抓包(v2、v3是不支持混杂模式的) eapol的四个交互流程 根据不同的认证模式不同,两者的Auth流程有所不同,但是握手流程基…

web组件和http协议

1.web组件 2.自定义元素 3.影子DOM 4.HTML模板 5.http协议 6.tcp ip协议

软件工程师中级考试-上午知识点总结(下)

6. 知识产权和标准化 软件著作权客体:指的是受软件著作权保护的对象,即计算机程序和相关文档。知识产权具有严格的地域性。不受保护期限制:著名权、修改权、保护作品完整权;注意的是,发表权受保护期限制。专利权在期满…

IO流--字节流详解

IO流 用于读写数据的(可以读写文件,或网络中的数据) 概述: I指 Input,称为输入流:负责从磁盘或网络上将数据读到内存中去 O指Output,称为输出流,负责写数据出去到网络或磁盘上 因…

Cesium学习笔记——dem/tif地形的分块与加载

前言 在Cesium的学习中,学会读文档十分重要!!!在这里附上Cesium中英文文档1.117。 在Cesium项目中,在平坦坦地球中加入三维地形不仅可以增强真实感与可视化效果,还可以​​提升用户体验与交互性&#xff0c…

Java排序算法百科全书:原理、实现与实战指南

一、排序算法全景视图 1. 算法分类体系 graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]B…

开源脚本分享:用matlab处理ltspice生成的.raw双脉冲数据

Author :PNJIE DATE: 2025/04/21 V0.0 前言 该项目旨在使用Matlab处理LTspice的.raw文件,包括动态计算和绘图,部分脚本基于LTspice2Matlab项目: PeterFeicht/ltspice2matlab: LTspice2Matlab - 将LTspice数据导入MATLAB github地址&#x…

(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)

框架:GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装(mac)-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…

Github中项目的公开漏洞合集

前言 最近在搜CVE的时候,意外发现了GitHub Security Advisories。 可能对一些人来说,已经是老东西了。但我还是第一次见到。 觉得挺好用的,就分享出来。 GitHub Security Advisories GitHub Security Advisories 是 GitHub 提供的一项重要…