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

嵌入式ARM RISCV toolchain工具 梳理arm-none-eabi-gcc

嵌入式TOOLchain工具 梳理

简介

本文总结和梳理一下一些toolchain的规则和原理,方便后续跨平台的时候,给大家使用toolchain做一个参考。

解释如何理解arm-none-eabi-gcc等含义,以及如何一看就知道该用什么编译器。

当然如果有哪里写的不是很正确的,欢迎评论区纠正,大家讨论讨论看看自己用的编译器什么含义。

toolchain命名规则

首先我们根据最熟悉的arm-none-eabi-gcc 来理解命名规则,最后的gcc是工具,可能是gdb啥其他的,前面的

命名规则为:arch [-vendor] [-os] [-(gnu)eabi]

  • arch - 体系架构,如ARM,MIPS
  • vendor - 工具链提供商(这里如果没有厂商名称常用的是none和Unkonwn)
  • os - 目标操作系统(这里可能是linux,或者其他OS平台等)
  • eabi - 嵌入式应用二进制接口(Embedded Application Binary Interface)

仔细看这个命名规则,可以看到中间的os其实是可选项

第一个参数是arch架构,具体有哪些待会介绍。

第二个参数是vendor 这个具体厂商自己编译的toolchain 我们就不讲了,一般很多小公司会自己定义toolchain,

重点介绍常见的noneunknown

  • none: 通常指特别指明没有特定厂商, 通用的编译器
  • unknown: 这里表示目标平台的 操作系统未知没有特定的操作系统 这个是代码中的默认指,应该是即可能指没有os,也可能指没有厂商(很多可能自己编译,没有设置特定的值,就是该值)

例如:arm-linux-gnueabi-gcc

看这个参数就带了linux的参数代表基于linux平台的编译器,通常用来编译liunx操作系统相关的bin。

GCC源码

所有这些呢都来自于GCC源码:

https://gcc.gnu.org/git/gcc.git

我们来看下arm-none-eabi-gcc

官网

https://developer.arm.com/downloads/-/gnu-rm

官网中有介绍

Features:
All GCC 10.3 features.

在这里插入图片描述

所以大概率是基于10.3.0 的版本进行编译

另外从要下载的内容中可以看到最后一个参数是平台的相关参数,代表你要在windows上跑exe还是在linux上跑非exe的包,这里你要知道你的操作系统,windows只要下载win32即可。linux根据笔记本或者电脑芯片是ARM的还是x86的选择对应的,macos也有。
在这里插入图片描述

我们下载执行一下-v命令

这里有很多内容,具体哪里是我们需要参考的呢,这里有很多,大都是在用gcc编译的时候的参数
在这里插入图片描述

Configured
with:
/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/src/gcc/configure
--build=x86_64-linux-gnu
--host=i686-w64-mingw32
--target=arm-none-eabi
--prefix=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/install-mingw
--libexecdir=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/install-mingw/lib
--infodir=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/install-mingw/share/doc/gcc-arm-none-eabi/info
--mandir=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/install-mingw/share/doc/gcc-arm-none-eabi/man
--htmldir=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/install-mingw/share/doc/gcc-arm-none-eabi/html
--pdfdir=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/install-mingw/share/doc/gcc-arm-none-eabi/pdf
--enable-languages=c,c++
--enable-mingw-wildcard
--disable-decimal-float
--disable-libffi
--disable-libgomp
--disable-libmudflap
--disable-libquadmath
--disable-libssp
--disable-libstdcxx-pch
--disable-nls
--disable-shared
--disable-threads
--disable-tls
--with-gnu-as
--with-gnu-ld
--with-headers=yes
--with-newlib
--with-python-dir=share/gcc-arm-none-eabi
--with-sysroot=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/install-mingw/arm-none-eabi
--with-libiconv-prefix=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/build-mingw/host-libs/usr
--with-gmp=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/build-mingw/host-libs/usr
--with-mpfr=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/build-mingw/host-libs/usr
--with-mpc=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/build-mingw/host-libs/usr
--with-isl=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/build-mingw/host-libs/usr
--with-libelf=/mnt/workspace/workspace/GCC-10-pipeline/jenkins-GCC-10-pipeline-338_20211018_1634516203/build-mingw/host-libs/usr
--with-host-libstdcxx='-static-libgcc
-Wl,-Bstatic,-lstdc++,-Bdynamic
-lm'
--with-pkgversion='GNU
Arm
Embedded
Toolchain
10.3-2021.10'
--with-multilib-list=rmprofile,aprofile

