嵌入式软件工程师技术栈,如何快速构建嵌入式全栈知识体系
关于【嵌入式软件工程师技术栈】,今天犇犇小编给您分享一下,如果对您有所帮助别忘了关注本站哦。
1、嵌入式软件工程师技术栈:如何快速构建嵌入式全栈知识体系?
嵌入式是一门交叉学科。
一个嵌入式电子产品(比如手机)从底层到上层,一般会涉及半导体芯片、电子电路、计算机、操作系统、多媒体等不同专业领域的知识。
很多从事嵌入式开发的朋友,通常来自不同的专业(电子、电气、计算机、机械、自动化、物理,甚至一些文科专业),在实际学习和开发中,由于专业背景的限制,经常会遇到各种技术壁垒:搞硬件的不懂软件,搞软件的不懂硬件,搞底层芯片的不懂上层软件,搞上层软件的不懂底层芯片。
嵌入式技术栈太深,除了极少数人,一般人很难实现“技术破圈”,将整个技术栈从上到下捋一遍,彻底打通。
相对于桌面开发,嵌入式开发还具有碎片化特点:不同架构(如ARM、MIPS、RISC-V等)、不同厂家的SoC处理器(如Cortex-M系列、cortex-A系列、AI芯片等),不同的操作系统(Linux、uC/OS、FreeRTOS、Android等),一般都需要匹配对应的编译开发环境,然后工程师才能基于这个编译环境做应用开发。
如果把软件开发比作开饭馆卖饺子,那么对于桌面软件开发而言,锅碗瓢盆、水电煤气,甚至饺子(超市里的速冻饺子)都准备好了,标准统一,就等着你下锅,可以根据顾客不同的需求,做成一道道不同的美食:猪肉芹菜的、三鲜的、蒸的、煮的、煎的。
而对于嵌入式开发,可能情况就不太一样了:没有现成的饺子成品可以用,擀饺子皮、剁陷、锅碗瓢盆都需要自己动手准备,开发环境需要自己搭建。
遇到问题,不能仅仅局限于当前的软件业务逻辑,可能还要从芯片、硬件电路、操作系统、底层驱动,甚至编译器等不同的维度去分析,去定位出现问题的原因。
随着半导体行业趋势的变化,以及国内对芯片行业的大力投入,国产芯片越来越多,未来嵌入式软件工程师的工作岗位和工作内容也会随之发生一些变化:
嵌入式开发人员不再仅仅是基于芯片厂家提供的现成的开发板、BSP软件包、产品方案去开发产品,而是有越来越多的工程师直接进入芯片原厂工作,参与芯片底层软件的开发和维护工作:芯片测试、操作系统移植、驱动开发与维护、以及基于自家芯片产品方案的推广和技术支持等工作。
在芯片设计前期,嵌入式软件工程师有时候还需要和IC工程师一起去测试芯片,编写相应的测试代码和测试案例。
工作职责和工作内容的变化,需要嵌入式软件开发人员不断扩充自己的知识体系,不断学习和解锁新的技能:C语言编程技能、软件工程、编译原理、计算机体系结构、操作系统、汇编语言、硬件电路,有时甚至还需要了解一些芯片设计、芯片制造、CPU内部结构等“圈外”知识。
每一个新的知识点,每一门新的技能,市面上都有大量的经典书籍可以参考阅读,但每一本书都很厚,都有自己偏向的领域和侧重点,和我们的实际工程需求往往有一定偏差,都需要花大量的时间和精力去阅读和消化,然后才能提炼出我们在嵌入式开发中所需要的一些核心知识点和关键技能。
有了这些核心知识点和关键技能作为理论支撑,我们就可以在嵌入式开发中更好、更快地解决各种工程问题。
工程师都很忙,没有大片的时间和精力去通读各种经典书籍,或者说很少有人能坚持读完。
嵌入式开发人员的专业背景各不相同,每个人的知识储备和点亮的技能树也参差不齐,知识体系的不完善和基础技能的储备不足,往往会影响实际工作的输出效率,在工作和学习中会遇到各种各样的问题无法解决,学习陷入困境,或者工作陷入卡壳。
那有没有更好的方法,快速掌握这些嵌入式开发所需要的核心知识点和关键技能呢?
答案是:有。
基于这个现实需求,《嵌入式C语言自我修养:从芯片、编译器到操作系统》出版了。
作者基于自己的嵌入式学习经历和工作经验总结,从最底层的一堆沙子开始,一步一步,带领大家学习CPU芯片是如何设计和制造出来的:
CPU内部结构是什么样的?
CPU是如何工作的?
编译器和指令集的作用是什么?
一个程序的编译、链接、安装和运行的过程是怎么样的?
程序运行时的内存世界是什么样的?
为什么会有内存错误?
栈溢出攻击是怎么回事?
如何才能真正地理解和掌握C语言?
为什么很多人在阅读Linux内核源码时感到很吃力,看不懂?
非计算机科班的朋友如何快速掌握操作系统的核心原理和概念?
如何快速理解多任务编程思想?
进程、线程和协程有什么区别?
这些疑问在书中都会一一讲解。
写作初衷
本书的写作初衷,主要是为不同专业背景的嵌入式学员弥补理论短板:以C语言为切入点,从最底层的芯片开始,到编译器、操作系统、软件工程、系统框架、进程、线程、协程,搭建一个嵌入式开发所需要的完整知识体系和认知框架。
平衡理论与工程
本书不会像经典书籍那样面面俱到,深入每一个细节,而是有的放矢,在理论和工程之间做一个平衡,一切都刚刚好:一切以满足实际工程需要为参考点,所有学习的知识点满足实际项目所需要的理论支撑即可,不会深入到学院派关注的各种细节和性能指标,以免深入其中无法自拔,耗费太多的时间。
掌握了这些实际开发中需要的核心知识点和关键技能,也就补齐了理论短板。
此时,相信大家也会对嵌入式开发有一个更加清晰的整体认识,在工作中遇到各种问题,都可以尝试用这个知识体系和认知框架去分析和解决,分析问题有了着力点,也就有了思路,也就不再迷茫。
通俗风趣
相比其他书籍,本书坚持使用大白话写作,通俗易懂,不怕学不会,就怕你不学。
使用风趣幽默的写作风格,以增强阅读体验,越读越想读,无论读多久都不会觉得枯燥。
内容新颖
在本书内容安排上,做了很多尝试性创新,比如:
- 独家讲解GNU C编译器扩展语法,帮你破解阅读Linux内核源码时遇到的各种稀奇古怪的语法难题。
- 首次在ARM平台下,通过反汇编,带你理解C语言背后的底层运行机制,深度讲解程序的编译、链接、安装和运行原理,深度讲解程序运行时的动态内存管理、内存泄漏、栈溢出攻击示例等。
- 结合嵌入式开发常用的三种场景:裸机环境、RTOS、Linux,帮助大家去分析和总结这三种场景下的内存管理,让你一览整个嵌入式开发环境概貌。
- 针对当前火热的人工智能、AIoT、异构计算等热门技术,从一堆沙子开始,一步一步带你了解整个CPU芯片设计、制造、封装流程,CPU内部结构及工作原理:流水线、cache、单发射、多发射、乱序执行,SIMD、NEON、多核、异构...
- 针对Linux内核驱动阅读难题,在本书中也分享了C语言的OOP编程思想,教你如何使用C语言来实现OOP编程,如何利用OOP思想去分析Linux内核中复杂的驱动和子系统。
- 针对电子类、自动化类等跨行进入嵌入式专业的朋友,零基础入门操作系统的核心概念,教你如何在裸机环境下使用多任务思想编程,如何使用状态机进行任务分解,以及RTOS任务调度的核心数据结构。让你不需要去啃大块头的《操作系统》书籍,直接切入操作系统最核心的知识点。
- 重点分享C语言的模块化编程思想,从零开始,从一个单文件开始,一步一步教你如何去封装一个模块,如何去使用一个模块,如何模块间通信,如何建立模块依赖,软件如何分层,模块如何解耦,如何将你的软件迭代为框架,帮你树立软件工程的意识,框架编程思想,让你写的代码更加容易扩展和维护。
- ARM架构越来越流行,在手机、平板、桌面PC和服务器领域攻城拔地,市场份额越来越大,而目前很多编译原理都是基于X86架构来分析的。本书打破惯例,首次在ARM平台上,通过反汇编手段,剔除编译过程中各种语法分析等对嵌入式工程师无关紧要的技术,给大家分享ARM平台下程序的编译、链接、安装、运行全景图,尤其是动态链接过程、多进程如何共享动态库、内核模块是如何动态加载和运行的、U-boot是如何自举并重定位的,这些嵌入式开发中经常遇到的核心知识点和难点,会带领大家逐一分析。
口碑之作
本书的大部分内容基于作者几年前录制的、专门为嵌入式工程师打造的C语言视频教程:C语言嵌入式Linux高级编程改编。
结合几千名学员的中肯评价和不断反馈,几经修改,不断优化结构和内容安排,纸质版如今才得以和大家见面。
全书正文560+页,加上目录、前言等,差不多600页,握在手上,沉甸甸的,全是干货。写书是枯燥的,耗时的,几经拖延,几经修改,最后还是跟大家见面了,用口碑和信念做编程教育,致力于分享最原汁原味的技术和干货知识,几千名学员的中肯反馈和积极评价是最让人欣慰的,也是这本书质量的保障。
愿这本书也能为你的嵌入式学习尽一份力,为你的嵌入式职场生涯增砖添瓦。
▊《嵌入式C语言自我修养——从芯片、编译器到操作系统》
王利涛 著
2、嵌入式软件工程师技术栈,嵌入式工程师必备技能
前言MDK的一个强大的功能就是提供软件仿真(注意:STM32F4不支持软件仿真),通过软件仿真,我们可以发现很多将要出现的问题,避免了下载到STM32里面来查这些错误,这样最大的好处是能很方便的检查程序存在的问题,因为在MDK的仿真下面,你可以查看很多硬件相关的寄存器,通过观察这些寄存器,你可以知道代码是不是真正有效。另外一个优点是不必频繁的刷机,从而延长了STM32的FLASH寿命(STM32的FLASH寿命≥1W次)。当然,软件仿真不是万能的,很多问题还是要到在线调试才能发现。 这里我们以战舰版跑马灯实验为例子。废话不多说了,接下来我们开始进行软件仿真。第一步主要检查芯片型号和晶振频率,其他的一般默认即可,具体操作如下:
(特别提醒:Xtal参数只用于软件仿真的,对于硬件仿真或者直接把程序下载到板子里是没有影响的。而且MDK5.35开始禁用外部晶振设置选项,所以是灰色的,显示undefined)第二步选择操作类型,以及设置DialogDLL等参数,具体操作如下:
选择:UseSimulator,即使用软件仿真。选择:Runto main(),即跳过汇编代码,直接跳转到main函数开始仿真。设置下方的DialogDLL分别为:DARMSTM.DLL和TARMSTM.DLL,Parameter均为:-pSTM32F103ZE,用于支持STM32F103ZE的软硬件仿真(即可以通过Peripherals选择对应的外设的对话框观察仿真结果)。第三步点击开始/停止仿真按键,开始仿真,出现如下界面
Register即寄存器窗口,这里一般用于查看程序运行时间即Sec处,以及一些比较高级的bug查找,主要就是对CortexM3内核寄存器R0~R14数据进行分析是否异常。Disassembly即反汇编窗口,C语言代码与汇编代码比对显示,方便从汇编级别进行查看程序运行状态,也是属于比较高级的bug查找。代码窗口,就是我们的工程代码了。左侧有黄色和绿色两个三角形,黄色三角形代表将要执行的代码,绿色的三角形表示当前光标所在代码,一般情况下,两个三角形是同步的,只要你点击其他位置查看代码时,绿色三角形就会移位。 CallStack Locals即调用关系和局部变量窗口,通过该窗口可以查看函数调用关系以及函数的局部变量,仿真调试时,很有用。 除了这些窗口,实际上还有一些其他窗口,可以根据实际需求去选择使用。上图还有一个很重要的工具条即Debug工具条。
复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。 执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。堆栈局部变量窗口:通过该按钮,显示CallStack Locals 窗口,显示当前函数的局部变量及其值,方便查看。观察窗口:MDK5提供2个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。内存查看窗口:MDK5提供4个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口。串口打印窗口:MDK5提供4个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。逻辑分析窗口:该图标下面有3个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(LogicAnalyzer),点击即可调出该窗口,通过SETUP按钮新建一些IO口,就可以观察这些IO口的电平变化情况,以多种形式显示出来,比较直观。系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。以上是比较常用的,当然不是每次都用得着,具体看你程序调试时候的需求。第四步点击LogicAnalyzer并点击Setup新建两个信号PORTB.5和PORTE.5,具体操作如下:
两个信号的DisplayType都选择bit,然后点击Close关闭对话框,可以看到逻辑分析窗口出现两个信号,如下图所示。
本文关键词:嵌入式软件工程师前景 知乎,嵌入式软件工程师是什么?需具备哪些能力?,嵌入式软件工程师岗位职责,嵌入式软件工程师教程,嵌入式软件工程师介绍。这就是关于《嵌入式软件工程师技术栈,如何快速构建嵌入式全栈知识体系》的所有内容,希望对您能有所帮助!更多的知识请继续关注《犇涌向乾》百科知识网站:http://www.029ztxx.com!
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。