news 2026/5/13 10:37:25

10.是否要成为全栈工程师?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
10.是否要成为全栈工程师?

1、软件工程师 嵌入式软件工程师 硬件工程师的关系

一、各自的核心工作

1. 软件工程师(通常指“纯软件/应用层工程师”)
  • 工作内容:负责非硬件相关的软件逻辑,比如:
    • 业务功能开发(如APP界面、数据处理算法、网络通信逻辑);
    • 系统级软件(如Linux应用、数据库、Web服务);
    • 不直接操作硬件,通过“接口/API”调用嵌入式软件工程师提供的功能。
  • 技能栈:编程语言(C/C++/Python/Java)、框架(Qt/ROS)、操作系统(Linux/Windows)。
2. 嵌入式软件工程师
  • 工作内容:是“软件和硬件的桥梁”,负责硬件相关的软件开发,比如:
    • 底层驱动(如I2C/SPI外设驱动、传感器驱动);
    • 系统移植(如把Linux/RTOS移植到硬件板卡);
    • 硬件资源管理(如内存、中断、时钟配置);
    • 向上提供“硬件功能接口”(如给上层软件提供“读温湿度”的API)。
  • 技能栈:C语言、硬件寄存器、嵌入式OS(FreeRTOS/Linux)、驱动开发、设备树。
3. 硬件工程师
  • 工作内容:负责物理硬件的设计与实现,比如:
    • 电路原理图设计(如处理器、传感器、电源的电路连接);
    • PCB Layout(把原理图做成实际的电路板);
    • 硬件选型(如选处理器型号、传感器型号);
    • 硬件调试(如解决电路短路、信号干扰问题)。
  • 技能栈:电路原理、PCB设计工具(Altium Designer)、元器件选型、硬件测试仪器(示波器、万用表)。

二、三者的协作交互流程

以“智能温湿度采集设备”为例,看他们怎么配合:

1. 需求阶段:一起定方案
  • 软件工程师:提出业务需求(如“要显示温湿度曲线、数据上传云端”);
  • 嵌入式软件工程师:评估硬件能支持的功能(如“这个传感器的采样率够不够”);
  • 硬件工程师:评估硬件实现成本(如“选AHT20传感器还是SHT30,PCB尺寸能不能放下”)。
2. 开发阶段:分层对接
  • 硬件→嵌入式软件
    硬件工程师给出硬件规格文档(如“传感器接在I2C1接口,引脚是PA2/PA3”),嵌入式软件工程师基于此写驱动。
    • 交互点:硬件工程师提供《硬件手册》《引脚定义表》,嵌入式软件工程师反馈“硬件电路有问题(如I2C引脚接反了)”。
  • 嵌入式软件→软件
    嵌入式软件工程师封装硬件功能接口(如“调用read_temp_humi()就能得到温湿度值”),软件工程师基于接口写业务逻辑。
    • 交互点:嵌入式软件提供《API手册》,软件工程师反馈“接口返回数据太慢,能不能优化”。
3. 测试/联调阶段:一起排障
  • 若“温湿度读不到”:
    • 硬件工程师:用示波器测I2C引脚的信号是否正常;
    • 嵌入式软件工程师:查驱动代码是否写错了寄存器地址;
    • 软件工程师:查是否正确调用了API。
  • 若“数据上传卡顿”:
    • 软件工程师:查网络通信逻辑;
    • 嵌入式软件工程师:查硬件的串口/WiFi速率是否足够。
4. 交付阶段:同步文档
  • 硬件工程师:交付《硬件原理图》《PCB文件》《物料清单》;
  • 嵌入式软件工程师:交付《驱动代码》《API手册》;
  • 软件工程师:交付《业务功能代码》《用户手册》。

核心交互原则

  • 硬件和嵌入式软件:靠“硬件规格”对接(硬件告诉软件“怎么连”,软件告诉硬件“怎么用”);
  • 嵌入式软件和软件:靠“接口/API”对接(嵌入式软件封装硬件功能,软件只调用接口);
  • 三者的共同语言是“需求和规格”——避免“软件要的功能硬件做不到”“硬件做的接口软件用不了”的矛盾。

2、是否能包圆?是否做全栈?

