【问题标题】:STM32F103C8T6 using C++ string stdSTM32F103C8T6 使用 C++ 字符串标准
【发布时间】:2017-08-23 18:39:55
【问题描述】:

我在我的 STM32F103C8T6 中使用 C++ Eclipse,字符串类型来自 std。我收到如下错误:“区域 rom 溢出 5980 字节”。

#include "stm32f1xx.h"
#include <string>


std::string a;

int main(void)
{


    for(;;);
}

有什么办法可以在这个微控制器上修复它?

【问题讨论】:

  • 问题显然是你的 MC 的 ROM 太小了,无法与 libstd-c++ 链接的程序。
  • 我很惊讶,因为 arduino 在 c++ 上几乎是完整的,但不适用于更大的微控制器..
  • 我并没有真正对此进行调查,但 arduino 不是带有专门的 C++ 库吗?
  • 你有多少闪存?
  • 好的,我没有严格使用这个库。你知道用琴弦舒适轻松地工作的任何方法吗?我依赖使用 string.lenght() 等字符串... STM32F103C8T6 有 64kb 闪存。

标签: c++ string std stm32


【解决方案1】:

STM32F103C8T6 只有 64 KB 的闪存。您的程序不适合。

看看linker output,看看你需要多少。如果可能,您可以获得 B 版本。
您还可以查看是否可以启用removal of unused objects。因为可能有你甚至不需要的字符串库的函数。

*我猜测你使用的是 GNU-ARM。

【讨论】:

    【解决方案2】:

    我认为这个问题已经在这里得到了大部分的回答,但我想从更高层次的角度说几句话,这可能会帮助其他一些人走上同样的道路。

    您当然可以将 C++ 用于微控制器项目,但您需要避免使用大多数 C++ 范例。 想成为“C+”;比面向对象编程 (OOP) 方面更接近 C。 特别要避免大多数实例化的东西,比如一般的 C++ 对象。并避免模板等占用代码内存的范例。

    你可以设置一个 malloc(),所以有一个 C++ 的 new/delete,但大多数时候你会想要构建你的代码,所以几乎没有动态分配。 不仅因为这些增加了更多的代码空间,而且您最终只会使用更多有限的 20kb RAM。只是为了进行动态分配,您必须有一些最小的链表或类似的东西来维护 RAM 块等。

    确实,您可能只想使用 C++ 的部分令人信服的特性,例如放松变量范围限制等。

    您可能只想使用可以在 ST 网站和/或其他地方获得的最小 C 库。

    对于廉价的低成本微控制器项目,其艺术之一就是缩小。当然取决于你项目的范围。对于具有许多功能的复杂事物,您可能很难将所有内容都安装在 64kb 闪存 ROM 空间中。

    其他一些选择是获得更强大的微控制器和/或添加 I2C EEPROM 以获得更多代码空间(您可能必须在 RAM 中分页进出以供运行代码使用)。

    作为一种策略,您可能只想利用堆栈(本地静态大小的字符数组)来使用和操作动态字符串,并使用良好的旧 C 库类型,如 strcpy()、sprintf() 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-25
      • 2012-01-26
      相关资源
      最近更新 更多