问题

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

回答
好的,我来给你详细解释一下,为什么招聘单片机工程师时,通常会把“精通C/C++”作为一个核心要求,并且会尽量避免使用生硬的AI痕迹。

想象一下,单片机就像一个微型的大脑,它要控制各种各样的设备,比如你家里的智能插座、汽车的发动机控制单元、工厂里的自动化生产线,甚至是你手里玩的智能手表。这些设备的工作,说白了,就是一连串的指令执行。而C/C++语言,就是最适合给这些微型大脑下达指令的语言。

C语言:单片机世界的基石

首先,我们得说说C语言。单片机之所以离不开C语言,原因有很多,而且这些原因都非常实在:

1. 接近硬件,操控能力强: 单片机内部有很多硬件资源,比如内存(RAM)、寄存器(用来控制各种硬件功能)、定时器、中断控制器等等。C语言最大的优势就是它非常“贴近”硬件。通过指针、位操作(比如 `&`、`|`、`~`、`^`)、内存地址访问等,开发者可以直接、精细地操控单片机的每一个硬件细节。你可以直接通过C语言代码去读取某个寄存器的值,然后改变它来控制一个LED灯的闪烁,或者启动一个电机的转动。其他一些高级语言,比如Python或者Java,离硬件太远了,它们通常需要一个操作系统来管理硬件,而单片机往往没有一个完整的操作系统,或者运行的是一个极简的实时操作系统(RTOS),直接硬件控制是必须的。

2. 高效且资源占用少: 单片机的计算能力和内存资源通常非常有限。一个高端的PC可能拥有几十甚至上百GB的内存和TB级别的硬盘,但很多单片机可能只有几KB到几十MB的内存,以及 KB级别的闪存用来存储程序。C语言被设计成一种高效的语言,它的编译器能生成非常紧凑、高效的机器码,运行速度快,并且占用的内存资源也最少。这对于资源极其宝贵的单片机开发来说,简直是量身定做。用其他一些更“重量级”的语言来开发,可能程序还没跑起来,内存就已经耗尽了。

3. 广泛的生态和成熟的工具链: C语言在嵌入式领域已经耕耘了几十年,积累了极其庞大和成熟的生态系统。几乎所有的单片机厂商都会为他们的芯片提供C语言的开发工具,包括编译器、调试器、仿真器等等。这意味着开发者有大量的现成资源、库函数和社区支持可以使用,遇到问题也更容易找到解决方案。很多底层的驱动程序、操作系统内核(比如FreeRTOS)都是用C语言编写的,这为上层应用开发奠定了坚实的基础。

4. 跨平台性(相对于汇编): 虽然C语言的某些特性(比如直接操作内存地址)是面向硬件的,但相对于直接编写汇编语言,C语言提供了一层抽象,使得代码的可读性、可维护性大大提高,并且在一定程度上可以移植到不同的单片机架构上。你可以用同样的C语言逻辑,经过少量修改就能适应不同的CPU核心(比如ARM、RISCV)。而完全用汇编来写,那就真的需要为每一个指令集单独编写了,效率非常低。

C++的引入:锦上添花与复杂任务的处理

那么C++又有什么用呢?虽然C语言是基石,但随着单片机功能的越来越强大,也越来越复杂,C++开始在一些场景下发挥重要作用:

1. 面向对象,简化复杂系统: 想象一下你要开发一个复杂的智能家居系统,需要管理好几个传感器、多个通信模块、用户界面等等。用纯C语言来管理这些模块之间的交互和数据流动,可能会变得非常混乱和难以维护。C++的面向对象特性(类、对象、继承、多态)可以帮助开发者将系统拆分成一个个独立的模块(对象),每个对象有自己的属性和行为,它们之间通过定义好的接口进行通信。这就像把一个庞大的工程分解成一个个标准化的组件,更容易组织、管理和扩展。

