ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

嵌入式开发全攻略:从学习路线、通信协议到嵌入式AI实战笔记

嵌入式开发全攻略:从学习路线、通信协议到嵌入式AI实战笔记 嵌入式这个领域内容多、方向杂网上资料更是鱼龙混杂。很多人私信问我说想入行却不知道从哪下手有人纠结学单片机还是Linux有人搞不清应用层开发算不算嵌入式还有人背了一堆面试题却连I2C上拉电阻为什么要加都说不明白。这个标题既然叫“嵌入式开发者的福音”我就把大家搜得最多的那些问题——学习路线、通信协议、嵌入式Linux、硬件进阶、竞赛项目、面试就业再加上这两年被反复讨论的DSP缓存架构和嵌入式AI——一次性汇总整理成一份能直接照着做的实战笔记。我做了快十年嵌入式开发从8位单片机一路做到Cortex-A系列和DSP平台踩过的坑比很多人见过的代码都多。这篇文章不打算讲太多虚的只聊实际开发中真正用得上的东西适合正在学嵌入式的学生、刚入行的工程师以及想从单片机往Linux方向转型的朋友参考。1. 先搞清楚嵌入式开发到底学什么1.1 应用层开发算不算嵌入式这是后台被问得最多的问题而且问的人往往自己已经做了一段时间的Linux应用开发。我的观点很直接只要你的程序跑在嵌入式设备上做的是设备本身的业务逻辑那这就是嵌入式开发只不过方向偏应用层罢了。为什么大家会纠结这个因为很多招聘信息把“嵌入式”拆成了嵌入式底层开发、嵌入式驱动开发、嵌入式应用开发看起来差异很大。实际上一个完整的嵌入式产品从硬件板卡到用户能用的功能中间这整条链路都属于嵌入式范畴。你写Qt界面控制摄像头采集是嵌入式你写Linux内核驱动操作GPIO也是嵌入式你在STM32上写状态机控制电机同样是嵌入式。区别只在于应用层开发离硬件远一些但依然要懂硬件基本常识。比如你在应用层操作I2C设备如果不知道这个设备是7位地址还是10位地址不知道读时序要先发寄存器地址那你接上设备根本调不通。这不叫“不算嵌入式”这就是嵌入式应用开发的基本功。所以我的建议是不要纠结名分先想清楚自己想做什么层次的事。想快速做出能用产品就学应用层想深入做板级控制就学驱动和单片机两者底层逻辑相通后续完全可以转。1.2 一份接地气的嵌入式学习路线网上那些嵌入式的学习路线图动不动就画几十个箭头看得人头晕。我根据自己的实战经验给出一条切实可行的路第一步是C语言和基础硬件知识。C语言要掌握指针、结构体、链表、函数指针而不是停留在“会写for循环”的水平。硬件基础至少要懂电阻电容电感、三极管MOS管、运放的基本用法看得了原理图分得清上拉下拉。第二步是单片机开发。选STM32也好、国产GD32也好关键是搞明白GPIO、定时器、中断、UART、I2C、SPI、ADC、PWM这些东西怎么用。这个阶段不要贪多把按键扫描、LED控制、传感器读取、串口打印这几个经典例程做熟嵌入式开发的“手感”就有了。第三步是RTOS或者Linux。想做物联网设备、智能硬件掌握FreeRTOS很加分任务调度、信号量、消息队列这些概念得理解透。想往高端走就要接触嵌入式Linux从环境搭建、交叉编译、驱动模块加载开始逐步过渡到bootloader、内核、根文件系统。第四步是项目实战和工程化思维。学习过程中一定要做至少两个完整项目比如智能家居网关、环境监测终端把需求分析、硬件选型、代码编写、调试、测试的完整流程走一遍。这条路线走下来快则一年慢则两年出来基本能胜任常规嵌入式岗位。关键在于别跳跃很多人急于学Linux而跳过了单片机结果连中断优先级和寄存器配置都搞不明白后面越学越虚。1.3 嵌入式工程级思维和纯软件开发最重要的差别我带过不少从纯软件转岗过来的同事他们业务逻辑写得很好但到嵌入式项目里经常翻车核心问题不是写代码而是没有建立嵌入式工程级思维。什么是嵌入式工程级思维我总结为三点资源受限意识、硬件关联意识、稳定性优先意识。资源受限很好理解MCU内存可能只有几十KBCPU主频只有几百MHz你不能像写服务器代码那样随意new对象、随意递归。同样的功能你要反复斟酌是用查表法还是实时计算中断函数里能不能打印日志。这些取舍在PC上都不是问题在嵌入式设备上就是bug来源。硬件关联意识说的是你的代码随时随地都在和硬件打交道。一个按键的消抖要考虑机械抖动的时间常数一个I2C读取失败要考虑设备是否在上电初始化序列里。不把原理图和数据手册吃透写出来的代码就是空中楼阁。稳定性优先的意思是嵌入式设备往往是7x24小时运行不像手机应用崩了用户重启就行。看门狗、异常处理、日志记录这些东西从设计第一天就要放进去而不是等出问题了再补。2. 嵌入式5种通信协议一次讲透通信协议这块几乎每次面试、每个项目都绕不开。网上关于“嵌入式5种通信协议”的讨论很热闹我结合自己实际调试经验把最常用的几类协议讲透包括它们为什么存在、怎么用、坑在哪里。2.1 UART最基础和通用UART全称通用异步收发传输器特点是只要两根线TX和RX就能实现全双工通信不需要时钟线所以也叫异步串口。它把数据按起始位、数据位、校验位、停止位这种帧格式逐位发送双方要约定好波特率。实际开发中串口最大的坑就是波特率不匹配。通信双方波特率偏差超过2%到3%数据就会出现乱码。调试时如果发现接收到的是乱码第一步不是怀疑代码而是用示波器或者逻辑分析仪实测TXD引脚的波特率是否与配置一致。我遇到过晶振精度不够导致9600波特率实际偏差太大换内部时钟校准才解决的情况。另一个容易忽略的是电平标准。MCU的UART一般是TTL电平0到3.3V或者5V而PC的串口是RS232电平正负电压表示逻辑0和1直接用杜邦线连接必然烧芯片或者收不到数据。中间要加电平转换芯片比如MAX3232或者用USB转TTL模块。UART虽然速度不快常规115200bps但胜在简单、稳定、调试方便所以常用于日志输出、AT指令控制、GPS模块通信、蓝牙模块通信等场景。嵌入式项目里留一个UART作为调试口几乎是标配。2.2 I2C和SPI板级通信的两大主力I2C用两根线SCL时钟、SDA数据实现半双工通信挂载多个设备靠的是设备地址区分是典型的低速设备互联总线。它最大特点是引脚少但是速率不高标准模式100kbps快速模式400kbps高速模式也就3.4Mbps。用I2C最让人头疼的两件事一是地址冲突二是时序细节。地址冲突指的是同一个I2C总线上挂了两个地址相同的设备读出来的数据全是乱的。解决办法是看芯片数据手册的地址引脚配置比如A0A1A2高低电平组合能配置出多个不同地址。时序细节则体现在I2C对时序要求非常严格SCL高电平期间SDA必须保持稳定只有在SCL低电平期间SDA才能变化。很多人在软件模拟I2C时忽略了这句关键话导致通信时好时坏。SPI则完全不一样它是四线制SCLK、MOSI、MISO、CS全双工速率可以到几十Mbps甚至更高。每个从设备有独立片选线所以不存在地址冲突问题时序也相对宽容。但SPI有个让人容易踩坑的地方是四种工作模式也就是时钟极性CPOL和时钟相位CPHA的组合分别决定了空闲电平状态和数据采样时机。主从两端必须配置完全一致否则读回来的数据要么错位要么全是FF。在开发中我的习惯是对所有板载传感器优先用I2C省引脚对高性能外设如Flash、LCD、ADC芯片用SPI跑速度。而排查协议问题逻辑分析仪是神器比示波器方便太多协议解码功能直接帮你把数据拉出来看。2.3 CAN与Ethernet从单板迈向互联当设备不再局限于一块板子内部通信而是要在抗干扰环境中组网互联时CAN总线就登场了。CAN用的是两根差分线CANH和CANL通过差分信号传输所以在汽车、工业设备这种电磁干扰很重的场合表现优秀。速率从125kbps到1Mbps最长通信距离和速率负相关。CAN最需要注意的硬件细节是终端电阻。标准CAN总线要求在物理链路最远端的两个节点各并联一个120欧姆电阻用来匹配阻抗、抑制反射。我见过不少项目CAN通信偶发错误帧示波器一看信号边沿全是振铃加终端电阻后立刻干净了。CAN的仲裁机制也很巧妙多节点同时发送时标识符小的优先这在软件设计时要考虑不能让高优先级消息被低优先级消息阻塞。Ethernet则是走向工业互联网和物联网的关键。嵌入式设备里跑以太网硬件上一般涉及到MAC和PHY两部分MAC负责逻辑控制PHY负责物理信号收发中间用MII或RMII接口连接。其实现代MCU很多集成MAC只需要外接PHY芯片和网络变压器。驱动调试时首先要确认PHY的地址和复位时序然后是用MDIO总线读取PHY寄存器状态确认link是否正常。从协议栈来看嵌入式设备常用LWIP实现TCP/IP协议栈轻量、资源占用少。我调试LWIP的经验是内存池配置一定要根据实际场景调整收发缓冲区太少直接导致吞吐量上不去太多又浪费RAM。还有一个常见坑是网线插拔后重连失败需要在应用层处理链路状态变化回调。2.4 协议选型的心法很多初学者问这些协议到底怎么选我的选择逻辑很简单看距离、看速率、看引脚、看抗干扰。板内通信I2C和SPI二选一I2C省引脚、SPI跑高速板间短距离低速率UART最省心工业现场需要抗干扰和组网上CAN需要高带宽或者联网走Ethernet。如果什么都不确定优先考虑UART因为它最容易调试、工具链也最成熟。选型时还要看团队熟悉度。一个协议如果团队都没人用过带来的调试成本可能比它节省的硬件成本高得多。嵌入式开发讲究稳定不追求技术上的花哨。3. 嵌入式Linux从启动到应用嵌入式Linux这几年热度一直很高招聘需求量也大。但要学好它绝不是装个虚拟机、敲几条命令就行。我从自己实际开发ARM Linux项目的经历出发把这条链路拆解清楚。3.1 Bootloader与启动流程嵌入式设备的启动和PC完全不一样上电后先运行片内ROM的固化代码然后由它引导外部存储器的bootloaderbootloader再加载内核内核挂载根文件系统最后运行应用。每一步环环相扣任何一个环节出错设备就是黑屏无反应。最常见的嵌入式bootloader是U-Boot。它的职责被很多人误解成“引导Linux”实际上它还要完成DDR初始化、时钟配置、外设早期初始化以及提供网络烧录、SD卡烧录等功能。开发阶段我们通过U-Boot环境变量设置启动参数比如从网络tftp加载内核、指定rootfs挂载分区。调试bootloader最痛苦的是串口没输出或者乱码。我记得曾经调试一款新板卡串口完全没有输出排查半天发现是外部晶振没焊接好处理器根本没跑起来。所以拿到新板卡第一步永远是确认最小系统电源、时钟、复位、调试串口再谈其他。嵌入式Linux忘记密码的问题也很常见尤其是现场设备。如果只是用户态密码忘了可以通过U-Boot命令行传内核参数init/bin/sh直接进入shell修改密码文件。但如果文件系统本身加密了那就要到uboot层面做完整恢复这类问题需要提前写好恢复手册。3.2 内核源码与驱动开发嵌入式Linux工程师看内核源码不是让你从头到尾读一遍Linux源码几千万行代码谁读得完而是学会“按需精读”。比如你要写一个I2C设备的驱动就要搞清楚i2c总线驱动程序框架、i2c_client注册机制、i2c_transfer接口的调用流程。先大致看一遍内核Documentation下的相关文档再去看具体的driver源码。驱动的本质是“对硬件操作进行封装”。对Linux来说驱动通过文件操作接口open/read/write/ioctl向应用层暴露能力而对下则通过访问寄存器、处理中断、管理DMA来实现硬件控制。我在学习驱动时一个很深的体会不要一开始就碰复杂驱动先从一个简单的GPIO按键驱动做起或者改造一个现有的char设备驱动模板理解module_init、file_operations、devm_request_irq这些核心概念再啃平台总线、设备树这些稍复杂的内容。设备树Device Tree是ARM Linux绕不开的点。它的作用是把“这块板子上有什么设备、在哪个地址”这种硬件描述信息交给内核驱动代码不再硬编码资源。写设备树最需要注意的是GPIO编号、中断号、时钟频率这些参数要和电路原理图完全对应错了板子直接起不来或者外设没反应。3.3 Qt与Wayland显示架构LinuxQt5是嵌入式图形界面开发的主流方案尤其适合需要复杂交互动画的设备比如工控HMI、医疗设备、车载中控。Qt的跨平台性和成熟的控件库让嵌入式应用开发的效率比传统裸机GUI高出一大截。但嵌入式环境下的Qt显示后端是个容易让人困惑的地方。早期嵌入式Qt常用LinuxFB帧缓冲后端就是直接把Qt画到/dev/fb0的显存上简单但功能受限比如不支持GPU合成、不支持多个窗口透明叠加。后来出现EGLFS可以利用GPU渲染并直接输出到显示器性能好很多。而现在随着现代Linux图形栈的推进Wayland越来越流行Qt应用通过wayland后端与合成器交互可以实现更现代化的显示管理。我最近在一个项目里把Qt应用从EGLFS迁移到Wayland体验下来发现Wayland的稳定性确实好多窗口管理的bug少了很多但前提是合成器本身要跑得稳。如果你的产品是单窗口全屏应用EGLFS足够用且配置简单如果界面复杂、窗口多、需要和系统其他GUI程序共存Wayland是更好的方向。需要注意嵌入式Qt开发中很多问题是显示层的画面撕裂、鼠标残影、字体模糊。画面撕裂可以考虑启用VSync双缓冲字体模糊多半是DPI没配置对鼠标残影可以先切换光标后端。3.4 边缘计算与嵌入式AI边缘计算和嵌入式AI是这几年嵌入式最热门的方向之一。以前AI是服务器的专利现在摄像头、机器人、工业设备要在本地完成推理这就需要嵌入式芯片具备足够算力。嵌入式AI落地的核心矛盾是算法太大、芯片资源太小。常规的解决手段就是量化。把FP32的模型量化成INT8甚至INT4模型体积变小、推理速度变快但精度会掉一点。我最开始做嵌入式AI时以为把训练好的模型直接转成量化版本就行后来发现量化后精度掉得厉害跑不通。反复实验才明白要考虑训练时做量化感知训练或者在推理时校准量化阈值这些细节决定了模型在设备上到底“能不能用”。另外很多嵌入式AI芯片自带NPU。用NPU就要用到厂家提供的SDK比如RKNN、海思SVP、瑞萨的DNN库。麻烦的是每家SDK都不同换平台基本要重写推理代码。我的建议是架构上做一层抽象把图像预处理、前处理、推理、后处理分开尽量让业务代码不依赖具体芯片SDK这样后续换硬件能少流不少汗。4. 硬件进阶从DSP到显示接口软件学得差不多以后很多人会发现卡在硬件上。这也是嵌入式继续往深走的必经之路尤其当你接触到DSP、处理器内存映射、复杂显示接口的时候。4.1 OMAP-L137内存映射与C674x缓存架构TI的OMAP-L137是很多工业音频和信号处理设备里的明星芯片集成了ARM9和C674x DSP双核。对做DSP开发的同行来说理解C674x的内存映射和缓存架构是性能优化的关键。C674x DSP的内存映射设计得比较清晰片上内存分为L1P程序缓存、L1D数据缓存和L2 SRAM。L1P和L1D容量都不大但访问速度极快L2 SRAM容量更大由用户配置为缓存或者直接映射的RAM。在实际项目里性能瓶颈通常出在缓存未命中。最典型的现象是一个优化得很好的循环运行速度就是达不到预期原因在于循环里的数据在内存里“跳着读”缓存命中率极低。解决办法是数据重排让处理器顺序访问内存块充分利用缓存的预取机制。C674x特有的难题是缓存一致性。当DMA把外部数据搬到DDR后CPU直接去读可能读到旧的缓存数据完全一样的内存内容出现两个版本。代码里要手动调用cache_inv或cache_writeback相关API确保一致性。我在调试音频采集时曾经因为没做缓存一致性处理导致DMA采到的数据偶尔出现“破音”直到在每次DMA完成后显式invalid缓存才解决。OMAP-L137还有共享内存的细节。双核通信时ARM和DSP之间通过共享内存交换数据就需要严格定义消息格式和同步机制。我建议共享内存区域设置固定的结构体头部包括消息类型、长度、校验和并通过中断通知对方避免轮询浪费CPU。4.2 MIPI与LVDS怎么选显示接口在嵌入式产品里很常见尤其是MIPI和LVDS初学者经常分不清楚。LVDS是低压差分信号用于传输并行RGB数据典型场景是工控屏、车载屏。它速度适中单通道几百Mbps抗干扰能力强走线要求相对宽松所以工业设备特别喜欢用。调试LVDS显示经常遇到的问题是把像素格式RGB666还是RGB888配置错画面颜色完全偏掉。MIPI DSI是手机平板显示的主流接口差分串行传输速率高引脚少。相比LVDSMIPI DSI在更高分辨率、更高刷新率下优势明显现代手机屏基本都是MIPI。但MIPI调试难度也大时序和初始化序列初始化代码非常敏感不少项目中显示点不亮最后都是因为初始化序列不对或者lane数配错。简单说如果你的产品是工控、车载设备对成本敏感追求稳定LVDS更顺手如果追求轻薄、高分辨率MIPI是首选。在选择之前先看屏幕主控支持哪个接口很多MCU自带LVDS或MIPI控制器外部桥接芯片能不加就不加省成本也省调试时间。4.3 嵌入式硬件基础知识补课嵌入式软件工程师得懂到什么程度的硬件呢我认为至少要达到这几点能看懂原理图知道芯片每个引脚的作用电源树怎么设计复位时序大概是什么样子会看数据手册重点看电气特性、寄存器说明、参考电路和layout指南会用万用表和示波器量电压、量波形、检查I2C和SPI信号质量懂一点信号完整性知道时钟线要短、差分线要等长、地要完整。我面试工程师的时候喜欢问一个问题“如果上电后MCU发烫你第一步怎么查”很多人说查代码但硬件老手会告诉你第一步用万用表测电源对地阻抗多半是电源短路或者引脚接错。这种思路就是嵌入式硬件素养的体现。嵌入式CMOS传感器的调试也归在这个范畴里。摄像头模组通过MIPI CSI接口和I2C控制接口连接。调摄像头时如果图像全花可能不是寄存器配错而是信号引脚虚焊或者走线干扰。我处理过几次这样的问题最后都是拿示波器在CSI数据线上看信号质量找到根因。5. 实战项目蓝桥杯、开源与毕设理论学习再多都不如做一两个完整项目。不管是竞赛、开源社区项目还是毕业设计都能帮你把零散的知识串起来。5.1 蓝桥杯嵌入式省赛怎么准备每年都有很多人搜“蓝桥杯嵌入式第16届省赛题目”可见它的关注度。蓝桥杯嵌入式赛项主要是STM32平台使用官方提供的竞赛板题目会考察GPIO控制、LCD显示、按键输入、ADC采集、PWM输出、定时器、串口通信、EEPROM读写等基础操作。准备蓝桥杯最关键的不是刷题而是吃透官方板卡的所有外设例程。我当时备赛的一个习惯是把所有外设例程改造成自己的“标准化驱动库”LCD显示函数封装成带格式化输出的模式按键改成支持单击、双击、长按的状态机串口封装成类似printf的调试接口。这样比赛时遇到任何题目都是在框架上做功能拼装而不是现场从零写驱动。蓝桥杯题目的另一个特点是时间紧题目要求多代码逻辑不复杂但细节多。很多同学明明外设都会但没注意题目里“按键释放才动作”之类的要求丢分很亏。备赛时需要练读题的能力把每个功能点的触发条件标注出来再动笔写代码。5.2 适合练手的开源项目与毕设选题开源项目方面我建议新手可以从这几个方向入手一是智能家居类用ESP32或STM32实现温湿度采集、MQTT上云、手机远程控制能够完整体验传感器、通信协议、云平台对接的全流程二是数据采集类做一个多通道ADC采集器通过串口或USB上传数据到PC端上位机还能培养上位机开发能力三是电机控制类做无刷电机调速器或者步进电机控制能深入接触到PWM、换向算法、FOC这些进阶内容。毕设选题的话安全性和可实现性最重要。我比较推荐“嵌入式环境监控”这个方向用STM32或者IMX6ULL采集温湿度、光照、空气质量通过WiFi或以太网上传到云端再做个简单的网页或App展示内容经典、工作量适中、演示效果好。也有同学问“哪里可以帮忙开发微波成像嵌入式”这种很专业的需求通常涉及射频采集和成像算法纯嵌入式岗位很少能独立完成。如果只是实现数据采集和控制部分可以找做信号处理的团队协作如果你要委托外部开发建议明确需求边界和验收标准防止后期无限返工。我自己的建议是用迷你电容触控板这种DIY项目来练手。一个TouchPad实现鼠标功能硬件上涉及I2C触控芯片软件上要写状态机处理滑动和点击事件最后模拟成USB HID设备。这个小项目麻雀虽小五脏俱全做一遍能学到中断、状态机、USB协议栈比单纯刷题有意思得多。6. 面试、就业与AI提效最后一个大家都很关心的话题怎么进入这个行业面试考什么以及有哪些效率工具。6.1 嵌入式面试八股文“嵌入式八股文”这几年成了一个梗指的是面试必问的基础知识。说实话八股文有它的价值它考察的是底层认知而不是记忆能力。高频考点有这么几类C语言方面指针和数组的区别、函数指针的用法、结构体对齐原则、volatile关键字的作用、static关键字在不同位置的语义、内存四区模型单片机方面中断的响应流程、中断标志位的清除方式、定时器的工作原理、PWM的生成方式、I2C和SPI时序操作系统方面进程与线程的区别、同步互斥机制、死锁条件、堆栈的区别Linux方面用户态和内核态的区别、系统调用流程、字符设备的file_operations结构体、模块加载卸载过程、设备树基本概念。我常常建议候选人八股文不要死记而是要从原理上理解。比如被问到volatile时如果你能说明“当变量会被中断修改或者被硬件寄存器修改时必须加volatile否则编译器优化会把变量缓存到寄存器导致读到旧值”面试官就会认为你肚子里有货。嵌入式面试有时还考硬件题比如计算一个电阻分压电路、判断三极管工作状态。备考时要把基础电路知识复习一遍这部分对很多软件背景的同学来说是真短板。6.2 AI工具在嵌入式开发中的实际用法这两年AI编程工具火得不行很多嵌入式同行也在问AI到底能不能帮上忙。我的结论是能帮上但作用和写Web应用不太一样。嵌入式开发的AI辅助手段主要有这么几类一是代码生成和补全比如用AI写一个Linux设备驱动骨架、写一个I2C读取函数效率非常高二是数据手册解析现在很多AI可以直接读pdf摘要帮你提取寄存器说明和时序参数省去大量翻阅时间三是调试辅助把报错信息和代码片段交给AI它能给出排查方向。但嵌入式AI有天然的局限软件环境碎片化太严重。每家芯片的寄存器、SDK、编译器都不同AI训练数据里这些内容有限给出的代码经常不能直接编译通过。所以我用AI的习惯是让它生成框架和逻辑具体寄存器配置、硬件相关部分仍然由自己确认AI生成的代码只当作参考和起点。还有一个很实用的场景是让AI帮你写自动化测试脚本。嵌入式测试环境的脚本、构建脚本这类代码逻辑清晰、模式固定AI写起来又快又好省下来的时间足够优化一天的业务代码。6.3 嵌入式软件工程师的技能矩阵结合这些年做技术面试官的经验我认为一个合格的嵌入式软件工程师应该具备这样的技能矩阵第一层是基础能力包括C语言深度掌握、常用数据结构、单片机外设开发、电路基础。第二层是系统能力包括RTOS的使用与移植、Linux应用开发、Makefile/CMake构建系统、版本管理。第三层是进阶能力包括Linux驱动开发、内核机制理解、性能优化、低功耗设计、可靠性设计。第四层是综合能力包括项目方案设计、需求拆解、沟通表达、技术文档编写。不建议大家一上来就追求最高层级的驱动和内核基础不牢的人学驱动会非常痛苦。按着层级一步步来每个层级做出一个拿得出手的东西更新简历时能言之有物面试时面对“你做过什么”的提问能讲清楚做了什么、遇到什么问题、怎么解决的这比背再多面试题都管用。最后再分享一点我的个人体会。嵌入式开发不是一个速成的行业它涉及的知识面确实很宽硬件、软件、系统、协议、调试每一项都需要大量实践。但这恰恰是它魅力所在——这个领域的价值壁垒高经验积累不容易被淘汰。只要你系统学完这条路线里提到的这些内容再做完两三个完整的项目这个行业会给你一种很踏实的确定感。硬件世界里那种“代码和真实物理世界交互”的反馈感是纯软件工作很难替代的。共勉。
返回列表