我们用命令arm-none-eabi-gcc -march=?

结果如下

arm-none-eabi-gcc: error: unrecognized -march target: ?
arm-none-eabi-gcc: note: valid arguments are: armv4 armv4t armv5t armv5te armv5tej armv6 armv6j armv6k armv6z armv6kz armv6zk armv6t2 armv6-m armv6s-m armv7 armv7-a armv7ve armv7-r armv7-m armv7e-m armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a armv8.6-a armv8-m.base armv8-m.main armv8-r armv8.1-m.main iwmmxt iwmmxt2
arm-none-eabi-gcc: error: missing argument to '-march='
arm-none-eabi-gcc: fatal error: no input files
compilation terminated.

大概了解这个支持这么多的架构,当然每种架构的芯片都有很多种,这个目前大部分是

ARM

刚才的页面是嵌入式单独的页面,下面我们就来上强度,来个全一点的内容:

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

源码: https://git.gitlab.arm.com/tooling/gnu-devtools-for-arm.git

这里的toolchain 超级多,会不会有选择困难?理解下面几个概念

架构

  • AArch32
    • 是 32 位的 ARM 架构,适用于 ARMv7 及更早版本。
    • 主要用于低功耗、资源受限的嵌入式设备。
    • 一般就是类似于STM32F4,F1等系列的单片机
  • AArch64
    • 是 64 位的 ARM 架构,属于 ARMv8 及更高版本。
    • 提供更大的寻址空间和更高效的指令集。
    • 一般就是类似于RK3588的ARM的64bit的SOC

可执行文件

  • ELF (Executable and Linkable Format)
    • 是一种通用的文件格式,用于可执行文件、目标文件和共享库。
    • 适用于多种架构,包括 32 位和 64 位。
  • EABI (Embedded Application Binary Interface)
    • 是针对嵌入式系统的二进制接口规范。这个体积会更小
    • 定义了数据类型、寄存器使用、堆栈组织等标准。
    • 主要用于 32 位 ARM 架构。

简单理解就是: elf搭配aarch64 支持的架构更大,像64bit的寻址,elf的文件类型也更通用,当然需要的资源和编译出来的bin也就更大。

eabi搭配aarch32 则针对嵌入式的小型的32bit的系统寻址,eabi的接口规范编译出来的也更针对嵌入式,编译出来的会小一些,但是也就适合小型的系统。

  • arm-none-eabi: 嵌入式的stm32之类的,无os的,32bit的MCU
  • arm-none-linux-gnueabihf: 代表工具链生成的可执行文件,是运行在linux操作系统上的。none代表通用
  • aarch64-none-elf: 这个支持更大的64bit的MCU,无os运行的,比如RK3588上直接执行裸机程序
  • aarch64-none-linux-gnu: 这个是生成在linux上执行的bin文件

host主机

host主机就是你当前希望编译器在哪颗CPU上运行,就是你当前用的电脑的架构

host主机分为以下几种:

  • i686: 一种 32 位的 x86 架构,主要用于个人电脑和服务器,例如Pentium Pro、Pentium II、Pentium III、Pentium 4 等, i686 架构已逐渐被 64 位的 x86_64 架构逐步取代,所以不用关心
  • x86_x64: 向后兼容 32 位应用程序,同时支持 64 位应用程序,这个是我们常见的intel和amd的cpu架构
  • aarch64: 通常也有可能,比如你用RK3588当作小电脑来运行。
  • linux/macos/windowns: 接下来就选择你常用的操作系统,通常是windows

所以常用的,就选择windows,ubuntu就选linux

note 这里我们没有看到unknown字样,实际上我觉得这样理解:出现unknown基本都是编译的时候缺省值,不是官方或者正常发布toolchain机构发布的

接下来我们就知道当前如果是windows的话,想编译STM32等裸机的话,大概率用下面的编译器

arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-eabi.zip

如果遇到大型的linux嵌入式,大概率用下面的

arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-linux-gnueabihf.zip

mingw 主要是为了告诉你是在mingw里面进行编译的toolchain

MinGW-w64 是一个开源的编译器工具链,用于在 Windows 平台上开发原生的 C/C++ 程序。 它是 MinGW(Minimalist GNU for Windows)项目的扩展,提供了对 64 位和 32 位程序的支持

macos也分为darwin-x86_64 (intel CPU) 和darwin-arm64 (arm CPU m1)

