当前位置: 首页 > news >正文

FreeRTOS-rust 编译分析

目录介绍

FreeRTOS-rust
├── .cargo						# 对 cargo 本身的配置
│   └── config.toml
├── Cargo.toml					# 对当前工作空间的配置
├── freertos-cargo-build	    # 负责对 freertos 源码进行编译
│   ├── Cargo.toml				# 对当前 package 进行配置
│   └── src
│       └── lib.rs
├── freertos-rust				# 负责编译 freertos 的 rust 接口层
│   ├── Cargo.toml				# 对当前 package 进行配置
│   ├── build.rs				# package 编译前自动调用的脚本
│   └── src						# 适配层源码
│       ├── allocator.rs
│       ├── base.rs
│       ├── critical.rs
│       ├── delays.rs
│       ├── event_group.rs
│       ├── freertos			# freertos C 接口适配层和实现的钩子函数
│       │   ├── ports
│       │   │   └── arm
│       │   │       └── hooks.c
│       │   └── shim.c
│       ├── hooks.rs
│       ├── isr.rs
│       ├── lib.rs
│       ├── mutex.rs
│       ├── patterns
│       │   ├── compute_task.rs
│       │   ├── mod.rs
│       │   ├── processor.rs
│       │   └── pub_sub.rs
│       ├── portmacro.h
│       ├── prelude
│       │   ├── mod.rs
│       │   └── no_std.rs
│       ├── queue.rs
│       ├── semaphore.rs
│       ├── shim.rs
│       ├── task.rs
│       ├── timers.rs
│       ├── units.rs
│       └── utils.rs
├── freertos-rust-examples			# freertos 应用示例
│   ├── Cargo.toml					# 对当前 package 进行配置
│   ├── FreeRTOS-Kernel				# freertos 内核C源码
|		├── freertos-addons			# freertos 扩展库C++源码(无需关注)
│   ├── build.rs					# package 编译前自动调用的脚本
│   └── examples					# 各平台的rust freertos 应用开发示例
│       ├── linux
│       ├── nrf9160
│       ├── stm32-cortex-m3
│       ├── stm32-cortex-m4-blackpill
│       └── win
└── publish-all.sh

框架介绍

  FreeRTOS-rust 的整体框架分为三大块 freertos-cargo-buildfreertos-rustfreertos-rust-examples
  freertos-cargo-build 负责对项目中所有 C语言代码的编译,包括 FreeRTOS-Kernel 内核源码,freertos C 适配层接口以及 freertos 各种钩子函数实现,内部利用cc crate以及build.rs文件中提供的信息,将C语言代码打包为静态库。
  freertos-rust 中包括了 freertos 的C适配层接口和钩子函数实现,以及转换为 rust 语言的对外接口,应用开发使用的 rust freertos 接口均来自这里。
  freertos-rust-examples 中包括了 freertos 的C语言内核源码以及各平台的 rust 应用示例。

编译体系

  FreeRTOS-rust 项目中 C语言部分和各 rust package 的编译都是通过 cargo 工具完成,主要参与的文件有 cargo 配置文件(config.toml),项目 workspace 和各个 package 配置文件(Cargo.toml),以及编译依赖脚本(build.rslib.rs)。

cargo 配置文件

目录:./FreeRTOS-rust/.cargo/config.toml
  config.toml 中的配置是对 cargo 工具本身的配置,只会对当前项目生效,可以对项目配置一些默认的行为,例如此处设置了目标架构为 arm,目标 os 为 none,那么就可以在项目中使用 CARGO_CFG_TARGET_ARCHCARGO_CFG_TARGET_OS 环境变量来进行条件判断。