确实,很多嵌入式工程师能“一人包揽硬件+嵌入式软件+部分上层软件工作”(行业里常叫“全栈嵌入式工程师”),但这是分场景的——不是所有项目都能“一人包圆”,也不是所有工程师都能做到。

一、为什么嵌入式工程师“能包揽”?

嵌入式开发的核心是“软硬件结合”,很多嵌入式工程师的知识栈本身就覆盖了:

  • 硬件侧:懂电路原理、能画简单PCB、会用示波器测信号(至少能看懂硬件工程师的原理图,排查基础硬件问题);
  • 软件侧:能写驱动、能移植系统、能写上层应用逻辑(比如用Qt做简单界面、写Linux应用)。

尤其是小型项目/创业团队(比如做一个温湿度采集器、简易机器人),往往不需要专门的硬件工程师和纯软件工程师,一个嵌入式工程师就能搞定“从硬件选型→电路设计→驱动开发→应用功能”的全流程。

二、什么时候“不能包揽”?

中大型项目/复杂产品里,“一人包圆”几乎不现实,原因是:

  • 技术复杂度太高
    • 硬件侧:复杂产品(如手机、工业机器人)的PCB涉及高速信号(如DDR4、PCIe)、电源完整性、电磁兼容(EMC),需要专业硬件工程师(嵌入式工程师很难精通高速PCB Layout);
    • 软件侧:大型系统(如车载系统、医疗设备)的上层软件(如车机界面、医疗数据算法)需要专门的软件工程师(嵌入式工程师很难同时精通驱动和大型应用框架)。
  • 时间成本太高
    • 一个人做“硬件+软件”的效率,远低于分工协作(比如硬件画PCB需要2周,软件写驱动需要2周,分工的话2周就能同时完成,一人做则需要4周)。
  • 专业深度不够
    • 比如硬件的“电磁兼容认证”“电源效率优化”,软件的“高并发网络通信”“大型数据库调优”,都是需要专门岗位深耕的技能,嵌入式工程师很难做到“样样精通”。

三、“全栈嵌入式”的适用场景

适合小项目、原型验证、个人DIY

  • 比如做一个“树莓派控制的LED灯”“Arduino的温湿度显示器”;
  • 或者创业初期,团队人数少、预算有限,需要有人“快速把产品做出来”。

嵌入式工程师“能包揽”是小项目的“效率选择”,但在中大型项目里,“分工协作”才是更高效、更专业的方式——毕竟“样样通”往往意味着“样样松”,专业分工才能把产品做深、做精。

3、如何确定边界,以及如何深入


一、嵌入式工程师如何“搞清楚边界”?

“边界”不是“不能做什么”,而是“该做什么、不该做什么、该做到什么程度”,核心是“不越位、不缺位”,既不包揽所有活导致低效,也不遗漏自己的核心职责导致项目卡壳。

1. 先明确3个核心边界(结合你的场景)
(1)嵌入式软件 vs 硬件工程师的边界(最容易模糊)

嵌入式软件工程师(你的核心)

硬件工程师(不该越界的)

模糊地带(可协作/辅助)

写I2C/SPI驱动

设计PCB、选型元器件(比如选STM32型号)

1. 看原理图排查引脚接错问题;
2. 用示波器测I2C信号是否正常(辅助硬件排障)

配置芯片外设(时钟、中断、MPU)

解决电磁干扰(EMC)、电源短路

3. 给硬件提需求(比如“I2C引脚要留上拉电阻”)

封装硬件API给上层软件

画原理图、打样电路板

4. 协助硬件做简单的板卡测试

边界原则

你负责“软件如何操作硬件”(驱动、外设配置),硬件负责“硬件如何物理实现”(电路、PCB)。
可以帮硬件排查简单问题,但别自己画复杂PCB、别去解决EMC认证(这些是硬件的专业深度)。

比如:你写AHT20驱动时,发现读不到数据——

  • 你该做的:查驱动代码(寄存器地址、I2C指令)、确认软件配置(I2C时钟100KHz是否正确);
  • 你可以辅助的:用示波器测I2C的SDA/SCL引脚有没有信号;
  • 你不该做的:直接修改PCB原理图、自己重新焊接电路板(交给硬件工程师)。
(2)嵌入式软件 vs 纯软件工程师的边界

