8051微控制器的C++编程?

9
请问是否有可能用C++程序烧录8051微控制器?我在网上搜索了很多但似乎没有确定的答案。Keil使用C语言,但我需要编写的程序需要大量字符串操作,而C语言对于字符串的操作不够友好,而我习惯使用的是C#。目前,我正在尝试用C语言编写代码,但变得非常混乱,如果可以改用C++编写将会非常方便。
我需要一个能够创建Hex输出文件的C++编译器,然后将其烧录到微控制器上。您听说过我可以使用的工具吗?
此外,C语言使用一个头文件reg51.h,可以让您引用端口,但我试图找出这个头文件是否也适用于C++,但没有找到任何相关信息。
补充说明:我使用的微控制器是Atmel AT89C51,具有4K字节的可重编程闪存和128 x 8位内部RAM。这实际上是为大学项目中的机器人而设计的,并且编码实际上并不需要面向对象编程。它只包含许多以2D字符串数组格式呈现的查找表。我之所以考虑使用C++,仅因为对于字符串操作的处理变得非常混乱(由于我的C语言知识不足)。

4
我不知道是否有一个原生的方法,但你可以使用LLVM C++到C的翻译器。 - Zifre
你有多少内存(ROM和RAM)? - lothar
3
算了吧!你可能需要用到你的每一个 128 字节的 RAM 和 4096 字节的 Flash。强烈建议使用汇编语言... - Turbo J
11个回答

10

我认为这是否真的是一个好主意值得质疑。我理解在一般情况下希望使用C++而不是C背后的推理,但是在使用8位哈佛架构微控制器的情况下,我会建议不要这样做。

需要注意以下几点:

  • 源级别的调试支持将非常差或是不可能的。
  • OOP在8位机器上的运行时开销较高。我强烈建议在使用工具之前进行严肃的基准测试。
  • 嵌入式系统中内存不便宜,您无疑会遇到某些地址空间限制。

此外,如果您确实要处理一些严格的字符串操作,我建议使用C标准库而不是字符串对象库,因为您可以更好地控制原地替换,因此字符串拷贝在代码中更加明显。

请发布一些关于您计划使用的微控制器(数据内存,程序内存)以及是否有必须满足的性能要求,这样我们可以更加具体地提供帮助。


3
“源代码级别的调试支持将会是较差甚至不可能的。” 我认为这与调试 C 代码没有太大区别。如果目标设备有 JTAG 接口并且调试器支持该接口,那么调试应该相对容易。 - lothar
据我所知,所有的8051 C++工具都会转换成C语言,并使用流行的平台,如Keil工具或IAR系统。然后这些工具会执行IDE调试支持。当然,我可能完全错了 :-) - mikelong
6
请记住,C++可以在编译时进行计算和代码生成,因此原则上它可以生成比任何 C 编译器更好的代码。我正在为一种8位架构(抱歉,不能透露更多细节)开发 LLVM 移植版,而 C++ 前端生成了美丽的数字代码,这是用纯 C 不可能生成的!我已经基本上使用一个混合版本的 Eigen 3 生成了针对带有硬件乘法器的8位架构的定点数值代码。顺便说一句,这些代码与手写汇编相当。 - Kuba hasn't forgotten Monica
有趣。当你的工作解密/商业化后,回来告诉我细节。听起来很有趣! - mikelong

4

IAR Systems拥有一款8051编译器,可本地编译C++(无需将其翻译为C),并且源代码级别的调试也不应该是问题。


这是IAR的C/C++ 8051编译器链接:http://iar.com/website1/1.0.1.0/244/1/ - Nate
谢谢,帖子已更新。我只是懒得找链接。 - JesperE

2

有一款来自ceibo的商业编译器。

然而,如果你能否使用c++(特别是STL字符串)取决于你将拥有多少资源(包括ROM和RAM)。

有一个8051网站,其中包括论坛、教程和下载,你可以在这里获得更多关于8051编程的资源。


1

您可能需要考虑提供有关您打算在微控制器上运行的程序类型的其他详细信息:

您在帖子中提到了C++和C#,这两种语言都不太适合在微控制器上进行大量字符串处理,更不用说您可能考虑大量使用STL,这会进一步增加可执行文件的大小?

那么,您的主要限制是什么(RAM、CPU、ROM等)?

如果您真的认为需要以面向对象的方式进行此字符串处理,您可能需要考虑在控制器上运行轻量级嵌入式脚本解释器,以便您可以使用脚本语言提供字符串处理例程,而解释器本身将被编译为ANSI C HEX文件(例如luanasal似乎都是合适的候选)。