GNU

另外对于linux平台还有下面的专业术语解释以下:

arm-none-linux-gnueabihf:
使用 硬件浮点(Hard Float),默认浮点运算使用浮点寄存器(-mfloat-abi=hard),性能更好。就是编译的时候,遇到浮点运算会帮你转成使用CPU中的浮点寄存器的汇编。
aarch64-none-linux-gnu:
默认也支持硬件浮点,但通常不需要显式指定浮点 ABI,因为 AArch64 架构本身都支持浮点运算。

gnu种eabihf代表支持硬件浮点,一般FPU,通常linuxarm 32位的话,默认支持硬件浮点寄存器。

GNU什么含义:

GNU 全称:GNU’s Not Unix, GNU 提供了一系列用于开发和编译软件的工具,包括 GCC(GNU 编译器集合)、GDB(GNU 调试器)、Binutils(二进制工具集)等,

通常linux后面都跟着gnu, linux-gnu,估计用到LInux了,就支持更全的GNU

可以看到下面的toolchain,开头也有gnu字样,代表工具链里面的gcc,gdb等集成工具。

arm-gnu-toolchain-14.2.rel1-mingw-w64-x86_64-arm-none-eabi.zip

EABI

EABI(Embedded Application Binary Interface,嵌入式应用二进制接口)是由 ARM 公司及其合作伙伴共同开发的标准。它定义了在 ARM 架构上,编译器、汇编器、链接器等工具如何生成目标文件和可执行文件,以确保不同编译器生成的代码可以在 ARM 系统上互操作。

RISCV

RISCV的比较官方的toolchain如下:

https://github.com/riscv-collab/riscv-gnu-toolchain

从仓库中可以看到,

有以下几个子仓库:

binutils

https://sourceware.org/git/binutils-gdb.git

GCC:

https://gcc.gnu.org/git/gcc.git

glibc:

https://sourceware.org/git/glibc.git

gdb:

https://sourceware.org/git/binutils-gdb.git

从网站https://toolchains.bootlin.com/

大概了解到,组成一个toolchain大概需要以下几个方面的内容:

binutils	2.41
gcc	13.3.0
gdb	14.2
glibc	2.39-74-g198632...
linux-headers	4.19.315

下面讲下这几部分基本的内容

  • binutils:像平时用的除了gcc之外的addr2line, ar, objdump,objcopy,都是用这个仓库生成的bin。
* addr2line: (binutils)addr2line. Convert addresses to file and line.
* ar: (binutils)ar.               Create, modify, and extract from archives.
* c++filt: (binutils)c++filt.	  Filter to demangle encoded C++ symbols.
* cxxfilt: (binutils)c++filt.     MS-DOS name for c++filt.
* dlltool: (binutils)dlltool.	  Create files needed to build and use DLLs.
* nm: (binutils)nm.               List symbols from object files.
* objcopy: (binutils)objcopy.	  Copy and translate object files.
* objdump: (binutils)objdump.     Display information from object files.
* ranlib: (binutils)ranlib.       Generate index to archive contents.
* readelf: (binutils)readelf.	  Display the contents of ELF format files.
* size: (binutils)size.           List section sizes and total size.
* strings: (binutils)strings.     List printable strings from files.
* strip: (binutils)strip.         Discard symbols.
* elfedit: (binutils)elfedit.     Update ELF header and property of ELF files.
* windmc: (binutils)windmc.	  Generator for Windows message resources.
* windres: (binutils)windres.	  Manipulate Windows resources.
  • gdb:gdb 其实也是binutils中的内容,只是gdb是和其他工具并列的,单独文件夹

  • gcc: 这个之前讲了,其实就是生成bin中的gcc.exe的源码文件,用来编译出.o之类的,除了GCC还有个llvm

  • glibc: 这个是libc部分, 对于linux,基本都是用glibc作为libc的内容。比较大的就是glibc,主要内容包含

    ​ libc的内容参考: https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/libc/introduction

    ​ 大致就是我们平时用的一些类似于memcpy,strcpy等库函数的头文件和实现,头文件基本是相似的,实现很多不同有以下几种主流的:

    • Newlib:https://sourceware.org/git/newlib-cygwin.git 这个是ARM官方嵌入式32方面的默认libc
    • picolibc: https://github.com/picolibc/picolibc 这个也是一款适合嵌入式STM32的小型的libc,zephyr在推广和使用
    • glibc: https://sourceware.org/git/glibc.git 这个是linux官方所用的GNU的libc,大而全,出现在linux平台上
    • uclibc: https://github.com/wbx-github/uclibc-ng.git 与 glibc 兼容性较好 支持多种架构, LGPLv2.1
    • musl: https://git.musl-libc.org/cgit/musl , 标准化程度高轻量级和高效 许可证友好 :采用 MIT 许可证
  • linux-headers 这个就不介绍了,根据linux系统的版本来,通常是一些linux系统的头文件。