# 配置 CARGO_CFG_TARGET_ARCH 宏为arm, CARGO_CFG_TARGET_OS 宏为none
[target.'cfg(all(target_arch = "arm", target_os = "none"))']# 配置传递给 rust 编译器传递额外的编译参数
rustflags = [# LLD (shipped with the Rust toolchain) is used as the default linker"-C", "link-arg=-Tlink.x",# if you run into problems with LLD switch to the GNU linker by commenting out# this line# "-C", "linker=arm-none-eabi-ld",# if you need to link to pre-compiled C libraries provided by a C toolchain# use GCC as the linker by commenting out both lines above and then# uncommenting the three lines below# "-C", "linker=arm-none-eabi-gcc",# "-C", "link-arg=-Wl,-Tlink.x",# "-C", "link-arg=-nostartfiles",
]# 配置默认工具链版本
[rustup]
toolchain = "nightly"# 设置编译的目标平台,也可以通过 cargo build --target <name> 传递,设置到 TARGET 环境变量
[build]
# Pick a target or use --target <name>
# target = "x86_64-pc-windows-gnu" # Windows GNU Toolchain
# target = "x86_64-pc-windows-msvc" # Windows MSVC Toolchain (no debugging)
# target = "thumbv7m-none-eabi"    # Cortex-M3
# target = "thumbv7em-none-eabihf" # Cortex-M4

workspace 配置文件

目录:./FreeRTOS-rust/ Cargo.toml
  一个工作空间是由多个 package 组成的集合,共享同一个 Cargo.lock 文件、输出目录 target 和一些设置(例如 profiles : 编译器设置和优化)。工作空间由项目最外层的带有 [workspace] 项的 Cargo.toml 文件标识。
  此处设置了工作空间成员的名称,每个成员下面必须要有自己的 Cargo.toml,并设置了整个工作空间在release 编译模式下的优化情况。

# 虚拟清单工作空间
[workspace]# 工作空间成员
members = ["freertos-rust","freertos-cargo-build","freertos-rust-examples"
]# 设置工作空间release时的优化情况
[profile.release]
codegen-units = 1 # better optimizations
# debug = true # symbols are nice and they don't increase the size on Flash
lto = true # better optimizations
# opt_level=3

package 配置文件

freertos-cargo-build 配置文件

  这里的配置文件主要是设置当前 package 打包成静态库,静态库的默认名称为 freertos-cargo-build.rlib ,以便被其他 rust 代码调用进行 C代码编译。 并且配置C代码编译器依赖包 ccwalkdir

[package]
name = "freertos-cargo-build"
description = """
Utility lib for building & using FreeRTOS in rust projects inside the build.rs.
"""
version = "0.1.1"
authors = ["Tobias Kaupat <tk@lobaro.de>"]
edition = "2018"
license = "MIT"
readme = "README.md"
repository = "https://github.com/lobaro/FreeRTOS-rust"# 默认需要打包成 freertos-cargo-build.rlib 静态库
[lib]# 配置package依赖的包
[dependencies]
cc = "1.0.52"
walkdir = "2.3.1"

   freertos-cargo-build/src/lib.rs 的作用是收集项目中所有的 C文件和头文件目录,并实现 pub fn compile(&self) -> Result<(), Error> 函数,在函数中调用 cc::Build::new().try_compile(“freertos”) 进行 C语言静态库的生成,这样在其他 rust 文件中就可以调用 compile 来完成C语言文件的编译了。

freertos-rust 配置文件

  这个配置文件中设置了 package 编译为库后的名称为 freertos_rust,编译入口文件在 src/lib.rs 中,并在编译入口文件中根据 [features] 的配置决定需要启用哪些模块。这里编译产生的库将会被 rust 应用所使用,以便使用 FreeRTOS 的功能。

[package]
name = "freertos-rust"
version = "0.1.2"
authors = ["Tobias Kaupat <tk@lobaro.de>"]
edition = "2018"
description = """
Create to use FreeRTOS in rust projects.
The freertos-cargo-build crate can be used to build and link FreeRTOS from source inside build.rs.
"""
keywords = ["FreeRTOS", "embedded", "demo", "library"]
license = "MIT"
readme = "README.md"
repository = "https://github.com/lobaro/FreeRTOS-rust"
links = "freertos"# 设置静态库的名称为 freertos_rust.rlib, 编译入口文件在 src/lib.rs 中
[lib]
name = "freertos_rust"
path = "src/lib.rs"# 配置启用的特性,也就是配置哪些模块生效
[features]
default = ["allocator", "sync", "time", "hooks", "interrupt", "delete_task"]
allocator = []
sync = ["interrupt"]
time = ["interrupt"]
hooks = []
interrupt = []
cpu_clock = []
delete_task = []