嵌入式软件工程师(你的核心)

纯软件工程师(不该越界的)

模糊地带(可协作/辅助)

底层驱动、系统移植(比如FreeRTOS/RT-Thread移植到STM32)

上层业务逻辑(比如温湿度数据可视化、云端上传)

1. 封装简单的API(比如read_temp())给上层调用;
2. 协助上层排查“API调用失败”问题

硬件资源管理(内存、中断、DMA)

大型应用框架(比如Qt界面、Web服务)

3. 优化API性能(比如减少I2C读取延迟)

实时性保障(比如传感器采样定时触发)

数据库、网络高并发处理

4. 提供硬件状态接口(比如“传感器是否在线”)

边界原则

你负责“把硬件能力变成软件接口”,纯软件负责“把接口变成用户能用的功能”。
可以写简单的测试应用(比如你之前的AHT20读数据程序),但别去写复杂的Qt界面、别去调云端接口的高并发(这些是纯软件的专业深度)。

比如:做温湿度采集设备——

  • 你该做的:写AHT20驱动、封装read_temp_humi()API、保证1秒采样一次(实时性);
  • 你可以辅助的:写一个简单的命令行程序打印温湿度(测试API);
  • 你不该做的:自己开发一个带曲线显示的GUI界面、自己调试阿里云上传的高并发问题(交给纯软件工程师)。
(3)自己“能做” vs “该做”的边界(个人层面)
  • 能做:比如你会画简单PCB、会写Qt界面;
  • 该做:优先把核心能力(驱动开发、系统移植、硬件软件对接)做深,其他技能只作为“辅助工具”,不占用核心精力。

建议

初期(1-2年):坚决不越界,先把“嵌入式软件的核心活”做扎实(比如把STM32的外设驱动、RT-Thread移植练熟);
中期(3-5年):可以接触模糊地带(比如看懂复杂原理图、写简单GUI),但不深耕;
后期(5年+):若想走全栈/管理岗,再拓展硬件/软件广度,否则继续深耕嵌入式软件深度。

2. 实操方法:3步快速划清边界
  1. 看需求文档:明确自己的“职责范围”,比如需求里写“嵌入式工程师负责传感器驱动和API封装”,就别去做上层界面;
  2. 主动沟通:和硬件/软件工程师明确“对接点”,比如和硬件约定“传感器接I2C1,引脚PA2/PA3”,和软件约定“API返回温湿度浮点数”;
  3. 学会说“不”:若别人让你做超出边界的事(比如让你画复杂PCB),可以说“我可以帮你排查软件侧的问题,但PCB设计还是需要硬件工程师来做,这样更专业、效率更高”。

二、嵌入式工程师如何“深入”?(从新手到高手的路径)

“深入”不是“学更多东西”,而是“在核心领域做深、做透、形成竞争力”,例如分3个阶段:

第一阶段:夯实基础

核心目标:把“能干活”变成“干得对、干得稳”,重点突破“STM32底层+简单RTOS”。

  • 深入STM32H743
    • 不只是“会用I2C”,而是搞懂底层原理:
      • 比如I2C的时钟拉伸、应答机制、中断模式vs polling模式的区别;
      • 深入高级功能:MPU(内存保护)、Cache(缓存管理)、DMA(直接内存访问)、时钟树配置(比如如何优化时钟稳定性);
      • 实操:用DMA实现I2C读取AHT20数据(减少CPU占用),用MPU保护内核内存不被应用程序篡改。
    • 方法:反复读《STM32H743参考手册》(重点看外设章节、内存章节),每一个外设都做“底层寄存器配置”(别只依赖HAL库)。
  • 深入RT-Thread
    • 不只是“移植成功”,而是搞懂“如何写符合RT-Thread规范的驱动”:
      • 比如把AHT20、PCF8574做成RT-Thread的“设备驱动”(用RT-Thread的rt_device框架),支持rt_device_open/read/write接口;
      • 理解RT-Thread的内核机制:线程调度、信号量、互斥锁(比如用互斥锁解决多线程访问I2C的冲突);
      • 实操:把你之前的AHT20裸机驱动,改成RT-Thread的驱动模块,在RT-Thread上实现“线程1读温湿度、线程2打印数据”。
  • 必备能力
    • 会用调试工具:JLink(单步调试内核、查看寄存器)、示波器(测I2C/SPI信号);
    • 会排查问题:比如驱动报错时,能通过printk、寄存器值定位问题(不是瞎猜)。