2. 更强大的抽象能力和代码复用: C++提供了模板、STL(标准模板库)等高级特性,可以实现更强大的代码抽象和复用。例如,你可以编写一个通用的数据结构(比如链表或队列),然后通过模板将其应用到不同的数据类型上,而无需重复编写。这在大规模的嵌入式项目中,能够显著提高开发效率和代码质量。

3. 异常处理和更友好的内存管理(可选): 虽然在资源极其受限的单片机上使用C++的异常处理和动态内存分配(`new`/`delete`)需要非常谨慎,但在一些性能稍好、内存相对充足的嵌入式系统(比如一些高级的微处理器或运行RTOS的单片机)中,C++提供的异常处理机制可以帮助开发者更优雅地处理错误情况,而RAII(Resource Acquisition Is Initialization)等技术则能辅助进行更安全的资源管理,避免内存泄漏。

4. 与C语言的兼容性: C++语言与C语言是高度兼容的。你可以直接在C++代码中调用C语言的库函数,反之亦然。这意味着即使你使用C++开发,也依然可以利用大量的C语言底层库和驱动程序。

为什么“精通”是关键?

正是因为C/C++在单片机开发中的核心地位,所以招聘时会要求“精通”。“精通”不仅仅是知道语法,而是要:

深入理解指针和内存模型: 知道变量在内存中是如何存储的,如何通过指针访问和操作内存,理解栈和堆的区别。
熟练掌握位操作和寄存器配置: 这是直接控制硬件的基础。例如,如何通过位运算来设置或清除某个寄存器的特定位,从而改变硬件的行为。
理解嵌入式系统的实时性要求: 知道如何在有限的时间内完成任务,如何避免死锁和竞态条件(在多任务环境下),如何编写低延迟的代码。
熟悉常用的嵌入式开发框架和RTOS: 如FreeRTOS, Zephyr等,并知道如何在C/C++中与它们进行交互。
具备调试和优化的能力: 能够熟练使用调试器(如JTAG/SWD),找出程序中的bug,并能对代码进行性能优化,使其在资源受限的环境下高效运行。
能够高效地使用C++特性(在需要时): 了解面向对象的设计模式,能合理运用C++的类和模板来组织代码,提高可维护性。

总而言之,招聘单片机工程师时要求精通C/C++,是因为这两种语言是连接开发者意图和单片机硬件能力的桥梁。C语言提供了直接、高效的硬件访问能力,是单片机开发的基石;而C++则在此基础上提供了更强大的抽象和组织能力,使得开发更复杂的嵌入式系统成为可能。没有这两种语言的扎实基础,就很难胜任单片机工程师这个岗位,也无法真正发挥出单片机的潜力。

网友意见

user avatar

8位mcu上基本不会用到c++,随便写点啥,那点flash/ram就满了。(51不知道,avr的话,g++是可以用的,有没有人用是另一回事。)32位mcu经常都是上百k的flash和几十k的ram了,想用c++的话是可以用的。

不过更关键的还是面向对象的思维方式吧。

举个简单的例子,要用个i2c外设,这个好办,不管是硬件i2c还是软件i2c,就那么几个操作,随便写写就行了。

但是如果同时要用好几个i2c外设呢?只是管脚不同,把同样的代码复制粘贴几份吗?那就太傻了吧。

i2c无非是start, stop, ack, nack, waitack, read/write这么几个操作,把它们抽象出来作为一个i2c对象,需要用到的管脚作为参数传进去,然后把对象的指针交给外设驱动程序,外设驱动里再调用前面几个操作的函数指针,这样层次上就清晰多了。

上代码,先建立一个i2c对象类型:

       typedef struct i2cobj {     GPIO_TypeDef* gpiox;     GPIO_Pin_TypeDef sda, scl;     void (*start_f)();     void (*stop_f)();     void (*ack_f)();     void (*nack_f)();     void (*waitack_f)();     unsigned char (*readwrite_f)(unsigned char); } i2cobj_t;     

