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