使用 C 或 C++ 的微控制器

Microcontrollers using C or C++

本文关键字:控制器 C++ 使用      更新时间:2023-10-16

可能的重复项:
有什么理由使用 C 而不是 C++ 进行嵌入式开发吗?

我对此感到非常好奇:为什么当我们处理微控制器时,他们更喜欢C而不是C++?根据我的研究,C和汇编语言是这些设备的常用编程语言。我只知道C++和汇编语言。所以在这种情况下,我应该开始学习C还是坚持使用汇编语言,如果是这样,我应该使用什么编译器,因为我只知道Turbo汇编器。

谢谢和更多的力量! :)

一些C++功能(如异常和虚函数(可能会增加程序的开销,这在资源高度受限的环境中是不可取的。这减少了此类平台上对C++编译器的需求。实现C++编译器也比实现 C 编译器困难得多。这种困难加上缺乏需求使得许多微控制器只有C编译器可供它们使用。

我会为您的微控制器编程学习 C。学习C++后学习C并不难,并且比汇编更容易编码。

这只是

历史的偶然和实践(像我这样的老卢德分子(ucontrollers"更喜欢"ASM和C。如果你的编译器可以将C++编译成ucontroller代码,那么我不知道为什么你不应该使用C++。

对我来说,使用 ASM 和 C 要容易得多,也更自然,但你可以使用任何你喜欢的,只要你的编译器(和链接器,如果你使用它(可以做正确的事情;并且你的 ucontroller 有足够的内存来容纳(也许更大(编译的C++代码。

正如其他海报所解释的那样,这只是资源的可用性。 当你编译了几个虚拟方法表和几十个对象指针时,所有的 RAM 都从一个简单的 uC 消失了!

也就是说,我更喜欢C++今天的32位控制器,具有8K以上的RAM,大量的闪存,复杂的嵌入式外围设备和多任务库。 经过几十年的 OO 之后,使用普通 C 对于任何非平凡的事情来说都是噩梦。

我目前使用恩智浦ARM芯片和Rowley Crossworks(IDE,使用gcc(。 我只将 C 用于 lib 接口,将汇编程序用于某些驱动程序,其余的都是C++。

C 是更底层的,完全按照你说的做。它更适合微控制器等低资源环境。

C++具有一些需要额外资源的功能(例如 OOP、异常等(。

此外,微控制器不具有与计算机CPU相同的功能。例如,它可能不支持动态库加载,即使对于静态库,您的大小也会受到限制,因为您的芯片没有很多内存。

通常,微控制器会公开特殊的输入/输出库,并且 stdlib 并不总是可用。

您需要的是专门用于微控制器的交叉编译器。然后你可以用C和ASM编写程序。

如果芯片支持它,你可以重新编译 stdlib 以使用标准的 C 功能,然后你最终可以(如果芯片有足够的资源,再次(构建一个C++交叉编译器,然后是 STL。然后,您将能够在芯片上构建C++程序,但该程序的重量将远远超过原始C程序。

微控制器是内存和带宽受限的处理单元。C 编程语言生成的紧凑代码在大小和速度方面接近汇编语言。C++通常会在内存和速度方面产生开销。另一个问题是动态内存分配。将面向对象设计与C++一起使用通常意味着动态创建和销毁对象。使用微控制器的嵌入式应用通常静态分配所有必需的内存,并且在应用的生命周期内不会释放。

话虽如此,如果你使用的是32位微控制器,并且你的应用程序足够复杂,以至于它可以处理大量的数据流量,或者通过触摸屏/LCD等具有重要的用户界面,那么C++(有时甚至是C#(是首选语言。

您选择的编译器将取决于微控制器,请查看微控制器供应商网站以获取要使用的相应开发工具套件。

汇编语言仅用于最低层,如果它不能用 C 完成。维护和移植汇编语言代码比较困难,因此最好尽量减少其在应用程序中的使用。

微控制器是小型设备,与计算机相比功能不强大。他们的资源有限。首先,堆栈的大小非常有限,因此不会建议具有许多嵌套函数调用(在某些设备上,堆栈限制为几个字节(。其次,通常不可能动态分配内存(alloc,free...(,并且大多数程序数据必须是全局静态变量或存储在堆栈中,因此诸如std::vector之类的有用类将不可用。

即使C++编译器可以用于微控制器,也不会很有用,因为这些设备的低功能会禁止简单使用这种强大的语言。对于简单的任务,使用C通常更容易,而微控制器的尺寸适合简单的任务。