资讯动态

从裸机到嵌入式Linux:系统化成长路线与关键技术解析

发布时间:2026/10/4 13:39:20 来源:尧图企业网站定制
从很多年前接过第一块开发板到后来在公司里一个人扛下整套嵌入式方案的软件工作我被问过最多的一个问题就是搞嵌入式到底要不要学Linux每次我都回答得很干脆如果你只想做单片机小项目裸机够用但如果你想在嵌入式这条路上走得更远Linux是你绕不开的一道坎。我自己就是从纯裸机开发一步步转到嵌入式Linux的这条路走得不快但每一步都踩得很实今天把这套成长路线整理出来希望能给正在迷茫的朋友一点参考。这篇文章不是什么权威指南更像是一个过来人的复盘适合几类人看刚入门单片机、想搞清楚裸机和Linux区别的学生正在做STM32、GD32项目但感觉遇到天花板的开发者以及想系统规划嵌入式Linux学习路径、但被碎片化资料搞得很焦虑的从业者。我会尽量把「为什么」讲透而不是只给一份命令清单或者驱动模板。1. 先想清楚为什么要从裸机转向嵌入式Linux1.1 裸机开发的本质与天花板裸机开发的核心逻辑是芯片上电后你的代码就是全部。你写一个主循环不断轮询标志位、扫描按键、刷新LED、驱动电机所有的任务调度都靠自己手工编排。这种方式对简单项目非常高效代码短、逻辑直接、调试也直观一个几百行的main函数就能跑完整个产品逻辑。但裸机的天花板也很清晰。当你需要同时处理网络协议栈、USB协议栈、文件系统、复杂的UI界面或者多个高实时性任务时裸机代码的复杂度会急剧上升。我印象最深的是用一个Cortex-M4芯片跑一个带Wi-Fi、SD卡日志、屏幕刷新和Modbus通信的小型网关四个模块互相穿插中断优先级调了整整三天最后还是时不时出现日志卡顿。那一刻我意识到不是芯片算力不够是裸机这种开发模式根本不适合承载这种复杂度。另外裸机开发的复用性也很差。换一颗芯片所有启动代码、外设初始化、中断处理都要重写。你在这个项目上积累的经验到了下一个项目可能只剩下一堆思想代码几乎留不下什么。1.2 嵌入式Linux到底解决什么问题嵌入式Linux本质上不是让你跑一个完整的桌面系统而是给你一套成熟的软件基础设施。进程调度有内核管文件系统有VFS管网络协议栈有内核协议栈管你只需要关注自己的业务逻辑调用标准接口就行。这就带来了几个裸机时代无法想象的便利。第一是模块化进程之间相互隔离一个模块崩溃不至于拖垮整个系统第二是生态现成的驱动框架、中间件、工具链几乎应有尽有从图形界面到云连接都能找到成熟的方案第三是调试手段丰富gdb、strace、perf、系统日志每一个工具单独拿出来都够你研究很久但组合使用的时候排查问题的效率远超裸机时代拿逻辑分析仪一根针一根针地戳引脚。我自己最直观的感受是裸机开发像在一张白纸上徒手画工程图嵌入式Linux则像是给你一套成熟的CAD系统学习曲线陡峭但一旦上手你的生产力会上一个台阶。1.3 什么样的人适合走这条路线不是所有嵌入式开发者都需要学Linux。如果你的产品定位是低成本、低功耗、单任务的MCU设备比如一个小型温控器、一把电子锁、一个马达控制器那裸机开发可能永远都是最优解硬上Linux反而是给自己找麻烦。需要嵌入式Linux的场景一般有这几个特征功能复杂、交互多、需要联网、需要存储大量数据、需要OTA升级、需要远程监控。只要占了其中两三条Linux的优势就会非常明显。所以我的建议是不要急着跟风学Linux先用裸机把手上的项目做透当你在裸机阶段已经感觉到调度困难、模块耦合严重、调试效率低下的时候就是你切换赛道的最佳时机。2. 硬件基础与裸机阶段的必要沉淀2.1 芯片选型与最小系统设计从裸机转Linux的一个常见误区是手上拿一块Linux开发板直接就开始装系统、写驱动。但如果没有硬件底层的基本功遇到硬件问题你会完全无从下手。我在带新人时经常说一句话Linux开发板只是你的实验平台真正让你受益的是你能否读懂原理图、看懂数据手册、定位硬件故障。所以路线图的第一步反而是回到硬件基础。你至少要能独立完成一颗芯片的最小系统设计电源部分要算电流余量、去耦电容怎么摆位、时钟电路怎么匹配负载电容、复位时序怎么处理、JTAG和串口的调试通路怎么预留。别觉得这些东西简单我见过很多写了好几年Linux驱动的工程师连自家板子的复位芯片是推挽输出还是开漏输出都说不清楚遇到上电偶发死机就抓瞎。实操层面你可以找一颗自己熟悉的MCU把官方评估板的原理图完整读一遍然后尝试画一个精简版本的最小系统板。画板的时候特别注意三点电源平面完整、晶振走线短而粗、调试接口不要被外壳结构挡住。这些细节在裸机阶段不重视后面跑Linux时系统不稳定、U-Boot反复重启你往往会以为是软件配置问题实际上就是硬件功底不够。2.2 裸机开发必须掌握的三项基本功裸机阶段不用追求面面俱到但有三项基本功是一定要练扎实的因为它们直接影响你对Linux内核的理解。第一项是寄存器操作。你得习惯对着数据手册查寄存器位定义理解总线时钟、外设时钟、引脚复用的关系。别觉得这只是体力活Linux设备树里设置pinctrl、配置clock的时候你会发现那些熟悉的术语又回来了只是从直接写寄存器变成了用抽象描述原理完全相通。第二项是中断处理。裸机中断讲究的是快进快出中断服务函数里只做标志位置位具体处理放到主循环这一点和Linux内核中断上下文与下半部机制的思想高度相似。第三项是定时器与实时控制。如果你做过电机控制、温度PID调节哪怕是最简单的增量式PID你的思维方式也会不一样。对于里面涉及的稳定性、响应时间、振荡抑制这些概念比起算法本身更有价值的是你如何用定时器中断保持控制周期稳定。烧写进去的代码是死的只有考察触发的实时性才是嵌入式的灵魂。提醒不要因为想学Linux就把裸机项目全部放下。建议沿用原来的MCU平台做一个小而精的裸机综合项目比如一个带编码器的闭环电机驱动器。一个完整的、跑得稳的裸机项目是你后续理解Linux调度、中断延迟、实时性取舍最直观的参照系。2.3 RTOS是一道承上启下的桥梁在跳转到Linux之前强烈推荐你先接触一轮RTOS哪怕是FreeRTOS或者RT-Thread Studio里的组件也行。RTOS的价值在于它让你第一次意识到“任务调度”这件事可以交给系统来完成而不是自己手工维护状态机。在裸机里你写一个while(1)轮询多个外设到RTOS里你只需要创建多个任务让不同的传感器、算法、通信模块各自拥有独立线程。这种思维转变比直接从裸机跳到Linux温和得多。Linux内核的调度器、信号量、互斥锁、消息队列你在RTOS里都会见到相似概念提前熟悉一遍后面看Linux进程管理和并发同步时会轻松很多。同时RTOS阶段也是你练习排查并发问题的好时机优先级翻转、临界区保护、栈溢出这些问题在Linux里同样存在只是表现得更隐蔽。你把这些问题在RTOS里亲手踩过一遍培养出“遇到卡死先查资源竞争”的条件反射以后在Linux环境里处理多进程、多线程问题就能少掉很多头发。3. 搭建属于自己的嵌入式Linux开发环境3.1 虚拟机方案与常见坑很多新手在第一步装Linux开发环境时就被劝退因为Windows平台直接安装发行版确实容易遇到硬件虚拟化、引导冲突之类的问题。我的建议非常简单粗暴先上虚拟机别折腾双系统。在Windows上装虚拟机常见的坑有这几个我一个个说。第一个是开启虚拟机后系统蓝屏。这大概率是Windows的Hyper-V和VirtualBox或VMware冲突导致的解决办法是进入控制面板把Hyper-V相关的功能关掉但如果你还需要Windows沙盒或者WSL2就要考虑换用Hyper-V本身支持的虚拟机平台或者从VMware迁移到VirtualBox并关闭基于虚拟化的安全。第二个是虚拟机分配内存太少。我见过有人给虚拟机分1GB内存装桌面版Ubuntu那体验简直灾难建议至少4GB起步配合交换分区。第三个是安装源太慢。换国内镜像源是标配注意同步更新签名密钥否则会出现无法验证软件包的报错。环境装好后的一个小建议如果只是做嵌入式Linux开发桌面版反而是干扰你几乎用不到图形界面又耗资源。可以考虑从服务器版开始或者桌面版但在启动时默认进入命令行模式。我的主力开发环境到现在都是一个极简窗口管理器加一个终端模拟器剩下的全在SSH会话里完成。# 更新系统并安装基础开发工具 sudo apt update sudo apt upgrade sudo apt install build-essential git vim ssh tree net-tools curl wget3.2 交叉编译工具链的安装与验证嵌入式Linux开发中开发机一般是x86架构开发板一般是ARM或RISC-V架构要让程序能在目标板上运行必须使用交叉编译工具链。这是新手最容易忽略的一环很多人直接在开发板上装gcc然后本地编译短期看着省事长期效率极低而且不符合工程化流程。交叉编译工具链的命名有规律比如arm-linux-gnueabihf-gcc表示目标架构是ARM、使用glibc库、浮点单元为硬浮点hf模式。选错工具链是新手常出的问题特别是glibc和musl、软浮点和硬浮点的区别会直接导致编译出来的程序在目标板上运行时崩溃或者提示找不到加载器。# 安装ARM交叉编译工具链Ubuntu/Debian系 sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf # 验证工具链 arm-linux-gnueabihf-gcc -v # 最小测试 cat hello.c EOF #include stdio.h int main() { printf(hello embedded linux\n); return 0; } EOF arm-linux-gnueabihf-gcc -o hello hello.c file hello当你看到file命令输出类似ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)这样的结果说明交叉编译已经成功。把hello文件拷到开发板上确保有可执行权限运行后如果能正常打印就说明你的整条开发链路已经打通了。3.3 开发主机与目标板协作的几种方式实际开发中你不会一直在开发板上敲命令太痛苦了。最常用的协作方式是NFS根文件系统挂载和SSH远程调试。NFS的意思是把开发主机上的某个目录通过网络共享给开发板开发板把这个目录挂载为自己的根文件系统的一部分。这样你在主机上编译、修改文件开发板立刻就能看到最新内容省去了反复烧写SD卡的步骤调试效率提升是几何级别的。调试稳定后再把文件系统固化到板载存储里进入正式的发布流程。# 开发主机上配置NFS共享/etc/exports /home/user/nfs_root 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash) # 重启NFS服务 sudo exportfs -ra sudo systemctl restart nfs-kernel-server # 开发板上挂载 mount -t nfs -o nolock 192.168.1.100:/home/user/nfs_root /mnt另外串口是嵌入式开发板最基本的调试通道承担着输出内核日志、进入U-Boot命令行、以及传递引导参数这些重要任务。串口终端软件强烈推荐用minicom或screen纯命令行就能解决。网络通起来之后SSH会成为你日常操作的主要通道但串口线记得永远别拔因为系统网络挂了的时候你只能靠它救命。4. 从裸机思维到Linux思维的四大关键转变4.1 从“裸机定时器”到“系统节拍与调度”裸机时代你们肯定都写过这样的代码在定时器中断里做累加然后主循环判断时间到了就处理。这个思路在Linux下要彻底放下——时间管理和任务调度是操作系统内核的核心能力用户空间程序压根不需要关心时钟节拍怎么配置。在Linux里时间表现由time、gettimeofday、clock_gettime这些系统调用提供高精度延时用nanosleep短忙等用sched_yield时序统计用perf工具。进程的休眠与唤醒、优先级抢占、实时调度策略这些都是内核和调度器在幕后管理的。你写用户态程序时只需要保证自己的线程不会霸占CPU太久不要让别的任务饿死剩下的交给内核。这个认知转变的意义在于你不再是操作系统的老板而是操作系统里的一个租户。你的代码要学会“礼让”学会在等待IO时主动让出CPU学会用事件驱动而不是轮询方式处理输入。从裸机到Linux程序员最重要的心态转变就是从控制一切到协作共享。4.2 从直接操作寄存器到驱动与设备树裸机开发操作外设的方式是看数据手册找到外设基地址配置对应的寄存器位。这在Linux驱动开发里依旧存在但你不会直接操作物理地址而是通过驱动框架填写file_operations注册进内核然后由设备模型把设备和驱动绑定起来。更让裸机党不习惯的是设备树。一颗芯片上有很多外设复用引脚、时钟域、中断号都不同如果用老式的board文件硬编码这些信息每换一次方案就要改一次内核源码。设备树的思路是让“硬件长什么样”和“驱动怎么运行”分离开硬件改动通过dts文件描述驱动代码不需要反复修改。// 一段简化版设备树节点示例 gpio_led: gpio-leds { compatible gpio-leds; led0: led-0 { label status; gpios gpio0 15 GPIO_ACTIVE_LOW; default-state on; }; };刚开始接触设备树时不要慌它本质上就是一套描述硬件信息的树形结构。看到compatible时按照字符串匹配驱动看到reg属性的作用时再结合数据手册确定寄存器地址看到gpios时确认引脚号逻辑。做多了你会发现这种描述方式虽然少了一份直接写寄存器的裸机快感却换来了换板子不换驱动逻辑的工程便利。4.3 从全局变量到进程间通信裸机时代模块之间共享数据最简单粗暴的方式就是用全局变量配合开关全局中断来保护临界区。这种方法在单线程裸机环境里能跑但在Linux的多进程世界里完全行不通因为每个进程都有独立的地址空间你的全局变量在别的进程里根本看不见。Linux下的进程间通信手段非常多管道适合有血缘关系的进程单向传递字节流消息队列适合按类型读取数据共享内存是最快的数据交换方式但必须配合信号量来做同步Socket则能跨越网络边界实现分布式通信。此外还有D-Bus在桌面级和应用级进程通信中极其常见信号和方法的调用机制更适合服务化架构。我的建议是先把管道和共享内存通信这两种最基础的方式用透。管道对应的是“流式处理”思维共享内存则对应裸机程序员最熟悉的“全局变量”思维只不过你得时刻提醒自己加锁、释放锁否则数据竞争和死锁随时会找上门。// 共享内存信号量的极简流程示意图 // 进程A创建共享内存 - 写入数据 - 释放信号量 // 进程B等待信号量 - 读取共享内存 - 处理数据这种从全局变量到IPC的转变是裸机思维和Linux思维之间最大的一条分水岭。你真正接受“并发是常态、共享需要同步”这个理念之后看代码的方式都会改变。4.4 从单任务状态机到线程化职责拆分裸机程序里为了处理多个任务你可能会写一个大状态机用switch套switch把按键、显示、通信全部揉在一起。在Linux的世界里这种设计要被彻底打散原则是用线程来拆分职责让每个线程专注于一件事线程之间通过队列、条件变量、信号量进行协作。举个例子一个数据采集系统裸机做法可能是在一个循环里采数据、处理数据、刷新LCD、维护通信心跳。Linux下的做法是采集线程只负责把原始数据放入环形缓冲算法线程从缓冲取数据做滤波和特征提取显示线程定时从结果存储读取并渲染通信线程监听网络命令并把响应发出去。每个线程独立调试一个线程偶发崩溃时可以先尝试重启而不是整个系统一起掉。这里的核心技巧是线程间数据流要用队列解耦。裸机里你用全局数组来回传数据Linux里要更上一个台阶数据在队列中传递生产者和消费者只依赖队列接口不关心对方内部状态。配合pthread_mutex和pthread_cond做同步整个系统的扩展性会好很多加新功能时不用再把原有逻辑翻个底朝天。5. 嵌入式Linux核心知识点拆解5.1 字符设备驱动开发的完整思维链很多嵌入式Linux岗位的面试题都围绕着字符设备驱动展开因为它最容易看出你对整个系统生态的理解。一个典型的字符设备驱动需要你弄清楚这么几个环节主设备号和次设备号的分配逻辑、file_operations结构体里每个回调函数被谁调用、应用层的open/read/write和内核层的对应关系、以及设备节点由谁来创建。代码里体现的框架思路大概是模块加载函数里分配设备号、注册设备、创建类cdev_add把字符设备和设备号绑定实现open函数时可以让应用层拿到私有数据结构read函数时用copy_to_user把内核缓冲区数据拷贝到用户空间最后在模块卸载时释放种种资源。// 字符设备驱动框架关键片段示意 static const struct file_operations fops { .owner THIS_MODULE, .open my_open, .read my_read, .write my_write, .release my_release, }; static int __init my_init(void) { alloc_chrdev_region(devno, 0, 1, mydev); cdev_init(cdev, fops); cdev_add(cdev, devno, 1); class_create(THIS_MODULE, myclass); device_create(myclass, NULL, devno, NULL, mydev); return 0; } module_init(my_init);初学阶段不要追求一次把复杂的驱动流程全部背下来重点是理解应用层到内核层的数据流转。你可以写一个读取DHT11温度传感器的字符驱动从应用层read一个整数开始逆着调用链一路查上去看到底是哪个函数在为你服务。这些链路吃透了驱动开发在你眼里就不再是写寄存器而是组织数据流和规范接口。5.2 根文件系统的组成与构建有了内核和驱动芯片依然无法启动因为Linux还需要根文件系统。它里面存放着init程序、共享库、配置文件、设备节点等。嵌入式里最常用的构建方案是BusyBox把几百个常用命令浓缩成一个可执行文件极大节省存储空间。# BusyBox构建大致流程 make defconfig make menuconfig # 按需选取命令 make -j4 make install # 生成 _install 目录构建出基础命令集之后还得手动建立关键目录/dev、/proc、/sys、/tmp、/var、/etc。其中/proc和/sys是最特殊的它们是虚拟文件系统由内核动态生成反映的是运行时状态和硬件资源信息。/dev目录里的设备节点早期是手工用mknod创建现代系统里通常由udev根据内核事件动态生成。嵌入式产品里根文件系统一般存放在Flash、SD卡或者网络文件系统里。发布产品时经常需要把根文件系统做成镜像文件比如ext4格式镜像或者squashfs只读镜像然后用烧录工具写入到存储介质。这个过程我建议你完整亲手做一遍不只是跑命令而是要弄明白镜像文件里文件系统的填充方式以及文件系统superblock的作用后面做OTA升级才能理解为什么有些镜像可以增量更新、有些必须整包替换。5.3 嵌入式场景下最高频的Linux命令在嵌入式Linux工作里命令熟练度直接决定效率。第一次带新人上现场的时候最让我头疼的就是对方只会用ls和cd连查看进程、查看内存、抓报文都无从下手。这里我把自己实际使用频率最高的命令整理成一张表倒不追求大全但个个都是救过命的。用途命令说明查看内核日志dmesg -w驱动加载、设备识别信息基本都在这里查看系统负载top/htop判断CPU占用和内存压力排查毛刺必备查看进程与信号ps、kill、pgrep找到问题进程并结束它网络端口与连接netstat -tunlp、ss排查端口监听和服务连接状态查看文件系统空间df -h、du -sh嵌入式空间小日志写满盘是家常便饭抓取网络包tcpdump -i eth0 -w xx.cap排查通信协议问题最直接的手段性能分析perf top、strace -p PIDstrace能看进程的系统调用遇到程序假死用它特别有效修改进程名称prctl(PR_SET_NAME)多进程调试时一眼就能认出自己程序的调用名我特别想提一下strace嵌入式开发里程序“卡死”是高频难查问题。很多时候程序不崩溃也不退出就是没响应用gdb打断点又太重。接上strace -p 进程号之后你会发现它在等待什么系统调用、读哪个文件卡住了甚至能看到它陷入了一个内核锁死循环。这种排查方式效率极高。5.4 进阶方向网络交换芯片与总线驱动如果你在嵌入式Linux岗位招聘要求里看到“DSASwitch驱动”这类词汇不用紧张这只是一个相对细分但很常见的领域。DSA框架用于管理多端口的以太网交换芯片像家用路由器、工业交换机都离不开它。DSA驱动的学习路径还算清晰先理解switch芯片的端口模型——CPU端口负责和主控通信用户端口对外的LAN口。然后看dsa_switch_ops结构体里面都是端口使能、设置VLAN、读取统计信息这些操作。最后通过设备树节点描述具体的交换芯片型号内核的DSA核心框架会帮你完成大部分端口管理工作。总线方面I2C、SPI、UART这三大基础总线是必须掌握的它们几乎出现在所有Linux嵌入式设备里。I2C适合连接传感器和存储芯片SPI适合高速传输数据比如LCD屏驱动UART适合调试和低速通信。更进一步还有D-Bus这种应用层总线的学习和使用它很适合模块化软件的进程间通信。我的建议是不要在细分领域里陷得太深先把三大总线摸透理解内核i2c-core、spi-core这类核心层的作用后面遇到具体芯片时你会发现套路是类似的。6. 实战项目与典型问题排查实录6.1 一个可复刻的实战项目框架看再多的资料、背再多的命令都不如亲手做一个中等规模的实战项目因为踩坑经验是学不来的。我推荐一个非常经典的项目基于ARM开发板构建一个数据采集与远程监控终端。大概的硬件组成是一块带网口的ARM开发板一个温湿度传感器一个4G模块或Wi-Fi模块一个本地存储SD卡。软件部分从底层往上分别是引导加载程序、内核、根文件系统、应用层。核心业务则是周期采集传感器数据本地存储成CSV或者SQLite记录通过MQTT协议加密上报到云端平台并支持远程下发采集频率配置。这个项目好在哪里它一次性覆盖了嵌入式Linux的完整技术栈设备树看传感器挂载和IO配置设备驱动处理传感器外设应用层实现多线程采集和推送网络协议栈解决TCP/IP和MQTT通信根文件系统管理日志存放最后还有远程配置和OTA的扩展空间。做完这一个项目你对嵌入式Linux整个链路才算有了全貌。6.2 我踩过的几个坑与排查思路第一个坑是设备树中引脚复用冲突。曾经改了一个在设备树里复用到PMIC中断引脚的GPIO导致内核时不时报告中断风暴。排查了大半天最后用/sys/kernel/debug/gpio查看引脚占用情况才定位出来。从此养成了改设备树后先查一遍引脚占用表的好习惯。第二个坑是根文件系统空间写满导致系统崩溃。嵌入式设备长期运行log文件不断累积最终把根文件系统的存储空间占满。表现为程序突然无法创建新文件、网络服务异常。排查时df -h立刻能看到根分区已用100%但普通权限下连删日志都困难。后来在项目里统一添加日志轮转机制并且把日志独立挂载到数据分区系统稳定性明显提升。第三个坑是虚拟机安装Linux时出现蓝屏或无法启动。这个在前面提过多半是Hyper-V功能冲突或未开启CPU虚拟化。如果一个虚拟机工具反复启动失败不要一味重装系统先去检查BIOS里Intel VT-x或AMD-V是否开启同时确认安全启动是否会导致镜像引导失败。这些基础问题排查好你的开发环境才能真正稳定下来。6.3 面试与自我检验清单嵌入式Linux的面试题和外界的传闻不同它很少考你背诵某个内核函数而是考察你对整个系统运行机制的理解是否成体系。我给自己的团队面试时经常用的几类问题非常能分辨水准。比如系统启动过程中U-Boot到底做了什么为什么需要它应用程序执行时内核如何给它分配内存和文件描述符字符设备和块设备的本质区别是什么设备的read和write回调如何在中断上下文被执行多线程与多进程的使用界限在哪儿共享内存通信过程中如何避免无休止的等待这些问题的答案在你做完完整的项目后根本不需要死记硬背都是实操过程中自然理解出来的。给自己定期检验的方法也很简单关掉别人文档自己默写一份字符设备驱动触发app读取的完整链路图在开发板上手动给根文件系统增加一个新的分区把日志挂载过去修改一段应用程序的名字用ps命令看到它动态变化的过程。三个小任务难度递进但不依赖第三方服务是很好的自测手段。写在最后的一些体会这条从裸机到Linux的路到底要花多少时间其实没有标准答案。我在用单片机做过三个项目以后开始接触Linux又花了大约一年左右才觉得自己算是入了嵌入式Linux开发的“门”。这一年的时间里最难的不是记住驱动的框架也不是背下一个命令而是彻底扭转自己面对“死机”和“卡顿”时的第一反应。裸机时代我习惯用仿真器和逻辑分析仪去追代码到了Linux下面第一个动作变成了查日志、查进程、查系统状态再决定下一步用什么工具。我建议你如果你正准备踏上这条路不要贪多求快。先把虚拟机环境搞稳定把交叉编译流程走通然后把第一个hello程序跑到开发板上再逐步尝试加一个传感器、加一个网络通信。每一步让系统真正跑起来你脑子里沉淀下来的知识比刷十篇教程都管用。踩坑不要慌问题本身就是最好的老师记录下来日后再翻出来你会感谢自己当初留下的这些“案发现场”笔记。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