9

有人可以告诉我是否可以用 C++ 程序烧录 8051 微控制器?我试过在网上搜索它,但似乎无法确定它是否可能。Keil 使用 C,但我需要编写的程序是字符串密集型的,与我习惯使用的 C# 相比,C 对字符串非常不友好。目前,我正在尝试用 C 编写代码,但它变得非常混乱,所以如果我可以用 C++ 编写它,我会非常放心。

我需要一个 C++ 编译器来创建一个十六进制输出文件,然后可以将其刻录到微控制器上。有人听说过我可以使用的东西吗?而且,C 使用了一个头文件,可以让你引用端口,但是当我试图找出这个头文件是否也在 C++ 中使用时,我找不到任何关于它的信息。

另外:我使用的微控制器是带有 4K 字节可重编程闪存和 128 x 8 位内部 RAM 的 Atmel AT89C51。这实际上是针对大学项目的机器人,编码实际上不需要 OOP。它只是有很多二维字符串数组格式的查找表。我想考虑 C++ 的唯一原因是因为操作字符串似乎变得非常混乱(由于我缺乏 C 专业知识)。

有人知道头文件吗?C 使用 #include reg51.h 但我试图找出这是否适用于 C++ 并且找不到任何内容。

4

11 回答 11

10

我首先会质疑这是否真的是一个好主意。我理解在一般情况下希望在 C 上使用 c++ 的原因,但对于 8 位哈佛架构微控制器,我会警告不要这样做。

要记住的事情包括:

  • 源代码级调试支持介于差和不可能之间。
  • OOP 在 8 位机器上的运行时开销。我强烈建议在使用工具之前进行一些认真的基准测试。
  • 内存在嵌入式系统中并不便宜,毫无疑问你会有一些地址空间限制。

此外,如果您真的要进行一些严肃的字符串处理,我建议您使用 C 标准库而不是字符串对象库,因为您可以更好地控制就地替换,因此字符串副本在代码中变得非常明显。

请发布一些关于您计划使用的微控制器(数据存储器、程序存储器)以及是否必须满足任何性能要求的信息,以便我们提供更具体的帮助。

于 2009-05-22T19:49:52.153 回答
4

IAR Systems 有一个8051 编译器,可以本机编译 C++(不翻译为 C),源代码级调试也不应该成为问题。

于 2009-05-22T21:13:05.340 回答
2

ceibo有一个商业编译器。

但是,您是否可以使用 c++(尤其是 STL 字符串)取决于您将拥有多少资源(ROM 和 RAM)。

有一个8051 站点,其中包含论坛、教程和下载,您可以在其中获得更多关于 8051 编程的资源。

于 2009-05-22T19:47:53.373 回答
1

IAR似乎为 8051 提供了 C/C++ 编译器,为 8051提供了 C/C++ 编译器。——但完全公开,我只使用 Keil 的 C 编译器进行 8051 开发。

至于您的头文件问题:头文件通常由 IDE 供应商或硬件制造商分发,并且通常提供您的寄存器映射的符号表示。将基于 C 的头文件合并到 C++ 项目中可能需要适量的按摩。-- 如果您要切换 IDE/编译器,您通常可以期望对源代码进行一些按摩以适应新的编译器。(阅读:从 C++ 代码库访问 C 代码通常会让我停下一天的时间来做正确的事情。)

于 2009-05-23T15:53:55.590 回答
1

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

您在帖子中提到了 C++ 和 C#,这两者肯定都不适合在微控制器上进行繁重的字符串处理,更不用说您可能正在考虑大量使用 STL,这会进一步增加可执行?

那么你的主要限制到底是什么(RAM、CPU、ROM 等)?

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

但是,考虑到诸如 lua 之类的脚本语言通常会在空间上施加大约 100kb+ 的开销,Nasal 更轻量级,如果禁用某些扩展,可能会编译到 50-70kb。

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

于 2009-05-22T20:21:50.717 回答
0

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

您应该能够创建一个调用 C++ 编译器的 Makefile,然后再运行 C 编译器。

这不是最优雅的解决方案,但在 8051 等小型设备上使用 C++ 确实很不寻常。

免责声明:我还没有真正尝试过这么幸运!如果是我,我会坚持使用 C 并编写一些健壮的字符串处理函数。

于 2009-05-22T21:46:19.733 回答
0

是的,您可以使用 C++ 程序烧录 8051 微控制器的内存,还有一些免费的编译器可用于创建 Hex 文件,然后将文件发送到微控制器。您可以在包含教程、编译器、模拟器等的综合文章中找到有关微控制器编程过程的任何信息

于 2013-04-24T08:01:39.993 回答
0

有几种商业编译器可用。行业排名第一的是Keil Software

于 2009-05-22T21:11:02.880 回答
0

其他人提到 8051 有 C++ 编译器。我猜你的主要问题是成本。许多公司会让你免费编写程序集,但对 C 或 C++ 编译器收费。我们可能在这里谈论几百美元。

我的主要问题是什么在你的代码中变得“混乱”?您试图在 C++ 中使用哪些在 C 中变得混乱的功能?C++ 中的一些特性不能很好地转化为这样一个最小的嵌入式环境(流、构造函数、析构函数等)。C 可以使用结构来执行许多面向对象的类型函数。应该避免其他功能(任何具有动态内存管理的功能)。

我会努力让它在 C 中工作,然后再花很多钱并获得庞大、缓慢和笨拙的代码。

于 2009-05-23T15:18:20.257 回答
0

听起来您想要一个 C++ 编译器,以便您可以使用std::string. std::string需要一个堆。你不会有一个只有 128x8 位内部 RAM 的可用堆,尤其是对于std::string对象来说,考虑一下,如果你从一个串行端口读取一个 80 个字符的字符串,这会消耗超过 60% 的可用 RAM。你也打算使用外部RAM吗?多少钱?

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

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

于 2009-05-25T18:32:34.020 回答
0

为什么不使用 C 字符串库?像bstrlib或类似的?C++ 并不是您对这个微控制器所需要的。

于 2009-05-25T18:41:58.167 回答