0

0

c++ 嵌入式开发入门 c++如何在arm等嵌入式平台上开发

月夜之吻

月夜之吻

发布时间:2026-03-18 19:37:31

|

157人浏览过

|

来源于php中文网

原创

嵌入式C++开发第一步是正确选择和配置交叉编译工具链:Cortex-M系列用arm-none-eabi-g++,Linux ARM板用arm-linux-gnueabihf-g++;需手动处理标准库依赖、全局对象构造、调试输出等底层问题。

c++ 嵌入式开发入门 c++如何在arm等嵌入式平台上开发

交叉编译工具链怎么选和配置

嵌入式 C++ 开发第一步不是写代码,是让代码能跑在目标芯片上——这靠交叉编译工具链。选错或配错,g++ 一跑就报 cannot execute binary file: Exec format error,或者链接时找不到 libstdc++.a

主流方案就两个:arm-none-eabi-g++(裸机/RTOS 场景)和 arm-linux-gnueabihf-g++(带 Linux 的 ARM 板)。别用宿主机的 g++ 直接编译,它生成的是 x86_64 指令,ARM 根本不认识。

  • 确认芯片架构和 OS:Cortex-M3/M4 用 arm-none-eabi-;Raspberry Pi 或 Allwinner A64 用 arm-linux-gnueabihf-
  • 从官网下载预编译包(如 gcc-arm-none-eabi),别自己编译——容易漏 --with-newlib--disable-multilib
  • bin/ 加进 $PATH 后,验证:arm-none-eabi-g++ --versionarm-none-eabi-g++ -dumpmachine 输出必须含 arm-none-eabi
  • Makefile 里显式指定:CXX = arm-none-eabi-g++,别依赖 $(CXX) 默认值

C++ 标准库在裸机上能不能用

能,但得手动接管、裁剪。裸机没有 mallocprintf、进程调度,标准库默认行为全失效。直接 #include <iostream> 会链接失败,报 undefined reference to `_sbrk'`__errno'

根本原因是:libstdc++ 依赖底层 C 库(newlib 或 picolibc)提供系统调用桩。你得自己实现或禁用这些桩。

立即学习C++免费学习笔记(深入)”;

  • 禁用异常和 RTTI:编译加 -fno-exceptions -fno-rtti,否则 std::vector 构造可能隐式抛异常,裸机没 handler 就硬复位
  • 重载全局 operator new:指向你的静态内存池,别让它偷偷调 malloc
  • -specs=nosys.specs(newlib)或 -specs=nano.specs(减小尺寸),避免链接未实现的 syscall
  • std::arraystd::span 安全;std::stringstd::vector 要小心——确保 allocator 是你可控的

如何让 C++ 对象在启动时可靠构造

嵌入式启动流程不走 glibc 的 __libc_start_main,全局对象构造器(.init_array 段)不会自动执行。常见现象:static MyClass obj; 的构造函数根本没被调,成员变量还是零值。

甲骨文AI协同平台
甲骨文AI协同平台

专门用于甲骨文研究的革命性平台

下载

解决路径只有一条:手写启动代码,在 main() 之前显式调用构造器数组。

  • 确认链接脚本里有 .init_array 段,并且它被映射到 RAM 可读写区域
  • 在汇编启动文件(如 startup.s)中,调用 __libc_init_array(newlib 提供)或自己遍历 __init_array_start__init_array_end
  • 如果用 CMake,加 target_link_libraries(myapp PRIVATE -u __libc_init_array) 防止链接器丢掉该符号
  • 避免在全局对象构造器里做硬件初始化(比如开 UART)——此时时钟、GPIO 可能还没配好,顺序不可控

调试时 printf 为什么没输出,又该怎么替代

因为 printf 依赖 fputc 实现,而裸机没文件系统也没 stdout。直接调用只会卡在 write 系统调用里,或者返回 -1 且无提示。

真正可用的调试输出,必须绑定到具体外设(UART、SWO、ITM),且绕过 libc 的缓冲逻辑。

  • __io_putchar(newlib)或 fputc 重定向到 UART 发送寄存器,记得关中断或加临界区保护
  • SWO(Serial Wire Output)更高效:在 Cortex-M3/M4 上启用 SWO 引脚 + ITM 模块,用 ITM_STIMx 寄存器发数据,OpenOCD / J-Link 可实时捕获
  • 别用 std::cout —— 它内部缓冲复杂,裸机下极易死锁;坚持用最简 C 风格:send_uart("val=%d\n", x);
  • 发布版本务必关闭所有调试输出宏,避免拖慢实时响应——一个 printf 可能占几百字节 Flash 和毫秒级时间

最麻烦的从来不是语法,是每个 C++ 特性背后隐含的运行时契约。裸机上没操作系统兜底,你得亲手补全每一块缺失的拼图。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1091

2023.08.02

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

890

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

468

2024.06.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2023.10.25

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

309

2023.11.28

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

6628

2023.07.31

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

7

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号