嵌入式是一门交叉学科。
一个嵌入式电子产品(比如手机)从底层到上层,一般会涉及半导体芯片、电子电路、计算机、操作系统、多媒体等不同专业领域的知识。
很多从事嵌入式开发的朋友,通常来自不同的专业(电子、电气、计算机、机械、自动化、物理,甚至一些文科专业),在实际学习和开发中,由于专业背景的限制,经常会遇到各种技术壁垒:搞硬件的不懂软件,搞软件的不懂硬件,搞底层芯片的不懂上层软件,搞上层软件的不懂底层芯片。
嵌入式技术栈太深,除了极少数人,一般人很难实现“技术破圈”,将整个技术栈从上到下捋一遍,彻底打通。
相对于桌面开发,嵌入式开发还具有碎片化特点:不同架构(如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语言自我修养——从芯片、编译器到操作系统》
王利涛 著
- AIoT时代嵌入式开发集大成之作
- 10年工作及培训总结
- 从芯片编译器到操作系统等嵌入式开发所需核心理论和技能一应俱全
- 51CTO/CSDN/淘宝/QQ学员力荐
本书是一本专门为嵌入式读者打造的C语言进阶学习图书。本书的学习重点不再是C语言的基本语法,而是和嵌入式、C语言相关的一系列知识。作者以C语言为切入点,分别探讨了嵌入式开发所需要的诸多核心理论和技能,力图帮助读者从零搭建嵌入式开发所需要的完整知识体系和技能树。