FreeRTOS基础篇(三)——搭建linux工程

前言:
   本篇文章介绍如何在linux环境下搭建FreeRTOS工程。

1 linux环境搭建STM32工程

1.1 下载STM32库

  以STM32F10x库为例,下载官方库。STM32地层的操作可以分为三类。

  • 标准外设库(SPL):官方已停止维护。它是对STM32芯片寄存器进行操作的一系列函数的集合。它没有复杂的抽象层,效率很高,但需要开发者对芯片外设和寄存器有一定的了解。
  • 硬件抽象层库(HAL/LL):HAL库是ST目前主推的核心库,旨在解决SPL的可移植性问题。提供了非常高级的API接口(如HAL_UART_Transmit()),极大简化了代码编写。开发者无需深入了解底层寄存器细节即可快速开发。HAL库的API在不同系列的STM32芯片之间高度统一。更换芯片时,应用层代码通常只需少量修改甚至无需修改。由于抽象层较厚,代码量和执行效率相比SPL和LL库要差一些。在中断频繁、时序要求极其苛刻的场景可能需要优化。LL库和HAL库可以混合使用。例如,对性能要求高的部分(如串口中断)使用LL库,其他部分使用HAL库。STM32CubeMX可以配置为同时生成两者。LL库的API非常精简,本质上是对寄存器操作的直接映射,效率极高,几乎与直接操作寄存器或SPL相当。
  • 底层寄存器操作:没有复杂的抽象层,效率很高,但需要开发者对芯片外设和寄存器有一定的了解。
特性 标准外设库 硬件抽象层库 底层库 寄存器操作
抽象程度 中等(寄存器封装) 高(高度抽象) 低(接近寄存器) 无(直接操作)
易用性/开发速度 中等 极高(配合CubeMX) 中等 极低
执行效率 相对较低 非常高(接近SPL) 最高
代码体积 相对较大 非常小 最小
可移植性 差(系列内可移植) 极好(跨系列移植) 一般(系列内或相似系列)
维护状态 已停产 官方主推、持续更新 官方维护、持续更新 N/A
学习难度 中等(需懂外设) 低(快速上手) 中高(需懂外设) 极高
推荐使用场景 老项目维护、高性能需求 新项目、快速开发、初学者 高性能驱动、替代SPL 极端优化、特殊需求

  以STM32F10x为例,下载SPL标准库,在ST32官网 下载 即可,点击下载最新版本的标准外设库。

stm32lib.png

  下载的压缩包为 stsw-stm32054_v3-6-0.zip 。使用以下指令解压。

1
unzip stsw-stm32054_v3-6-0.zip

  实际的项目中,建议首选HAL库,其可维护性、可移植性以及官方长期支持的优势是产品开发的首要考虑。对于性能瓶颈处的关键代码,可以混合使用LL库或甚至直接寄存器操作进行优化。
  本篇文章以主流的HAL库为例,官方更推荐HAL库,可以从官网 下载 STM32F1的HAL库。也可以从github上克隆官方仓库获取HAL库。

1
2
git clone git@github.com:STMicroelectronics/STM32CubeF1.git
git submodule update --init --depth 1

  下载和安装Arm工具。

1
2
sudo apt update
sudo apt install gcc-arm-none-eabi

  设置交叉编译工具链。

1
set(CMAKE_SYSTEM_NAME Generic)

  表示将CMake配置为进行跨平台编译, CMAKE_SYSTEM_NAME 是CMake的特殊变量,用于指定目标系统的名称,通常设置为标准操作系统名称,如 LinuxWindowsDarwin(macOS)等。当设置为 Generic 时,表示目标平台没有标准的操作系统。

1 下载STM32F10x库

  stm32官方提供两种库,标准库和HAL库。

宏定义 用途
USE_STDPERIPH_DRIVER 启用 STM32 标准外设库支持
USE_HAL_DRIVER 启用 STM32 HAL 库支持(用于 STM32Cube)

  克隆STM32CubeF1 HAL库源码,将其clone到 /src/lib/stm32/f10x 目录下,作为子仓库。

2 下载FreeRTOS内核库

  通过指令以下指令获取FreeRTOS内核源码,将其clone到 /src/lib/freertos/Kernel 目录下,作为子仓库。

1
git clone git@github.com:FreeRTOS/FreeRTOS-Kernel.git

3 添加FreeRTOSConfig.h

  在 src/lib/freertos 目录下创建 FreeRTOSConfig.h 文件,内容如下。

1
2
3
4
5
6
```

## 4 添加stm32f1xx_hal_conf.h
  在 **src/lib/stm32** 目录下创建 **stm32f1xx_hal_conf.h** 文件,内容如下。

```c

5 编写CMake

  在工程根目录下编写CMakeLists.txt,内容如下。

1
2
3
4
5
```

  src目录下创建CMakeLists,内容如下。

```cmake

  在