游客发表
很多人以为嵌入式就是嵌入写单片机程序,这个理解太窄了。式需我见过一个做了五年STM32的嵌入工程师,跳槽去面一家做车载电子的式需公司,第一轮就被刷了。嵌入面试官问他:“你写的式需代码,如果编译器优化等级从-O0调到-O2,嵌入时序会出问题吗?式需”他答不上来。嵌入式这条线,嵌入往下走是式需寄存器、时钟树、嵌入中断向量表,式需往横走是嵌入RTOS、通信协议、式需硬件调试,嵌入往深走是编译器行为、内存模型、指令流水线。只盯着一块开发板和几个外设库,路会越走越窄。
先说说编程语言这块。C语言是吃饭的家伙,但“会写C”和“懂C”是两码事。指针、位操作、volatile、const、static这些关键字,在嵌入式里每一个都有实际含义。比如volatile,编译器优化时可能把变量缓存到寄存器,但硬件寄存器的值随时在变,不加volatile程序跑飞了你都不知道为什么。还有内存对齐、结构体填充、大小端,这些在PC上写业务代码很少操心的事,嵌入式里天天遇到。C++在嵌入式里用得越来越多,但别一上来就整虚函数、异常、RTTI,资源吃不消。模板和RAII在资源可控的前提下能用,但得心里有数,知道编译器给你生成了什么。
硬件基础绕不开。数字电路得能看懂原理图,知道上拉下拉、开漏推挽、三极管怎么当开关用。用万用表和示波器是最基本的,逻辑分析仪抓I2C、SPI波形也得会。我见过有人调试一个I2C传感器,读出来的数据一直是0xFF,查了半天代码,最后发现是上拉电阻没焊。这种问题,纯软件思维的人根本想不到。还有时钟配置,PLL倍频分频算错一个参数,整个系统跑飞。中断优先级配错,程序莫名其妙进HardFault。这些坑踩过一遍,比看十本书都管用。
RTOS和通信协议是分水岭。裸机跑大循环谁都会,但项目一复杂,任务多了,实时性要求上来了,就得用RTOS。FreeRTOS、RT-Thread、uC/OS,选一个吃透。任务调度、信号量、互斥锁、消息队列、优先级反转,这些概念得能跟实际代码对上。通信协议方面,UART、I2C、SPI是基础,CAN、Modbus、TCP/IP往上叠。别只调库,得知道协议帧怎么拼、CRC怎么算、超时怎么处理。有个做工业控制的朋友,产品在现场偶尔丢包,查了三个月,最后发现是CAN总线终端电阻匹配问题。协议层写得再漂亮,物理层出问题照样白搭。
调试能力和工具链是硬功夫。J-Link、ST-Link、OpenOCD,至少熟练用一种。GDB命令行调试、打条件断点、看反汇编、查内存映射,这些技能在解决疑难杂症时能救命。编译器选项也得懂,-O0和-O2生成的代码行为可能不同,链接脚本怎么写,段怎么分配,堆栈怎么设置。还有版本控制,Git要会用,但嵌入式项目里二进制文件多,.gitignore得配好,不然仓库爆炸。CI/CD在嵌入式里也在普及,自动化编译、单元测试、硬件在环测试,这些不是互联网的专利。
最后说方向选择。嵌入式太宽了,消费电子、汽车电子、工业控制、医疗设备、物联网,每个方向的技术栈和侧重点都不一样。汽车电子要懂AUTOSAR、ISO 26262功能安全;物联网要懂低功耗设计、无线协议、云端对接;工业控制要懂PLC、EtherCAT、实时以太网。别想着全学,选一个方向扎进去,其他方向了解个大概就行。我自己的判断是,底层驱动和系统优化这块,经验越老越值钱,因为坑都是时间堆出来的。应用层的东西变化快,但底层的东西十年二十年不会大变。把C语言、计算机体系结构、操作系统原理这三样啃透,换什么芯片、什么RTOS,上手都快。
友情链接