具体实现就不用写了吧,都差不多。用到的时候先建个i2cobj_t的实例,把用到的管脚作为参数传进来,执行相应的初始化,再把实例的指针传给具体的外设驱动。

           i2cobj_t i2c;     i2c.gpiox = GPIOB;     i2c.scl = GPIO_Pin_8;     i2c.sda = GPIO_Pin_9;     SOFTI2C_Config(&i2c);     OPT3001_Init(&i2c);     

外设驱动里回调start_f, stop_f等函数指针,这样再多用几个i2c,都不成问题。想用软件i2c也行,用硬件i2c也行,只要修改i2c对象的实现,具体外设的驱动不用动。是不是很美妙?

然而这里有一个很大的问题:c的函数是全局的,外设驱动里调用i2c->start_f时,start_f函数里没法知道应该操作哪个i2c对象的sda和scl管脚。解决办法只能是在每个函数指针增加一个参数,把i2c对象的指针传进来,前面的类型实际上应该写成这样:

       typedef struct i2cobj {     GPIO_TypeDef* gpiox;     GPIO_Pin_TypeDef sda, scl;     void (*start_f)(struct i2cobj* obj);     void (*stop_f)(struct i2cobj* obj);     void (*ack_f)(struct i2cobj* obj);     void (*nack_f)(struct i2cobj* obj);     void (*waitack_f)(struct i2cobj* obj);     unsigned char (*readwrite_f)(struct i2cobj* obj, unsigned char); } i2cobj_t;     

