电子数字计算机诞生于1946年,在其后漫长的历史进程中,计算机始终是供养在特殊的机房中,是只能实现数值计算的大型昂贵设备。直到20世纪70年代,微处理器的出现,计算机才出现了历史性的变化。以微处理器为核心的微型计算机以其小型、价廉、高可靠性特点,迅速走出机房;基于高速数值解算能力的微型机,表现出的智能化水平引起了控制专业人士的兴趣,要求将微型机嵌入到一个对象体系中,实现对象体系的智能化控制。现在你看到到的一些智能设备大多数都是嵌入式开发出来的,可以说嵌入式无处不在。
嵌入式的发展大大改善了人们的生存状态,人们可以让机器代替我们去生产,也可以使用更先进的设备来娱乐生活,让我们的生活变得更智能化,可以说嵌入式代表着最先进的生产力。而未来对智能设备和自动化设备的需求肯定也是越来越高,毕竟人总是懒惰的,也总是爱享受的,机器干活了人就可以歇着了,更高端的智能设备也能丰富人们的生活,所以成为一名嵌入式工程师是非常有前途的!
要学习嵌入式就要先学习C和C++这两门编程语言。其实要成为“代码搬运工”,我觉得还是很简单的,为什么呢?编程语言其实也是语言,我们只要将要执行的动作翻译成芯片的语言就可以了。举个例子我们要拿起一个苹果,但是我们不是自己去拿,我们要让一个只听得懂英语的工人去拿,怎么办呢?你要用英语告诉他“pick up this apple”,只有这样讲他才会去拿起苹果;现在我们把这个工人换成了只听得懂C语言的芯片,你该怎么办呢?同样的,你要用C语言告诉芯片去拿起苹果,道理都是一样的,只是C语言有C语言的用法,我们只要按着他的规则写就OK了。
对于嵌入式底层工程师来说,我们要学习的不仅仅是C语言的基本语法,更重要的是如何通过C语言这个工具,去理解我们的计算机系统、CPU架构:
1)程序到底是如何编译、链接、和运行的?
2)运行时各种代码段、数据段、BSS段、堆栈在内存中如何分布,如何管理的?
3)程序在不同的平台(ARM、X86)、裸机环境或有OS的环境(linux、uc/os等)有何不同?
4)静态链接与动态链接的过程有何差异,为什么要使用动态链接?共享库?
5)不同的开发平台、IDE、编译器,C语言的编程有何差异和不一样的地方,如何做到跨平台、增强程序的可移植性和鲁棒性?
6)各种变量名、函数名、数组名、指针的本质是什么?编译器是如何处理的?
搞懂了这些语言背后计算机系统知识,还远远不够,还要去学习操作系统相关的知识:进程、线程、中断、内存管理等。
对于嵌入式开发来说,还要学习ARM等处理器架构知识、GCC编译器对C标准的各种扩展,各种生僻的用法,否则你去看linux内核代码、驱动代码,总感觉“怪怪的”,好像哪里不对,跟平时的C语言不太一样,感觉自己学的是一门假C语言......
C语言的精华是内存、存储管理。各种隐藏很深的bug其实也跟内存有关:内存越界、内存泄露、野指针等等,一个不经意的疏漏,就可能阴沟里翻船。就是有多年工作经验的工程师也不敢保证自己写的代码一定没有问题。C语言默认大家都是大牛、计算机专家,可惜现实中往往太多挖坑小能手,太多猪一样的队友。如何养成良好的编程习惯,避免各种bug,也是C语言进阶学习的一个重点。
网友评论