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微控制器相关的软件组件。这些组件可以包括文件系统、操作系统、通信协议等,你可以选择需要的组件,并进行相应的配置,如设置文件系统参数、配置任务优先级等。这些配置会生成相应的代码,集成到你的项目中,从而简化开发过程。
常见的中间件和软件包包括:
- FATFS:这是一个通用的文件系统模块,支持FAT文件系统,允许在嵌入式系统中读写文件。
- FreeRTOS:这是一个实时操作系统内核,适用于需要多任务处理的嵌入式系统。它提供了任务管理、同步机制、内存管理等功能。
- 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(); /* 启动调度器 */
- osKernelInitialize():这个函数初始化FreeRTOS的内核环境。它设置了一些基本的内核参数,如时间片、任务优先级等,为后续的任务创建和调度做准备。
- MX_FREERTOS_Init():这个函数通常是由STM32CubeMX工具自动生成的,用于创建和管理FreeRTOS任务。它可能会初始化任务堆栈、设置任务优先级、创建任务等。
- 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 标准如何理解? - 一郎哥哥 - 博客园]