第二阶段:突破核心—— 形成专业深度

核心目标:从“会用”变成“懂原理、能优化、能解决复杂问题”,重点突破“驱动开发+系统优化”。

  • 深入驱动开发
    • 不止于I2C,拓展到其他外设:SPI(比如驱动OLED屏)、UART(中断接收)、ADC(模拟信号采集)、CAN(车载/工业通信);
    • 理解“驱动框架”:比如Linux的i2c_driver框架、RT-Thread的device框架,知道驱动是如何注册、如何和硬件对接的;
    • 实操:写一个RT-Thread的SPI驱动(驱动SSD1306 OLED屏),支持显示温湿度数据。
  • 深入系统优化
    • RT-Thread/Linux优化:比如线程优先级配置、栈大小优化、中断延迟优化(比如减少传感器采样的延迟);
    • 内存优化:比如用MPU划分内存区域、优化Cache命中率(提升程序运行速度);
    • 实操:优化AHT20的数据读取速度,把采样延迟从80ms降到50ms(比如优化I2C时序、关闭不必要的中断)。
  • 必备能力
    • 能看懂复杂 datasheet(比如芯片的时序图、寄存器手册);
    • 能解决“疑难杂症”:比如I2C总线挂死、RT-Thread线程调度混乱、硬件信号干扰导致的数据错误。
第三阶段:形成竞争力—— 成为不可替代的人

核心目标:要么深耕一个细分领域,要么具备系统设计能力,二选一即可(不用贪多)。

方向1:深耕细分领域

选一个感兴趣且有前景的方向,做到“行业内精通”:

  • 方向A:嵌入式驱动专家(对应你的兴趣):
    • 精通各类外设驱动(I2C/SPI/CAN/USB);
    • 能写内核驱动(比如Linux的I2C外设驱动);
    • 能解决驱动层面的复杂问题(比如高速SPI的信号完整性、USB的兼容性问题)。
  • 方向B:实时系统专家
    • 精通RT-Thread/Linux内核原理;
    • 能做系统移植(比如把Linux移植到新的ARM芯片);
    • 能优化系统实时性、稳定性(比如工业控制、车载系统的实时性优化)。
  • 方向C:物联网(IoT)嵌入式专家
    • 结合WiFi/蓝牙模组(比如ESP8266),做物联网设备开发;
    • 精通MQTT/CoAP等物联网协议;
    • 能实现设备联网、数据上传、远程控制。
方向2:系统设计能力(适合想走管理/架构岗)
  • 能独立设计“嵌入式系统方案”:比如从硬件选型(选STM32型号、传感器)、软件架构(驱动层/应用层划分)、接口设计(和硬件/软件对接)全流程设计;
  • 能带队协作:比如分配任务给硬件/软件工程师、协调边界、解决跨岗位的复杂问题;
  • 实操:独立设计一个“智能温湿度采集终端”方案,包括硬件选型、软件架构、驱动设计、API设计。

核心原则:深入的关键是“聚焦”

不要贪多(比如既想学驱动、又想学Qt、又想学硬件),先把一个领域做深(比如先把STM32+RT-Thread驱动做透),再拓展其他能力。
比如你现在:先搞定STM32H743的MPU/Cache/DMA,再搞定RT-Thread的驱动框架,这就是“深入”,而不是同时去学PCB、学云端开发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 21:38:04

兰顿蚂蚁——CAD二次开发

效果如下:private static void OnTick(object sender, EventArgs e){if (_currentStep > _maxSteps){Stop();return;}// 检查是否暂停if (_isPaused)return;Document doc Application.DocumentManager.MdiActiveDocument;Database db doc.Database;var ed doc.Editor;usi…

作者头像 李华
网站建设 2026/5/9 7:39:53

进程优先级和切换

第一部分:进程优先级 (Process Priority)系统中的进程成百上千,但 CPU(核)可能只有几个。谁先用 CPU?这就涉及到竞争性。为了合理分配资源,必须要有优先级 。1. PRI 与 NI:一对“相爱…

作者头像 李华