从下面的途中看出,elf用的是newlib, glibc就是glibc,musl就是musl libc
在这里插入图片描述

LLVM

LLVM是和GCC并列的东西,你可以认为GCC的竞品,源码如下:

https://github.com/llvm/llvm-project/tree/main

LLVM已经被Apple、Microsoft、Google、Facebook等各大公司采用。

LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
在这里插入图片描述

LLVM的编译主要用clang 不是gcc了

它的编译汇编都是用的clang,前缀是"llvm-"

PREFIX = 'llvm-'
CC = 'clang'
AS = 'clang'
AR = PREFIX + 'ar'
CXX = 'clang++'
LINK = 'clang'

llvm是用来替代gcc的。

LIBC

下面列出一些常见的libc的使用场景和特点。

glibc

  • 特点 :功能全面,包含大量标准和扩展功能;兼容性好,遵循 POSIX、ISO C 等标准;支持多种硬件架构和操作系统;性能优化较好,适用于通用计算场景。
  • 使用场景 :广泛应用于各种主流 Linux 发行版,如桌面、服务器等,当需要使用丰富的标准库函数和良好的兼容性时,glibc 是常见选择。

musl

  • 特点 :轻量级,代码量小、资源占用少;严格遵循 POSIX 和 ISO C 标准,注重代码正确性和简洁性;许可证友好,采用 MIT 许可证,适合商业应用。
  • 使用场景 :适用于对标准化要求高、资源受限的嵌入式系统,如物联网设备、小型嵌入式设备等,也适用于追求代码简洁高效、对启动速度和执行效率有严格要求的场景。

uClibc-ng

  • 特点 :可移植性强,支持多种架构包括无内存管理单元的处理器;可配置性高,可根据需求裁剪功能模块;与 glibc 兼容性较好,大多数支持 glibc 的应用只需重新编译即可在 uClibc-ng 上运行。
  • 使用场景 :常用于资源受限的嵌入式 Linux 系统,如物联网设备、路由器、智能家电等,能有效减少系统占用空间,优化启动时间和功耗。

dietlibc

  • 特点 :体积非常小,静态链接的最小程序体积可达到极低水平;注重性能优化,在某些操作上具有较高的效率;主要关注基本的 C 库功能,较少支持复杂的扩展功能。
  • 使用场景 :适用于对程序体积要求极小的嵌入式系统或特定的优化场景,如小型嵌入式设备、对启动速度和程序体积有极致要求的应用。

newlib

  • 特点 :功能较为全面,包含一些适合嵌入式系统的功能,如网络协议栈支持;可移植性好,支持多种嵌入式架构;具有良好的稳定性和可靠性。
  • 使用场景 :常用于开发嵌入式系统,如小型路由器、工业控制设备等,也常用于需要网络功能的嵌入式应用中。

Picolibc

  • 特点 :专为小型嵌入式系统设计,轻量级且高效;基于 Newlib 和 AVR Libc 开发,继承了其优点并进行了优化;支持多种架构,包括 ARM、RISC-V、MIPS 等。
  • 使用场景 :适用于资源有限的嵌入式设备,如物联网设备、智能家居产品、传感器节点、微控制器应用等。

Cosmopolitan Libc

  • 特点 :轻量级、高度可配置;通过模块化和层次化设计,实现跨平台兼容性,可在不同操作系统和硬件平台上无缝切换。
  • 使用场景 :适用于需要跨平台部署的 C 语言应用,如嵌入式系统开发、云计算和分布式系统等

制作和发布toolchain的公司

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

  • sourcery: 西门子http://www.codesourcery.com/ 这个已经不存在了,

  • linaro: 已经不更新 https://releases.linaro.org/components/toolchain/binaries/

参考:

riscv 各种版本GCC

总结

本文基本把toolchain的一些基本参数都讲到了,肯定有一些不足支持,如果大家有各种补充也可以提建议,

不知道对于toolchain大家还有哪些疑问?可以提出来,我可以一一解答。

