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

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

1 linux环境搭建STM32工程

1.1 下载STM32库

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

  • 标准外设库(SPL, Standard Peripheral Library):官方已停止维护。它是对STM32芯片寄存器进行操作的一系列函数的集合。它没有复杂的抽象层,效率很高,但需要开发者对芯片外设和寄存器有一定的了解。
  • 硬件抽象层库(HAL, Hardware Abstraction Layer Library):HAL库是ST目前主推的核心库,旨在解决SPL的可移植性问题。提供了非常高级的API接口(如HAL_UART_Transmit()),极大简化了代码编写。开发者无需深入了解底层寄存器细节即可快速开发。HAL库的API在不同系列的STM32芯片之间高度统一。更换芯片时,应用层代码通常只需少量修改甚至无需修改。由于抽象层较厚,代码量和执行效率相比SPL和LL库要差一些。在中断频繁、时序要求极其苛刻的场景可能需要优化。LL库和HAL库可以混合使用。例如,对性能要求高的部分(如串口中断)使用LL库,其他部分使用HAL库。STM32CubeMX可以配置为同时生成两者。
  • 底层库(LL, Low-Layer Library) : LL库的API非常精简,本质上是对寄存器操作的直接映射,效率极高,几乎与直接操作寄存器或SPL相当。
  • 底层寄存器操作:没有复杂的抽象层,效率很高,但需要开发者对芯片外设和寄存器有一定的了解。
特性 标准外设库(SPL) 硬件抽象层库(HAL) 底层库(LL) 寄存器操作
抽象程度 中等(寄存器封装) 高(高度抽象) 低(接近寄存器) 无(直接操作)
易用性/开发速度 中等 极高(配合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 时,表示目标平台没有标准的操作系统。