我在STM32F103C8T6中使用了C ++ Eclipse,其字符串类型来自std。我得到错误:“区域rom溢出5980bytes”。
#include "stm32f1xx.h"
#include <string>
std::string a;
int main(void)
{
for(;;);
}
有没有办法在这个微控制器上修复它?
答案 0 :(得分:1)
STM32F103C 8 T6仅有64 KB的闪存。你的程序不合适。
查看linker output,了解您需要多少钱。如果可能,您可以获得 B 版本 您还可以查看是否可以启用removal of unused objects。由于可能存在您甚至不需要的字符串库的功能。
*我猜测你正在使用GNU-ARM。
答案 1 :(得分:1)
我认为这个问题已经在这里得到了回答,但我想在更高层次的观点中提出几个问题,这可能会帮助其他人走上同样的道路。
您当然可以将C ++用于微控制器项目,但是您希望避免使用大多数C ++范例。 希望成为&#34; C +&#34 ;;比面向对象编程(OOP)更接近C。 特别是避免大多数实例化的东西,比如一般的C ++对象。并避免代码内存占用模板等范例。
你可以设置一个malloc(),所以有一个C ++ new / delete但是大多数时候你都想构建你的代码,所以旁边没有动态分配。 不仅因为这些会增加更多的代码空间,而且您最终只会使用更多有限的20kb RAM。只是要进行动态分配,你必须有一些最小的链表或类似的来维护RAM等的块。
实际上,您可能只想使用C ++的部分说服功能,例如放宽可变范围限制等。
您可能只想使用ST网站和/或其他地方可以获得的最小C库。
对于廉价的低成本微控制器项目,其中一项技术是缩小。当然,这取决于您项目的范围。对于具有许多功能的复杂功能,您可能很难在64kb闪存ROM空间中安装所有功能。
其他一些选择是获得一个蜂窝式微控制器和/或添加一个I2C EEPROM以获得更多的代码空间(您可能必须登录和退出RAM才能运行代码)。
作为一种策略,您可能只是想利用堆栈(本地静态大小的字符数组)来使用和操作动态字符串并使用好的旧C库类型,如strcpy(),sprintf()等。