相关文章:

嵌入式ARM RISCV toolchain工具 梳理arm-none-eabi-gcc

嵌入式TOOLchain工具 梳理 简介 本文总结和梳理一下一些toolchain的规则和原理,方便后续跨平台的时候,给大家使用toolchain做一个参考。 解释如何理解arm-none-eabi-gcc等含义,以及如何一看就知道该用什么编译器。 当然如果有哪里写的不是…...

团体程序设计天梯赛PTA-SHU冲刺赛4. L22-L32

这是4.18 SHU备赛天梯赛的最后一场冲刺赛 10.病毒溯源 1.本题PTA中拓栈后会MTL,不拓栈会报非零返回 所以本题最好用栈模拟递归过程 2.源头得是入度为0的,也就是没有节点指向它 所以得设置inn是否有指向该节点 3.这题用dfs(用bfs的话不同…...

【数据结构与算法】——插入排序

概要 本文将介绍插入排序方法——直接插入、希尔排序 想了解数据结构其他内容,本人主页 恋风诗 获取源码,gitte仓库:mozhengy 正文 1.排序的分类 目前将主要介绍下面几种排序: 后续学习更多内容后会及时更新 2、插入排序 2…...

手撕STL——vector

目录 引言 1,了解 STL 中的 vector 2,先来一个简易版跑起来 2_1,构造函数 2_2,扩容reserve() 2_3,push_back() 2_4,pop_back() …...

新书速览|DeepSeek移动端AI应用开发:基于Android与iOS

《DeepSeek移动端AI应用开发:基于Android与iOS》 1 本书内容 《DeepSeek移动端AI应用开发:基于Android与iOS》深入剖析了DeepSeek平台的架构原理、API调用及开发实践等核心内容,助力读者在Android与iOS移动端高效集成DeepSeek API,打造出契…...

详解STM32时基单元中参数 TIM_ClockDivision 的含义

在 STM32 定时器时基单元配置中,TIM_TimeBaseInitStruct->TIM_ClockDivision 用于设置 定时器时钟的分频系数,主要影响 输入捕获滤波器 和 输出比较同步信号 的时钟分割。以下是其核心作用、参数含义及应用场景的详细解析: 一、核心作用&…...

黑马V11版 最新Java高级软件工程师课程-JavaEE精英进阶课

课程大小:60.2G 课程下载:https://download.csdn.net/download/m0_66047725/90615581 更多资源下载:关注我 阶段一 中台战略与组件化开发专题课程 阶段二 【物流行业】品达物流TMS 阶段三 智牛股 阶段四 千亿级电商秒杀解决方案专题 …...

【Win】 cmd 执行curl命令时,输出 ‘命令管道位置 1 的 cmdlet Invoke-WebRequest 请为以下参数提供值: Uri: ’ ?

1.原因: 有一个名为 Invoke-WebRequest 的 CmdLet,其别名为 curl。因此,当您执行此命令时,它会尝试使用 Invoke-WebRequest,而不是使用 curl。 2.解决办法 在cmd中输入如下命令删除这个curl别名: Remov…...

【k8s系列4】工具介绍

1、虚拟机软件 vmware workstation 2、shell 软件 MobaXterm 3、centos7.9 下载地址 (https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW) 4、上网软件...

设计模式 --- 装饰器模式

装饰模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 优点: 1.灵…...

docker.desktop下安装普罗米修斯prometheus、grafana并看服务器信息

目标 在docker.desktop下先安装这三种组件,然后显示当前服务的CPU等指标。各种坑已踩,用的是当前时间最新的镜像 核心关系概述 组件角色依赖关系Prometheus开源监控系统,负责 数据采集、存储、查询及告警。依赖 Node-Exporter 提供的指标数据。Node-Exporter专用的 数据采集…...

学习设计模式《二》——外观模式

一、基础概念 1.1、外观模式的简介 外观模式的本质是【封装交互、简化调用】; 外观模式的说明:就是通过引入一个外观类,在这个类里面定义客户端想要的简单方法,然后在这些方法里面实现;由外观类再去分别调用内部的多个…...

python中,处理多分类时,模型之间的参数设置

在Python的机器学习库中,处理多分类问题时,不同的模型可能会有不同的参数设置来适应多分类场景。这里列举几个常见模型及相关的多分类参数: 1. Logistic Regression (逻辑回归) 在Scikit-Learn库中,逻辑回归模型可以通过设置mul…...

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(四级)真题

青少年软件编程(Python)等级考试试卷(四级) 分数:100 题数:38 答案解析:https://blog.csdn.net/qq_33897084/article/details/147341407 一、单选题(共25题,共50分) 1. 下列程序段…...

蓝桥杯12. 日期问题

日期问题 原题目链接 题目描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。 小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日 之间。 令小明头疼的是,这些日期采用的格式非常不统一: 有的采用 年/月/日有的采用 月…...

【MATLAB代码例程】AOA与TOA结合的高精度平面地位,适用于四个基站的情况,附完整的代码

本代码实现了一种基于到达角(AOA) 和到达时间(TOA) 的混合定位算法,适用于二维平面内移动或静止目标的定位。通过4个基站的协同测量,结合最小二乘法和几何解算,能够有效估计目标位置,并支持噪声模拟、误差分析和可视化输出。适用于室内定位、无人机导航、工业监测等场景…...

ARINC818协议(五)

1.R_CTL,设置固定的0x44即可 2.Dest_ID:目的地D_ID,如果不需要目的地址,就设置为0;ADVB协议支持 多个视频目的地址,广播通信; 3.cs_ctl在FC-AV上不用 4.source_ID:S_ID [23:0]包含源实体的端口的地址标识;不用就设置为0. ADVB允许…...

国产品牌芯洲科技100V降压芯片系列

SCT2A25采用带集成环路补偿的恒导通时间(COT)模式控制,大大简化了转换器的片外配置。SCT2A25具有典型的140uA低静态电流,采用脉冲频率调制(PFM)模式,它使转换器在轻载或空载条件下实现高转换效率。 芯洲科技100V降压芯片系列提供丰富的48V系…...

遨游科普:三防平板除了三防特性?还能实现什么功能?

在工业4.0浪潮席卷全球的今天,电子设备的功能边界正经历着革命性突破。三防平板电脑作为"危、急、特"场景的智能终端代表,其价值早已超越防水、防尘、防摔的基础防护属性。遨游通讯通过系统级技术创新,将三防平板打造为集通信中枢、…...

边缘计算网关组态功能的定义

边缘计算网关组态功能的定义 边缘计算网关组态是指根据特定的应用场景和需求,对边缘计算网关进行配置和定制的过程。它涵盖了硬件接口的选择、软件功能的设定、通信协议的配置以及数据处理流程的设计等多个方面,旨在使网关设备更加贴合实际应用场景&…...

数据可视化笔记:柱状图

数据可视化笔记:柱状图与饼图 1.1 一、基础配置 在进行数据可视化之前,需要对Matplotlib进行一些基础配置,以确保图表能够正确显示中文以及设置合适的分辨率和大小。 from matplotlib import pyplot as plt import numpy as np# 设置中文字…...

珈和科技:无人机技术赋能智慧农业,精准施肥与病虫害监控全面升级

无人机技术在农业领域的兴起,是现代技术发展为传统农业带来的重要变革。目前, 无人机已成为农业生产中不可或缺的关键工具,在提高粮食产量、改善土壤健康和保护生态环境等方面提供了新的解决方案。珈和科技从无人机的类型、特点和监测系统入手…...

UR5e机器人动力学

机器人动力学研究力与运动之间的关系,核心目标是建立关节力矩与关节位置、速度、加速度的数学关系。动力学模型通常分为: 正向动力学:已知关节力矩,计算末端执行器的运动(加速度)。 逆向动力学:已知期望的运动(位置、速度、加速度),计算所需的关节力矩。 https://www…...

【go】什么是Go语言的GPM模型?工作流程?为什么Go语言中的GMP模型需要有P?

Go语言GMP调度模型详解 一、GMP模型核心概念 Go语言的GMP模型是一种高效的轻量级线程管理调度系统,由三个核心组件构成: G (Goroutine): 轻量级协程,初始栈仅2KB(可动态扩容)用户态调度,创建成…...

X-AnyLabeling开源程序借助 Segment Anything 和其他出色模型的 AI 支持轻松进行数据标记。

一、软件介绍 文末提供源码和程序下载学习 使用 X-AnyLabeling开源程序可以 导入、管理和保存数据。用户可以通过多种方式导入图像和视频文件,包括快捷方式或菜单选项。此外,它还涵盖数据删除、图像切换以及标签和图像数据的保存,以确保高效…...

简易 Python 爬虫实现,10min可完成带效果源码

目录 准备工作 编写爬虫代码 运行爬虫 查看结果 遇到的问题及解决 总结 前言和效果 本文记录了使用 Python 实现一个简单网页爬虫的过程,目标是爬取 quotes.toscrape.com 的名言和作者,并将结果保存到文本文件。以下是完整步骤,包含环境…...

全志H5,NanopiKP1lus移植QT5.12记录

移植步骤 机器环境下载QT5.12.0源码安装交叉编译器修改qmake.conf文件配置编译选项qt5的configure选项说明基本配置选项编译器和链接器选项功能模块配置第三方库集成注意事项 配置过程报错解决配置完成编译过程报错解决编译完成将arm-qt文件夹传送到开发板配置板子环境变量运行…...

Spring Boot 依赖注入与Bean管理:JavaConfig如何取代XML?

大家好呀!今天我们来聊一个超级实用的技术话题 —— Spring Boot 中的依赖注入和Bean管理,特别是JavaConfig是如何一步步取代XML配置的。我知道很多小伙伴一听到"依赖注入"、"Bean管理"这些词就头大,别担心!我…...

AUTOSAR图解==>AUTOSAR_SWS_E2ETransformer

AUTOSAR E2E Transformer详解 基于AUTOSAR标准的端到端通信保护变换器技术解析 目录 1. E2E Transformer概述 1.1 E2E Transformer的作用1.2 功能特点1.3 应用场景限制 2. 模块架构 2.1 架构设计2.2 与其他模块的关系 3. 初始化与状态机 3.1 模块状态流转3.2 初始化与去初始化…...

从Archery到NineData:积加科技驱动数据库研发效能与数据安全双升级

积加科技作为国内领先的企业级数字化解决方案服务商,依托自研的 A4X 数字化平台(https://a4x.io/),专注于为全球范围内的视觉物联网(IoT)设备提供 PaaS/SaaS 服务。致力于运用 AI 技术赋能物联网世界的各类…...

hadoop和Yarn的基本介绍

Hadoop的三大结构及各自作用? Hadoop是一个由Apache基金会开发的分布式系统基础架构,主要用于处理大规模数据集的分布式存储和计算。Hadoop的三大核心结构是HDFS(Hadoop Distributed File System)、MapReduce和YARN(Y…...

神经接口安全攻防:从技术漏洞到伦理挑战

随着脑机接口(BCI)技术的快速发展,神经接口设备已从实验室走向消费市场。然而,2025年曝光的某品牌脑机接口设备漏洞(CVE-2025-3278)引发了行业对神经数据安全的深度反思。本文围绕神经接口安全的核心矛盾&a…...

云轴科技ZStack入选中国人工智能产业发展联盟《大模型应用交付供应商名录》

2025年4月8日至9日,中国人工智能产业发展联盟(以下简称AIIA)第十四次全体会议暨人工智能赋能新型工业化深度行(南京站)在南京召开。工业和信息化部科技司副司长杜广达,中国信息通信研究院院长、中国人工智能…...

SpringBoot项目异常处理

一、异常问题描述 进行添加员工测试的时候,服务端报错, 报错信息如下: java.sql.SQLIntegrityConstraintViolationException:主要就是因为在 employee 表结构中,我们针对于username字段,建立了唯一索引,添…...

机器学习05-CNN

CNN(卷积神经网络)学习文档 一、引言 卷积神经网络(Convolutional Neural Network,CNN)是深度学习中的一种重要网络结构,在图像识别、计算机视觉等领域取得了巨大成功。CNN 的设计灵感来源于生物视觉系统…...

Java Web 之 Servlet 100问

Filter 是什么? 在Java Web开发中,Filter(过滤器)是一种用于在请求到达目标资源(如Servlet、JSP)之前或响应返回客户端之前进行预处理和后处理的组件。Filter可以拦截请求和响应,执行特定的操作…...

z-library电子图书馆最新地址的查询方法

对于喜欢读书的伙伴们,应该都听说过z站(z-library),优点多多,缺点就是地址不稳定,经常会变化网站地址。然后我最近发现了一个工具,可以不间断更新官方可用的z站地址:电子书最新地址...

PyCharm入门导览

一、项目视图 项目视图位置如下所示: 项目视图是主要工具窗口之一。它包含项目目录、SDK特定的外部库和临时文件。点击带条纹的按 钮可以预览演示项目。也可以按Alt 1 打开。 二、Python解释器 点击右下角项目的名字,可以快速进入【Python解释器】界面…...

算法题(127):最大子段和

审题: 本题需要我们找到n个整数中连续且非空的最大子段和 思路: 方法一:前缀和 我们的思路是将每个索引位置的最大子段和求出,然后用answer进行max维护,最后输出answer即可 最大子段和怎么求? 子段和 f[i]…...

物联网分层架构全解析:从感知到应用的智能生态构建

物联网分层架构一般可细分为感知层、网络层、平台层和应用层,以下是各层更详细的介绍: 一、感知层 1.功能 数据采集:利用各类传感器对物理世界的各种信息进行采集,包括环境参数(如温度、湿度、光照、气压等&#xf…...

系统架构师2025年论文通用模板

搭建自己的模板 1、项目选择与实施建议整理 ‌一、项目选择标准‌ ‌金额与周期要求‌:优先选择金额在 ‌200万以上‌ 的中大型商业项目,研发周期建议 ‌不少于8个月‌‌。避免选择小型项目(如金额低于100万、周期短于1年)‌。 …...

Flink 2.0 编译

文章目录 Flink 2.0 编译第一个问题 java 版本太低maven 版本太低maven 版本太高开始编译扩展多版本jdk 配置 Flink 2.0 编译 看到Flink2.0 出来了,想去玩玩,看看怎么样,当然第一件事,就是编译代码,但是没想到这么多问…...

Java线程的几种状态

线程状态我们在此介绍六种线程状态 1.NEW 2.RUNNABLE 3.TIMED_WAITING 4.BLOCKED 5.WAITING 6.TERMINATED 1.初始状态 (NEW) 当一个线程对象被创建但尚未调用 start() 方法时,线程处于初始状态。此时,线程还没有开始执行。 通俗的讲就是安排了工作但是…...

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(一级)真题

青少年软件编程(Python)等级考试试卷(一级) 分数:100 题数:37 答案解析:https://blog.csdn.net/qq_33897084/article/details/147335019?spm1001.2014.3001.5501 一、单选题(共25题&#xff0…...

「数据可视化 D3系列」入门第十章:饼图绘制详解与实现

饼图绘制详解与实现 一、饼图绘制核心知识1. d3.arc() 弧形生成器2. d3.pie() 布局函数3. arc.centroid() 中心点计算4. 颜色方案 二、饼图实现代码小结核心知识点下章预告:力导向图 一、饼图绘制核心知识 1. d3.arc() 弧形生成器 功能: 生成圆形、扇形…...

三维点拟合平面ransac c++

理论 平面的一般定义 在三维空间中,一个平面可以由两个要素唯一确定: 法向量 n(a,b,c):垂直于平面的方向 平面上一点 平面上任意一点 p(x,y,z) 满足: ( p − p 0 ) ∗ n 0 (p - p0) * n 0 (p−p0)∗n0 即 a ( x − x 0 ) …...

第六章:6.6输入以下的杨辉三角形,要求输出10行

//输入以下的杨辉三角形&#xff0c;要求输出10行 #include<stdio.h> int main() {int a[10][10] { 0 };int i 0, j 0;for (i 0; i < 10; i){for (j 0; j < 10; j){if (j 0){a[i][j] 1;}else if (i j){a[i][j] 1;}else{a[i][j] a[i - 1][j - 1] a[i - …...

初识Redis · C++客户端string

目录 前言&#xff1a; string的API使用 set get&#xff1a; expire: NX XX: mset,mget&#xff1a; getrange setrange: incr decr 前言&#xff1a; 在前文&#xff0c;我们已经学习了Redis的定制化客户端怎么来的&#xff0c;以及如何配置好Redis定制化客户端&…...

React 事件处理基础

React 中最常见的两个需求&#xff0c;一个是列表渲染&#xff0c;另一个就是绑定点击事件。 这一篇就是从最基础的按钮点击开始&#xff0c;分四个阶段&#xff0c;逐步理解 React 中事件的写法和参数传递方式。 &#x1f4cd;阶段一&#xff1a;最简单的点击事件 function A…...

插入排序和希尔排序

今天给小伙伴们分享两个比较基础的排序算法&#xff0c;插入排序和希尔排序&#xff0c;这两个排序算法之间联系还是挺多的&#xff0c;所以放在一起。希尔排序可以看作是插入排序的升级版&#xff0c;在面对一些更为复杂的场景时&#xff0c;希尔排序的效率往往要比插入排序高…...