一位高级嵌入式软件开发主管的技术栈

在这里总结了我学习工作多年以来的技术栈,既是自己的一个知识框架梳理,也是给有兴趣和志向从事嵌入式软件开发的小伙伴一些分享和交流~

通用的嵌入式技能

先来总结所有嵌入式软件开发都需要掌握的通用知识,适合在校学生参考。


计算机原理

  • 计算机的组成,原理和术语,如BIOS, WINDOWS, LINUX, 南桥,北桥,显卡,内存,硬盘,网络,电源等等。虽然说程序员不是修电脑的,但是确实从业多年后,自己修电脑的技术也得到了很大的提高了 @_@。
  • 常用的BAT/SHELL语句,这个上面说过了,基本技能。
  • 常用的系统配置,如环境变量,系统日志查看,WINDBG,计划任务,LINUX的APP安装,外设挂载等等。

常用的WINDOWS/LINUX工具

  • 办公软件:Office。
  • 文本编辑软件:Notepad++,Ultra Edit。
  • 邮箱工具:Outlook,Foxmail等。
  • 搜索工具:Everything。
  • 远程工具:Teamview, KConsole ( (= ^ _ ^ =) 自己C#开发的 )。
  • 绘图工具:DrawIO, Visio。
  • 虚拟机:VMWare, VirtualBox。
  • 笔记工具:OneNote,DokuWiki。
  • 网盘工具:OneDrive,Syncthing。
  • 数据分析:WINHEX,Beyound Compare。
  • 任务管理:PingCode。
  • 翻译软件:网易有道。
  • 文件传输:FTP,共享文件夹,KSync( (= ^ _ ^ =) 自己C#开发的 )。
  • 会议工具:Zoom,Teams,腾讯会议。

常用的网站

  • 开源项目:GitHub, Gitee,我自己也会用他们来放一些自己个人的项目,其他GitHub的项目更加丰富,但是不能保存私有仓库而且访问经常受阻,Gitee访问速度快而可以存放私有仓库,但是相对的热门开源项目会少很多。
  • 论坛:21 IC,电子发烧友等。
  • 博客:CSDN,博客园,简书。
  • 技术速查:runoob。
  • 电子书下载:脚本之家。
  • 专利查阅: SooPat。

编程语言

  • C. 嵌入式软件开发的核心语言,80%以上的代码都是由C完成的。其实C的语言本身并不复杂,核心就是指针和内存管理。工作上更多地是将精力放到协议、业务和算法等功能的实现上,因此,C语言必须十分熟悉,信手拈来。
  • C#. 嵌入式产品少不了和上位机打交道。有时候是因为通用的工具不满意,有时候是需要定制化一些功能。此时使用C#来做WINDOWS GUI的工具十分方便。得益于丰富且强大的Microsoft.NET Framework库,使用VS+C#的开发模式,学习成本很低就能作出功能强大的工具。后续自己也开发了好几款PC工具,在工作上起了很大的助力作用。
  • PYTHON. 最早学习PYTHON是因为它实在太火了,抱着好奇的心态去学习了一番。然后很快就被它给征服了。PYTHON的语言包袱很低、学习资料齐全、而且有各种各样的库可以使用,因此学习和使用都十分轻松。这里也推荐大家将PYTHON作为自己的第二语言。我在工作中使用PYTHON做一下数据分析和处理,十分高效便捷。
  • BAT/SHELL. 脚本语言,只要你的产品需要在WINDOWS/LINUX下运行或者测试,总是需要使用到的,不需要精通,但要知道怎么查资料来快速完成编写。
  • C++. 早期在学习嵌入LINUX的GUI开发时有用过QT,里面就要用到C++做开发。后面用得比较少,主要是因为C#太方便了 ╮( ̄▽  ̄)╭ 。但是让我印象深刻的一点是QT的可移植性真的强,代码几乎不用修改,就可以在linux,嵌入式linux和windows下直接编译运行。
  • Assembly. 做嵌入式必须掌握基本的汇编语言。倒不是平时大家说的为了优化性能嵌入汇编代码,这个我从来没见过,反而读研时这个干过,自己写的汇编代码效率不高反而没有直接用C运行得快。主要是CPU在boot up, Hibers, 以及移植rtos时,少不了要使用汇编在实现功能。因为此时栈已经消失,C语言不能用了。如果看不懂汇编,那这个阶段调试起来就举步维艰了。
  • Markdown. Makrdown是目前最热门的标记语言了,当然除了Markdown还是其他的如Syntax等其他标记原因。不过学会了一种其他的也是依葫芦画瓢的。
  • Other. Matlab,JAVA等等,用得不多。

编程技能

  • 编码规范:Linux编码风格以及公司研发内部要求的命名格式,包括命令、缩进、注释、复杂度、可读性等要求。
  • 数据结构和算法:栈、队列、链表、树、排序、查找等。
  • 实时操作系统编程:FreeRTOS,RT-Thread,uCOS等。
  • Linux系统编程:文件(open, read, write, close),进程(fork, exec, wait),线程(pthread, sem, mutex),网络(Socket),同步共享(pipe, mq, sem),I/O模型。
  • 嵌入式Linxu系统构建:ubooty移植,kernel移植,根文件系统构建。
  • 嵌入式Linxu驱动编程:字符设备,块设备,网络设备。

开发工具

  • 代码管理工具:GIT,SVN,GITLAB。
  • 串口工具:XCOM,KCOM( (= ^ _ ^ =) 自己C#开发的 )
  • 编译环境和编译器:CMake,Make,armcc,arm-linux-gcc,VS。
  • IDE: Visual Studio, Keil, IAR, VS Code, ADS(Arm Development Studio),QT。
  • 调试工具:Ozone, GDB, Segger Jlink全家桶。

测试技术

  • 黑盒测试:CI持续集成测试(Daily/Weekly),代码Merge测试,冒烟测试(Smoke test),回归测试(Regression test)。
  • 白盒测试:单元测试,静态代码检查PC-lint。

硬件技能

  • SCH:看懂原理图,熟悉基本的模拟电路、数字电路原理。
  • PCB:掌握基本的PCB布线规则,进阶可以掌握Altium Designer等软件进行PCB设计。
  • 焊接:最基本得懂得怎么焊飞线,进阶可以掌握焊SOP,LQFP,BGA等封装的IC。
  • Spec/datasheet:看懂芯片手册,需要CET4或以上的英语基础。

开发管理技能

  • 软件协作管理工具:JIRA,PingCode。
  • 多人写作知识库:Confluence,DokuWiki。
  • 开发模式:IPD集成产品开发流程、瀑布线开发、V字形开发、敏捷开发等。

其他感兴趣的技术

  • 人工智能:深度学习TensorFlow。
  • 无人机:四轴。
  • 物联网:TCP/IP,Lora,Zibee,Bluetooth,MQTT。


专业领域的技能

嵌入式开发是一个很庞大很广泛的技术。除了一些通用技能外,还有各行各业的领域细分。不同的细分需要掌握的技能可谓是各不相同。例如:

  • 无人机领域,需要掌握姿态角合成,电机控制,无线通讯等技能;
  • 物联网领域,需要掌握各种各样的通讯协议,TCP/IP,Lora,Zibee,Bluetooth,MQTT等;
  • 工业控制,需要掌握电机控制,MODBUS/CAN总线通讯,GUI开发等;

本人是从事存储产品开发的,存储产品包括SSD,UFS,eMMC,SD卡,U盘等。属于一个比较小众的领域,但其技术壁垒也是十分的高。
可以说通用的技术栈只是嵌入式工程师的基础,真正有体现价值的技术还是在于你在某个细分领域的专业程度。只有自己的专业领域有了一定高度的建树,才具有自己的不可替代性,才能体现出自身的经验。
而电机控制、网络通讯、GUI开发等细分技术,都有可能是自己奋斗一辈子都没有掌握透的技术。因此专业领域的技术栈,更加体现工程师的职业高度。

在后续的文章也我也会继续与大家分享我的专业领域的技术栈~


posted @ 2022-02-20 20:59  冷剑白狐77  阅读(3861)  评论(1编辑  收藏  举报