但是,请注意,像lua这样的脚本语言通常会占用约100kb+的空间,Nasal则更加轻巧,如果禁用某些扩展,可能会编译为50-70 kb。

此外,还有其他的脚本解释器可用于嵌入式平台。

对于像这样的处理器来说,运行脚本引擎将会是极度浪费。最好编写一些高效的字符串例程用C或C++实现。 - Steve Melnikoff
实际上,关键在于他需要完成什么任务。还有许多其他嵌入式目标,例如路由器,它们提供的功率也不比8051更强,但仍然使用脚本引擎,即为了提供灵活和可用于浏览器的用户界面。 - none
@none - 顺便说一下,我是女性! :-) - CodeConfused
我见过的大多数8051控制器都有约4kb的内存。 - rlbond

1

IAR 看起来提供了 适用于 8051 的 C/C++ 编译器,但完全透明化,我只使用过 Keil 的 C 编译器进行 8051 开发。

至于您的头文件问题:头文件通常由 IDE 供应商或硬件制造商分发,并经常提供符号表示您的寄存器映射。将基于 C 的头文件合并到 C++ 项目中可能需要进行适当调整。-- 如果您即将切换 IDE / 编译器,则通常可以预期对源代码进行一些调整以适应新编译器。(即:从 C++ 代码库访问 C 代码通常会导致我停止一天时间进行正确处理。)


0

0

市面上有多款商业编译器可供选择。其中业界排名第一的是Keil Software


1
我之前也用过Keil。在我看来,他们的IDE是8051 C开发的最佳选择。但是,我浏览网站后得出结论,他们似乎没有为8051提供C++编译器。我有什么遗漏吗? - Nate
3
我刚和他们的开发人员交谈过,你说得对。它确实只是C语言。因此,我的回答并没有真正满足原帖作者的要求。 - NotMe

0

你可以尝试将C++代码转换为C代码,然后使用现有的C编译器进行编译。

你应该能够创建一个Makefile,调用C++编译器,然后在之后运行C编译器。

这不是最优雅的解决方案,但在像8051这样的小型设备上使用C++确实相当罕见。

免责声明:我实际上没有尝试过这个方法,祝你好运!如果是我,我会坚持使用C并编写一些强大的字符串处理函数。


0

其他人已经提到了8051的C++编译器。我猜你使用这些编译器的主要问题可能是成本。许多公司会让你免费编写汇编语言,但会收取C或C++编译器的费用。我们可能需要花费几百美元。

我的主要问题是你的代码中出现了什么“混乱”?你试图在C++中使用哪些功能,在C中变得混乱?C++中的一些功能在如此简单的嵌入式环境中无法很好地转换(流、构造函数、析构函数等)。C可以使用结构体执行许多面向对象类型的功能。其他功能应该被避免(任何涉及动态内存管理的内容)。

在潜在地花费大量金钱并获得庞大、缓慢和难以控制的代码之前,我建议你努力让它在C中运行。


我开始认为你是正确的,Stephen. :( 现在没有什么容易获得的东西。 - CodeConfused

0

听起来你想要一个C++编译器,以便你可以使用std::stringstd::string需要堆内存。只有128x8位的内部RAM,你将没有可用的堆内存,特别是对于std::string对象。请考虑一下,如果你从串口读取一个80个字符的字符串,那么它会消耗超过60%的可用RAM。你也会使用外部RAM吗?有多少?

你的固件真的需要在运行时处理字符串吗?例如,它是否通过串口或其他接口作为字符串发送/接收命令?如果是这样,你应该尽可能地将字符串处理与其余代码隔离,并在其他地方使用标记(枚举类型或#defined整数常量)。如果不是,你将会遇到更少的麻烦,通过使用标记而不是字符串将你的逻辑适配到处理器的受限内存中。

此外,如果你确实需要进行字符串解析,你可能最好编写一个状态机,逐个字符处理,这样你就不必处理完整的字符串。再次强调,128字节对于字符串处理来说并不是很大的空间。


3
需要澄清一点,正如您所知,std::string只是基于basic_string的typedef,使用char和分配器。除了那个大块的分配器之外,可以实现自定义的分配器,而不使用堆内存。 - Johann Gerell
1
@Johann Gerell:我怀疑编写一个自定义的STL分配器来管理存储在ROM中的字符串会比重写C中的字符串处理要困难得多(即使可能)。请记住,OP的目标系统只有128字节的RAM和4KB的闪存。这意味着查找表必须存储在闪存中。 - bk1e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接