freertos-rust-examples 配置文件

  此配置需要先设置编译依赖的源文件路径,所以在工作成员中 freertos-cargo-build 优先被编译,生成C编译器,用于后期 C代码的编译。然后设置一般依赖的源文件路径,所以 FreeRTOS 的 rust 适配层 freertos-rust 也被优先编译,作为静态库被后期的应用代码使用。其次就是设置对应平台的硬件依赖库。

[package]
name = "freertos-rust-examples"
version = "0.1.1"
authors = ["Tobias Kaupat <tk@lobaro.de>"]
edition = "2018"
description = """
Create to use FreeRTOS in rust projects. It contains binaries for demos on some architecutres.
"""
keywords = ["FreeRTOS", "embedded", "demo", "examples"]
repository = "https://github.com/lobaro/FreeRTOS-rust"# 配置普通依赖的源码路径,所以freertos-rust也需要被优先编译
[dependencies]
freertos-rust = {path = "../freertos-rust"}# 根据 config.toml 配置设置依赖包
[target.'cfg(target_arch = "arm")'.dependencies]
cortex-m = {version = "0.7.7", features = ["critical-section-single-core"]}
cortex-m-rt = "0.7.3"# 根据config.toml 配置或 --target <triple> 的配置设置依赖包
# Example: stm32-cortex-m3, [target.<triple>.dependencies] triple form cargo build --target thumbv7m-none-eabi
# or form .cargo/config.toml  [build] target = "thumbv7m-none-eabi"
[target.thumbv7m-none-eabi.dependencies]
nb = "0.1.2"
embedded-hal = "0.2.3"
panic-halt = "0.2.0"
stm32f1xx-hal = {version = "0.10.0", features = ["rt", "stm32f103"], default-features = false}# 配置编译依赖的源码路径,所以在工作成员中 freertos-cargo-build 优先被编译
[build-dependencies]
freertos-cargo-build = {path = "../freertos-cargo-build"}

🌀路西法的个人博客拥有更多美文等你来读。

相关文章:

FreeRTOS-rust 编译分析

目录介绍 FreeRTOS-rust ├── .cargo # 对 cargo 本身的配置 │ └── config.toml ├── Cargo.toml # 对当前工作空间的配置 ├── freertos-cargo-build # 负责对 freertos 源码进行编译 │ ├── Cargo.toml # 对当前 package 进行配置 │ └…...

【解决方法】vite-plugin-svg-icons使用中出现问题[vite] Cannot find package ‘fast-glob‘

问题长这样&#xff1a; 参考文章&#xff1a;https://medium.com/wumeng9028/vite-plugin-svg-icons-error-cannot-find-package-fast-glob-8cb03d19c0ac 解决方法&#xff1a;pnpm add fast-glob -D package.json {"vite-plugin-svg-icons": "2.0.1"…...

[Qt] 使用QUndoStack运行到cmd->isObsolete()崩溃

redo/undo中又push了 崩溃情况崩溃原因解决方法 崩溃情况 在正常调用QUndoStack的redo/undo时&#xff0c;崩溃在了这里 unknown:0 QWidget: Cannot create a QWidget without QApplication. 崩溃原因 在正常调用QUndoStack的redo/undo时&#xff0c;因为自身的逻辑处理&a…...

大白话实战Sentinel

Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…...

DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门

1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second&#xff0c;每秒浮点运算次数&#xff0c;用来衡量硬件性能。 FLOPs&#xff1a;floating point of operations&#xff0c;是浮点运算次数&#xff0c;用来衡量算法、模型的复杂度。 GFLOPS&#xff…...

SprutCAMX16数控软件介绍

SprutCAM X 16 是一款功能强大的CAM&#xff08;计算机辅助制造&#xff09;软件&#xff0c;专为数控机床编程和制造过程优化设计。它广泛应用于机械加工、模具制造、3D打印等领域&#xff0c;支持多轴加工、车铣复合、机器人加工等多种加工方式。以下是SprutCAM X 16的主要特…...

