使用 C 或 C++ 的微控制器
Microcontrollers using C or C++
可能的重复项:
有什么理由使用 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通常更容易,而微控制器的尺寸适合简单的任务。
- 对于四轴飞行器,PID中I控制器的理想值应该是多少
- 如何集成 HID USB 控制器?
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 更高效地在微控制器上对C++进行基准测试
- 如何修复 Arduino LED 串控制器的代码?
- 如何在 Windows 中通过 SSL 端口枚举域控制器
- 如何使用 c++ 在命令行中创建一个简单的字符控制器?
- 为什么玩家控制器"own"偏航俯仰和滚动,但角色"owns"它的位置?
- 在虚幻引擎中使用运动控制器组件,C++而不是蓝图
- 哗啦��错误:无法识别任何一组可以驱动指定关节的控制器
- 微控制器的首次 gcc 链接器脚本编译但不运行
- 对控制器类的 WorkerScript 访问
- SDL 2 无法打开控制器,但已识别操纵杆
- 将信号从工作线程类连接到控制器类 - QThreads
- 在OMNet上实现SDN控制器
- SDL2_pollevent() 控制器 dpad 连续保持?
- C++微控制器全局类/辛格尔顿?
- 工作器/控制器多线程和接口类
- 我在微控制器STM32F373发现中点亮LED的问题
- 实现 =, - =, *=, /=运算符(复杂号码控制器计算器)