为什么招聘单片机工程师的时候要求精通C/C++?



把<C Primer Plus>过一遍,后面标注提到的重点细节详细掌握下,笔试基本都是C基础语法(关键字,宏,结构体, 枚举,指针和引用,数组,强制转换,位移,大小端,存储区,函数的健壮性),在结合数据结构(排序,查找,二叉树),在涉及一些硬件知识类的如(中断,AD的精度,RTC时钟转换)这一类,这里面考察的C语言知识在我看来也远远没有到达精通的地步。


除非从事嵌入式Linux开发,而且是QT界面应用方向的,C++知识储备是必须的。


对于大部分单片机工程师来说,对于C++基本停留在C with Class的程度,掌握模板的都不多,更不要说后面强大的STL,以及涉及函数式编程的lambda和模板元编程, 才会花时间去专门学习C++11,甚至去追逐了解前端框架,因为这些知识对于单片机开发事实上真的没啥用。


对于单片机来说,一方面要追求稳定可控,另一方面成本严苛,资源(RAM/FLASH)有限。

所以你可以看到NodeMcu和MicroPython的开发调试玩具卖的火热,却很难看到相应的技术用到产品领域。


这对于C++也一样,使用STL会带来编译结果(代码容量)不可避免的膨胀,如果***掉这部分,还不如使用C语言来的简单方便,这也限制了C++发挥的市场。


在单片机领域和嵌入式驱动开发,基本上C语言占有绝对地位,即使在Linux上层应用这块,Android/Java的开发优势也明显高于QT/C++,所以要求精通C++可以说是无稽之谈。事实上精通C++的要求有多高,你可以去相应问题下看看,这种人怎么会使用***的C++来从事单片机开发。


最后来说,精通C语言的问题,特别是精通单片机领域的C语言,是一个很困难的事。因为精通C语言不仅仅是掌握关键字和语法特性,和下面这些复杂但实用的操作,如位域实现对寄存器的位操作,利用结构体强制转换用于各种协议解析,函数指针实现异步回调,宏定义加##实现的函数格式化;


这些虽然复杂,但至少是有一套标准规则,只要去看书实践就可以了解掌握,但当你用C语言完成复杂稳定的项目代码,解决各种异常bug时,就会知晓C语言的精通不只上面这些固定的语法知识。


在调试中可能遇到指针越界,栈溢出,共享资源未保护,非对齐访问异常,编译器优化错误等,这些问题单独拿出来也许很容易找出来,但在复杂的十几万行的代码中,往往可能执行错误的地方工作表现是正常的,但干扰到其它部分,导致未出错的地方执行异常,这就需要的不仅仅是C语言的,还包含系统内核,总线架构和汇编的知识,精通C语言的困难正是在此。


你要理解掌握计算机技术中成体系的东西,对内存分配,总线架构,内核,汇编这些都有清晰的认识。


例如了解函数内的空间是在栈中,那么我们在函数中需要使用大数组时,就要考虑是否定义为静态变量(避免栈溢出),如果多个函数使用数组,就要考虑是否添加内存管理。


如果数组会被2字节/4字节的指针访问,在声明时是否考虑要强制对齐。另外如果用到了Cache和MPU,那么整个系统又更加复杂,何时需要写回,何时需要无效CacheLine,volatile的意义,以及配合Cache使用的注意点。


这些知识的掌握,其实都属于精通嵌入式C语言的一部分,因此可以说精通C语言并不简单。

【嵌入式物联网单片机学习资料】整理了全套精华学习资料,除了教程外,还有一些大厂面经+笔试面试题,开源共享给大家。

点击加V自取:http://s.pdb2.com/l/CMIsoKcnATFIF4M