Miniconda + VSCode 的Python环境搭建

目录&#xff1a; 安装 VScode 安装 miniconda 在VScode 使用conda虚拟环境 运行Python程序 1.安装 vscode 编辑器 官网链接&#xff1a;Visual Studio Code - Code Editing. Redefined 下载得到&#xff1a;&#xff0c;双击安装。 安装成功…...

TRELLIS 部署笔记

目录 依赖项安装 kaolin安装&#xff1a; 安装和运行报错解决 u2net.onnx 下载 解决方法&#xff0c;就是自行下载&#xff0c;然后拷贝到目录/root/.u2net bash测试u2net&#xff1a; 报错GaussianRasterizationSettings.__new__() got an unexpected keyword argument…...

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…...

Visual Studio Code 集成 Baidu Comate

文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标&#xff0c;然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮&#xff0c;等待安装完毕…...

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件&#xff0c;以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性&#xff0c;如颜色、字体大小、样式和粗细。…...

Kafka消息服务之Java工具类

注&#xff1a;此内容是本人在另一个技术平台发布的历史文章&#xff0c;转载发布到CSDN&#xff1b; Apache Kafka是一个开源分布式事件流平台&#xff0c;也是当前系统开发中流行的高性能消息队列服务&#xff0c;数千家公司使用它来实现高性能数据管道、流分析、数据集成和关…...

迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存

还在为寻找优质3D打印模型而发愁&#xff1f;快来迪威模型网&#xff08;https://www.3dwhere.com/&#xff09;&#xff0c;一个集前沿科技与无限趣味于一体的免费3D打印宝藏平台&#xff01; 踏入迪威模型网&#xff0c;仿佛开启一场未来科技之旅。其“3D打印”专区&#xff…...

ECharts极简入门

ECharts 是一个基于 JavaScript的开源可视化图表库&#xff0c;广泛应用于数据可视化的场景中&#xff0c;支持多种图表类型&#xff0c;如柱状图、折线图、饼图、散点图、雷达图等&#xff0c;且具有强大的自定义功能。 1. ECharts 基本使用 首先需要引入 ECharts 库&#xf…...

PHP培训机构教务管理系统小程序源码

&#x1f511; 培训机构教务管理系统——智慧教育&#xff0c;高效管理新典范 &#x1f680; 这款教务管理系统&#xff0c;是基于前沿的ThinkPHP框架与Uniapp技术深度融合&#xff0c;匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙&#xff0c;专为…...

JAVA学习第五天

接口的变量定义固定为静态变量 接口里面只能有抽象方法&#xff0c;且不能有构造方法 如果不重写tostring方法&#xff0c;会打印没有价值的信息...

pnpm和npm安装TailwindCss

npm下载及初始化来自Tailwind官方文档 npm下载&#xff1a; npm install -D tailwindcss npm初始化Tailwind&#xff1a; npx tailwindcss init pnpm下载&#xff1a; pnpm add -D tailwindcss3.4.1 postcss autoprefixer pnpm初始化Tailwind&#xff1a; pnpm exec tailwindc…...

【云安全】云原生-K8S(四)安全问题分析

Kubernetes&#xff08;K8S&#xff09;因其强大的容器编排能力成为了云计算和微服务架构的首选&#xff0c;但同时也带来了复杂的安全挑战。本文将概述K8S的主要安全问题&#xff0c;帮助安全工程师理解潜在威胁&#xff0c;并采取相应的防护措施。 K8S 攻击面概览 下面两张…...

Cloud之快照存储(Cloud Snapshot Storage)

Cloud之快照存储 一、什么是快照 1. 快照的定义 快照&#xff08;Snapshot&#xff09;是一种记录某一时刻数据状态的技术。在计算机存储和虚拟化环境中&#xff0c;快照能够将文件系统或虚拟机的状态保存下来&#xff0c;以便以后能够回溯到某一特定时间点。快照通常用于备…...