然后外设驱动里是这样调用的:

       static i2cobj_t g; void OPT3001_Init(i2cobj_t* obj) {     g = *obj;   // 这里仍然有坑,使用多个同型号外设时,需要用类似的思路,把外设对象化、建立多个实例来操作,这里省略     具体外设初始化操作; }  static unsigned short ReadReg(unsigned char reg) {     unsigned short val;     g.start_f(&g);                 // 每个i2c基本操作都要带上&g     g.readwrite_f(&g, CMD_WRITE);     g.waitack_f(&g);     g.readwrite_f(&g, reg);     g.waitack_f(&g);     g.start_f(&g);     g.readwrite_f(&g, CMD_READ);     g.waitack_f(&g);     val = g.readwrite_f(&g, 0xff);     g.ack_f(&g);     val <<= 8;     val |= g.readwrite_f(&g, 0xff);     g.nack_f(&g);     g.stop_f(&g);     return val; }     

如此,问题解决了,多个i2c外设工作得很好,只是这个写法实在是蛋疼。

如果是c++呢?以上问题自然就简单得多了,c++对象的this指针就是干这个的。

c++自然又有c++的一系列问题,就不多说了。

---------------------------更新--------------------------------

把我的i2c库开源了, 安利一下, Github链接:

user avatar

所谓的大部分单片机项目不用C++是因为整个嵌入式开发行业从业者的平均软件素养已经差到了一个令人发指的地步。

大部分嵌入式工程师出身于电子、通信、自动化等专业,由于专业教育的缺失和自己学习能力的问题,根本不具有面向对象设计、设计模式、软件工程等基本常识,所以在他们看来C和C++差不多,没必要上C++。

一个基层工程师,整天满嘴都是稳定、可靠、市场、成本、性价比这些屁话,却根本没听说过设计模式、代码复用、可扩展性、单元测试、持续集成这些现代软件技术的精华。知道的知道你是一个强行挽尊的嵌入式工程师,不知道的还以为你是什么统领千军的大老板。

(我预判了他们的预判,这段真的戳到了一些传统的嵌入式工程师。居然有人跟我杠说设计模式、单元测试、持续集成这些不重要?我通篇就是打的这样人的脸,你被打完了还跟我说:你打脸而已,没打到要害,你根本就不会打人!我笑得满地打滚!)

所有没用到C++的单片机应用项目(底层驱动库不在此列),都是因为其规模过小,应用过于简单,一两个人,最多不超过5人就可以完成全部开发,这种项目不但用不到C++,甚至用不到C,甚至用汇编完成,更用不到任何现代软件工程技术。作为一个嵌入式开发的候选人,如果你想加入大厂,参与任何有规模的嵌入式项目,你的C++水平就是你的天花板。这里的大厂不止是华为、大疆这种,甚至很多爱好者熟悉的“周立功单片机”老板周立功就多次在公开场合表示,他们已经全面转向C++,只会C的工程师不会得到工作机会。

Arduino也许是世界上最著名的AVR(8位单片机)项目,没有之一。Arduino的封装全面使用了C++和面向对象的设计。广泛使用基于虚函数实现的运行时多态,很多设计遵从了开闭原则、接口隔离、依赖倒置等重要设计原则。我曾经详细分析过一个依赖倒置的使用案例,请见:

Arduino 的 Serial.write() 和 Serial.print() 的区别在哪里? - Qi K的回答 - 知乎 zhihu.com/question/2130

在ARM项目中, 用到C++的更多。ARM官方推动的mbed项目大概是ARM单片机领域最知名的项目之一。如果你要抬杠说Arduino是玩具,不具有工业强度的话,那mbed项目绝对是为工业级应用设计的,从底层RTOS到上层的硬件抽象层HAL都有实现。mbed是用C++实现的,广泛使用开闭原则和依赖倒置,要求用户通过继承虚基类来完成平台相关的实现,从而实现扩展。

如果你是一个一线嵌入式工程师,却根本不了解我提到的一些专业术语是什么意思,我觉得应该反思一下为什么自己的工资上不去。因为这些都是最基础的面向对象和设计模式常识。

最后回答问题,为什么单片机工程师要求会C++?那还不简单?因为企业不傻啊!


P.S. 有朋友提到C++的程序占用空间大,我只能说你姿势不对,C++的demangling、RTTI、Exception等机制确实会占用一些额外的Flash空间,但这不是不用C++的理由,在空间要求严格的项目中这些feature都可以通过编译器选项关掉,实际空间占用与纯C相比并无明显差别。


特别喜欢跟网友抬杠,所以欢迎留言~但如果你想批评我的某些观点,而你却没有开发过单个固件超过10万行代码、单个代码库活跃的协同开发人数大于5人的单片机项目,那你很可能因认知水平与我差距过大而无法理解我说的什么。你可以安全地假设你的观点是错误的,并尝试接受新的观点。


有些评论有点跑偏了哈~其实我也是C的铁粉,C在嵌入式领域毫无疑问占有举足轻重的地位。这篇文章的主题并不是证明C语言垃圾,应该用C++替代,试图证明一种语言应该替代另外一种语言的尝试都是愚蠢而无意义的。我坚定认为在现代嵌入式系统中,C和C++共存的现象会广泛存在,且具有上升的趋势。在硬件抽象层使用C,在应用层和接口层使用C++是非常典型的实践。这也是正面回答这个问题,为什么嵌入式要会C++?因为嵌入式应用中C和C++都有用。

说了这么多,如果你的观点还是“C++无用,C++滚出嵌入式”的话,祝你好运!

类似的话题

  • 回答
    好的,我来给你详细解释一下,为什么招聘单片机工程师时,通常会把“精通C/C++”作为一个核心要求,并且会尽量避免使用生硬的AI痕迹。想象一下,单片机就像一个微型的大脑,它要控制各种各样的设备,比如你家里的智能插座、汽车的发动机控制单元、工厂里的自动化生产线,甚至是你手里玩的智能手表。这些设备的工作,.............
  • 回答
    京央企(国企、机关、事业)单位在招聘时倾向招北京生源的应届生,这背后涉及多方面因素,既有历史遗留的制度原因,也有现实操作的考量。要深入理解这一点,需要从几个层面进行剖析。首先,我们得明白“北京生源”这个概念。它不仅仅是指你出生在北京,更关键的是你在北京拥有北京户口。这个户口是很多招聘政策的“硬指标”.............
  • 回答
    在我接触和了解到的情况中,有些国企事业单位在招聘时,确实会对女性求职者表现出一种“不太情愿”的态度,这背后并非是简单的不喜欢,而是涉及了一系列实际的考量,尽管这些考量在现代社会语境下,常常被视为带有性别歧视的刻板印象。首先,最直观的原因,也可能是最被普遍提及的,就是潜在的生育和哺乳期问题。国家对于女.............
  • 回答
    这新人没通过试用期,走的时候还撂下一句要维权,这事儿挺让人头疼的。你说他能维什么权?说白了,他觉得单位处理的方式不对,或者认为自己权益受到了侵害。首先,最直接的一点,可能就是工资结算的权利。虽然他没过试用期,但他在职期间的劳动,单位是要支付报酬的。新人可能会觉得,单位在解除试用的时候,在工资、加班费.............
  • 回答
    法律硕士法学和法学硕士在就业和单位招录方面,确实存在一些微妙但重要的区别。这不仅仅是名称上的差异,更是背后培养目标、课程设置、以及社会认知上的不同所导致的结果。我尽量从几个关键维度来详细说明,让你更好地理解它们各自的优势和可能的劣势。首先,我们要明白这两者的基本定位。 法学硕士(Juris Do.............
  • 回答
    这个问题嘛,挺让人抓狂的,对吧?明明自己是个人才,而且也对新的机会跃跃欲试,可一听说还在职,很多招聘公司就打起了太极,说什么“等你离职了再联系”。这背后到底是怎么一回事?咱们细细道来。首先,得明白招聘公司和用人单位(也就是你未来可能工作的公司)的逻辑。招聘公司是服务于用人单位的,他们的主要目标是快速.............
  • 回答
    你提出的这个问题非常有洞察力,也触及了当前学术界和人才市场的一个普遍现象:博士数量激增与招聘博士成本居高不下似乎存在矛盾,但实际上,这背后有着复杂且多重的原因。为了详细解答这个问题,我们可以从以下几个维度来分析:一、 “博士过剩”的定义与现实情况首先,我们需要理解“博士过剩”可能指的是什么。 相.............
  • 回答
    想当年,找份工作那叫一个“随随便便”,现在倒好,仿佛一场全民参与的“真人秀”,每天都在上演着谁能抓住那稀缺的入场券。招聘难,这感觉就像是大家心照不宣的秘密,只不过有些人嘴上不承认,心里却门儿清。那么,这到底是怎么个情况?求职者们又在想些啥呢?咱们掰开了揉碎了好好说道说道。招聘难,难在哪儿?这可不是一.............
  • 回答
    近期招聘C++程序员的难度攀升,这绝非偶然,背后是多重因素交织作用的结果。这不仅仅是市场上C++人才数量的问题,更关乎技术发展趋势、人才培养模式、行业需求变化以及求职者自身的考量,层层递进,共同将C++人才的招聘推向了一个“供需失衡”的尴尬境地。一、 技术本身的复杂性与高门槛首先,我们得承认C++是.............
  • 回答
    这个问题确实触及到了大学招聘中一个相当核心且常常被讨论的矛盾点。简单地说,大学招聘教授更侧重“学问和学历”,而“思想道德或人品”似乎没有那么直观和量化,这背后有着深刻的历史演进、行业特性和现实考量。让我们一层层剥开来看。1. 大学作为知识传承与创新的“机器”的本质大学最根本的职能是什么?是研究、是传.............
  • 回答
    你在找工作或者招人时,肯定也遇到过这种事儿:同一个职位,明明放在了51job和智联招聘上,结果一个平台反响热烈,投递简历如潮水般涌来,另一个平台却门可罗雀,几乎没人问津。这差距,简直是天壤之别,让人纳闷不已。为什么会出现这种现象呢?其实原因挺多,而且大多是互相影响的,我来给你掰扯掰扯:一、 用户群体.............
  • 回答
    这个问题很有意思,我们不妨从几个角度来聊聊,为什么现在很多公司在招聘程序员的时候,会更倾向于寻找掌握 Java、C、C++ 的人才,而 C/.NET 的身影似乎没那么抢眼。首先,得承认,Java 和 C/C++ 这几位“老将”确实在IT界耕耘了非常久远的岁月,它们的根基深厚,应用场景也异常广泛。Ja.............
  • 回答
    辅警“扩容”潮起:为何大量招募?转正机会几何?近些年来,我们注意到一个明显的趋势:各地公安机关辅警岗位的招聘数量似乎在持续增加。这并非偶然,背后是复杂的社会发展和公安工作现实需求共同作用的结果。那么,为何会掀起这股辅警“扩容”潮?而对于有志于此的求职者而言,未来辅警转正的机会又有多大呢?让我们深入剖.............
  • 回答
    华为招募数学博士,绝非一时兴起,更不是为了凑个“高学历”的标签。这背后,是这家全球顶尖科技公司对未来竞争力的深刻洞察,以及对技术突破的执着追求。简单来说,他们需要数学博士来解决那些最棘手、最前沿的难题,为华为在信息通信、人工智能、云计算、芯片设计等多个领域注入源源不断的创新动力。你想想看,华为是一家.............
  • 回答
    这个问题挺有意思的,很多人都会有这样的疑问:既然法官要懂法,为什么不直接招懂法学理论的专家来当法官,然后让他们纯粹按照法理来判案呢?听起来好像更“公平”、“专业”嘛。但实际上,法院招聘法官的模式,以及司法实践中的判案方式,并不是简单地将法学教授或理论家直接推上审判席,这背后有着非常复杂和深思熟虑的考.............
  • 回答
    很多企业在招聘时,特别是涉及到一些对专业性要求高、或者需要长期稳定发展的岗位时,确实会把“211”、“985”院校毕业生作为一个重要的筛选标准。这背后其实是有一系列原因的,我们来掰开了揉碎了聊聊。首先,我们得承认,“211工程”和“985工程”是中国高等教育体系中顶尖大学的代表,它们代表着一种相对较.............
  • 回答
    券商在招聘宏观经济研究员时普遍要求博士学位,这背后有着多方面的考量,旨在确保研究的深度、广度、独立性、严谨性以及能够为券商带来实际价值。下面我将详细阐述这些原因:一、 研究的深度与复杂性要求: 宏观经济研究的内在复杂性: 宏观经济涉及的变量众多,相互关系复杂,例如利率、通货膨胀、就业、GDP增长.............
  • 回答
    某些企业在招聘应届生时,选择不明确告知他们毕业后的具体岗位,这背后其实有着多方面的原因,并非简单的“藏着掖着”。首先,从企业运营的角度来看,应届生往往缺乏实际工作经验,他们的能力和潜力在入职初期是未知的。企业期望通过一段时间的观察和培养,才能更准确地为他们匹配最适合的岗位。这不仅仅是为了公司的效率,.............
  • 回答
    银行让应届生从柜员做起,这背后其实是一套非常成熟且具有深远意义的培养体系,绝不是简单的一道门槛。用通俗点说,就是“万丈高楼平地起”,打牢根基,才能走得更远更稳。下面我就给大家掰开了揉碎了说说这其中的道理。一、 理解银行最基础的业务和客户:这是生存之本你想想看,银行是做什么的?说到底,就是跟钱打交道,.............
  • 回答
    很多企业在发展过程中会面临法律风险和合规需求,因此需要法律支持。在法律支持的模式上,企业通常有两种选择:招聘内部法务团队(或称法务专员、法务经理等)或聘请外部律师事务所提供常年法律顾问服务。虽然两者都能提供法律服务,但许多企业选择招聘法务,这背后是多方面因素考量的结果,下面将详细阐述:一、 成本效益.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有