是否有可能使用 C++ 对 PIC 进行编码?是否有任何硬件限制阻止我们使用 C++?当我们使用 C++ 而不是 C 时,生成的 .hex 文件的大小和程序的运行时间增加了多少?是否可以将 C++ 用于当前的 PIC?是否有任何未来计划或正在进行的发展?
将来是否有可能用 C++ 为 PIC 微控制器编写代码?
是否有可能使用 C++ 对 PIC 进行编码?
是的,现在可以了。对于 dsPIC,有IAR Systems C++ 编译器(虽然它很旧且不受支持)。
另一种选择是使用 C++ 到 C 转换器。使用预构建步骤,将 C++ 转换为 C,然后将(看起来难看的)C 提供给您的普通 C 编译器。看看LLVM或Comeau 的 C++ 编译器,它们都可以做到这一点。Comeau 的售价仅为 50 美元,但要让整个工具链和库正常工作可能需要付出一些努力。
是否有任何硬件限制阻止我们使用 C++?
简短的回答,不,没有硬件限制。长答案,C++ 当然鼓励使用堆和/或堆栈,RAM 有限的小型 MCU 将难以应对。
为什么他们在堆/堆栈中挣扎?有两个原因:A)许多 MCU 的 RAM 有限,肯定不足以容纳堆,也几乎不足以容纳堆栈。B) 许多 MCU 不能很好地处理指针,因此在堆栈上使用变量确实会降低性能。
当人们询问在 MCU 上使用 C++ 时,我发现将 C++ 与 C 进行比较是有建设性的。关于在 MCU 上使用 C 的问题曾经(并且仍然)被问到完全相同的问题。人们过去常常对这个想法犹豫不决。一种高级语言,在 256 字节 RAM MCU 上??不可能的。但现在我们都知道这是可能的。我已经为 PIC12 编写了 C。没问题。这是可能的,因为 A) 软件开发人员知道他们必须小心一点:不要使用 malloc() 等。 B) 编译器是专门为 MCU 编写的。编译器也会特别注意内存分配,它不会尝试创建堆,也可能不会创建堆栈。一些 C 编译器根本不允许您编写绝对需要堆栈的可重入(递归)代码。
知道可以为 MCU 编写 C,同样的答案也适用于在 MCU 上编写 C++ 的问题。只要编译器了解目标设备的限制,用户也了解语言,就没有问题。在 C++ 中,您只需为使用的内容付费。完全有可能编写 C++(包含对象和所有内容)来产生与使用 C 时完全相同的 asm 输出。
现在,PIC32s 肯定可以应付 C++。它们具有高达 64kB 的 RAM,并且基于 MIPS 内核,这是一个适当成长的 32 位处理器。它可以处理指针和堆栈以及PC。确实,有基于 MIPS 的 PC(或者至少曾经有)。
可悲的是,围绕 C++ 存在很多误解。即使是非常有经验的编码人员似乎也不知道该语言是如何工作的。请参阅我关于为什么 C++ 适用于嵌入式 CPU的回答。
当我们使用 C++ 而不是 C 时,生成的 .hex 文件的大小和程序的运行时间增加了多少?
正如我所说,可能没有区别。Bjarne Stroustrup 对一堆 C/C++ 编译器进行了比较,以比较一些操作的时间和空间性能。结果差异很大。在某些情况下,C++ 出来的速度越来越慢,有些情况下速度越来越慢,或者速度越来越大,甚至越来越小!因此,您的问题的答案是它在很大程度上取决于编译器,但总的来说,它根本不需要任何区别。有关更多详细信息,请参阅C++ 性能技术报告
是否有任何未来计划或正在进行的发展?
我不知道。我知道 Microchip C32 编译器是开源的,你可以下载源代码。我也知道与我一起工作的人实际上在网上找到了一些说明,并设法让编译器编译 C++ 代码。但在他能够为我建立一个合适的工具链之前,他就离开了公司。
更新
Microchip 现在为其 PIC32 系列嵌入式 MCU 提供了C++ 编译器。
当我们使用 C++ 而不是 C 时,生成的 .hex 文件的大小和程序的运行时间增加了多少?
看你用什么功能。如果您使用核心的面向对象功能(类 + 方法),可能效果很小(损坏的变量/函数名称更长,因此符号表可能会有所增加)。使用好的编译器,模板也不应该增加太多。
如果你全力以赴并引入标准模板库之类的东西,并使用动态内存分配和异常,那么你很可能会遇到代码膨胀。
已经有 pic 的 c++ 编译器,例如http://www.sourceboost.com/Products/BoostCpp/Overview.html
我没有使用过它,除了它存在之外,我对它一无所知......
在某种程度上概括您的问题,有一些为嵌入式市场构建的 ARM 处理器,其中包含一个 MMU(内存管理单元)。内存大小和分配使 java 和 c++ 之类的语言成为嵌入式选择不佳。随着嵌入式处理器的速度越来越快、功能越来越强大,以及内存变得越来越密集、越来越便宜,嵌入式工程师可以选择的语言发生了巨大的变化。带有 MMU 和 64G 闪存卡的 32 位 600MHz ARM 处理器是 c++ 应用程序的理想选择。它是否符合经典嵌入式处理器的定义是另一个问题。