cs106x-lecture11(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture11 (以下皆使用SPL实现&#xff0c;非STL库&#xff0c;后续课程结束会使用STL实现) 1、diceRolls Write a recursive function named diceRolls accepts an integer representing a number of 6-sided dice to roll, and output all possibl…...

从MCU的PWM寄存器到电机转动:手把手配置STM32的SVPWM(附代码避坑指南)

STM32高级定时器实现SVPWM全流程&#xff1a;从寄存器配置到电机转动实战 引言&#xff1a;为什么工程师需要掌握SVPWM的MCU级实现&#xff1f; 当你已经理解SVPWM的数学原理和矢量合成概念后&#xff0c;最迫切的问题往往是如何在真实的STM32芯片上实现它。不同于理论推导&…...

一文讲清,设备维护是什么意思?企业为什么要重视设备维护?

设备维护是企业生产运营中绝对绕不开的核心环节&#xff0c;它直接关系到设备的运行效率与使用寿命。科学的设备维护管理不仅能有效预防设备故障&#xff0c;还能通过预防性维护策略降低停机风险&#xff0c;保障生产连续性。本文将系统解读设备维护的定义、重要性及实施方法&a…...

OpCore-Simplify:重塑黑苹果配置体验的智能配置生成开源自动化工具

OpCore-Simplify&#xff1a;重塑黑苹果配置体验的智能配置生成开源自动化工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCore配…...

量子比特态矢量模拟的内存爆炸难题,如何用RAII+SIMD+稀疏张量压缩将内存占用降低92%?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;量子比特态矢量模拟的内存爆炸难题 在经典计算机上模拟 n 个量子比特的通用量子电路时&#xff0c;系统状态必须用 $2^n$ 维复向量表示——即希尔伯特空间中的态矢量。当 n 增至 30&#xff0c;所需内存…...

芯片面积快被SRAM占了一半?资深工程师教你从DFT/BIST到形状规划的五大实战遴选心法

芯片SRAM面积优化实战&#xff1a;从架构设计到物理实现的五大决策法则 当一颗7nm芯片中SRAM占比突破40%时&#xff0c;工程师面对的早已不是简单的存储单元选择问题&#xff0c;而是一场关于PPA&#xff08;性能、功耗、面积&#xff09;的精密博弈。某次流片后分析显示&#…...

告别MobileNet?手把手教你用MobileViT在iPhone上跑图像分类(附完整代码)

MobileViT实战指南&#xff1a;在iPhone上实现高效图像分类的完整方案 1. 移动端视觉模型的演进与选择 移动设备上的计算机视觉应用正经历着从传统CNN到混合架构的转型。过去五年里&#xff0c;我们看到MobileNet系列主导了移动端视觉任务&#xff0c;其深度可分离卷积的设计理…...

深入IgH EtherCAT DC同步:从‘主站参考’到‘从站参考’的时钟优化实践

深入IgH EtherCAT DC同步&#xff1a;从‘主站参考’到‘从站参考’的时钟优化实践 在工业自动化领域&#xff0c;EtherCAT因其卓越的实时性能而广受欢迎&#xff0c;而分布式时钟&#xff08;DC&#xff09;同步机制则是实现高精度控制的核心。传统的IgH主站实现默认采用主站时…...

CH582单片机SysTick定时器实战:1ms精准延时与串口打印的保姆级教程

CH582单片机SysTick定时器实战&#xff1a;1ms精准延时与串口打印的保姆级教程 在嵌入式开发中&#xff0c;精准的延时控制和调试信息输出是每个开发者必须掌握的基本功。CH582作为一款基于RISC-V架构的蓝牙MCU&#xff0c;其内置的SysTick定时器为我们提供了实现毫秒级延时的硬…...

Excel高效使用技巧(三):公式与函数实战:常用函数深度解析与错误排查

公式写得好,下班走得早;函数用得妙,加薪来得快。 如果说Excel是一座城市,那么公式和函数就是这座城市的交通网络。用得好,四通八达、畅通无阻;用不好,堵车堵到怀疑人生。 今天这篇文章,咱们不玩虚的,直接上干货——从高频函数的深度解析,到公式错误的排查技巧,手把…...

5分钟快速上手:Mem Reduct内存管理工具终极指南

5分钟快速上手&#xff1a;Mem Reduct内存管理工具终极指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你的Wind…...