【问题标题】:MSP430 Ram OverflowMSP430 内存溢出
【发布时间】:2015-07-23 19:35:44
【问题描述】:

MSP430G2553 只有 512 字节的 RAM 和 16KB 的 FLASH 存储器。在这个微控制器上,所有静态/全局变量都分配在 .bss 部分下的 RAM 中。所有局部变量都分配在 .stack 部分下的 RAM 中。所有动态分配的内存变量 (malloc) 都在 RAM 中的 .sysmem 部分下分配。

我需要此 MSP430 来跟踪通过 wifi 连接的设备。我有一个这样的结构:

struct dev
{
    char type[20];
    char ipAddress[13];
    char name[20];
    char status[1];
};

该结构为每个设备占用 54 字节的内存。我计划有 20 多个设备连接到这个 MSP430,并且需要有 20 个这样的结构。 20 x 54 字节 = 1080 字节。这对于 512 字节的 ram 来说显然太大了。

由于我有 16KB 的内存要使用,有什么方法可以将这些结构写入 FLASH 中?我对FLASH的理解是只读的变量。这些结构显然会被分配,所以它是读写的,我不确定是否可能。

当所有需要读写操作的变量都存储在 RAM 中时,我不太明白为什么 TI 会制造具有 16 KB FLASH 和只有 512 字节 RAM 的设备。好像很浪费空间。

我尝试在链接器文件中将这些部分 .bss/.stack/.sysmem 更改为 FLASH 并且 MSP430 不会像这样运行。我还尝试更改 RAM 和链接器文件的大小,并更改内存位置,再增加 512 个字节,但它也不会像这样运行。

我这里有什么选择吗?

【问题讨论】:

  • 对所有内容进行编码,您不必将所有内容都保存为字符串,除了名称。
  • 为什么需要20个字节来定义类型? char类型可以引用256种不同的类型,具体可以在ROM(或FLASH代码)中详述,但应将该字段放在status字段旁边,或者将struct打包。无论如何char status[1] 有什么意义?
  • @Olaf 是同一个人使用char status[1];
  • @WeatherVane:很公平:-}。 PC 程序员变得赤裸裸。
  • ...或者在指定芯片之前没有弄清楚他的系统要求的人。

标签: c flash memory struct msp430


【解决方案1】:

是的,您可以将数据写入闪存。当您想要更改数据时,会出现唯一的问题。您只能擦除大小为 512 字节的扇区。因此,您可以从闪存中取出两个闪存扇区,并在每个扇区中存储 10 个设备的数据。 闪存可以像 RAM 一样读取,因此您不需要某种交换代码,只需使用指针寻址每个设备条目。 最后一个问题是闪存有擦除周期的限制,这里大约是 10000 个周期。因此,您可能还需要编写代码来随着时间的推移将数据分发到不同的扇区,具体取决于预期更改的数量和所需的服务持久性。

【讨论】:

  • 当你说扇区是 512 字节时,你指的是这个特定的微控制器还是 所有 微控制器?
  • @FiddlingBits:对于给定的 MCU,它 512 字节,但 FUG 将其称为“段”。并非所有 Flash 设备(无论是 MCU 还是离散设备)都是如此。
【解决方案2】:

您可以在闪存/程序存储器中存储一个常量数据。如果您知道某些变量/数组在初始化后实际上并没有改变,您可以在代码中将它们声明为static const,编译器会将它们放在.text 部分中,该部分通常会进入闪存。如果您有不适合内存的动态数据......好吧。你被搞砸了,除非你能想到优化(比如在不同的时间为不同的东西重用相同的空间......)。当然,如果您的部件具有对 FLASH 写入的编程访问权限,则可以使用 FLASH 实现某种“交换”功能。但真的没那么简单。

为此:

我不太明白为什么 TI 会制造 16 KB 的设备 闪存和只有 512 字节的 RAM,当所有变量需要 读写操作存储在 RAM 中。好像很浪费 空间。

你得到你所支付的。每个微型都有特定的应用范围。如果这个特定的微不适合您的应用程序,可能不在那个范围内。

【讨论】:

  • 是的.. 有了这个要求和勇气,我会停在“你被搞砸了”:(
  • @MartinJames:没有问题,只有挑战。有时我们会觉得比平时更有挑战。
  • @Olaf 但有时你会输掉挑战 :)
  • @EugeneSh.:不,只是耐心。 :-)
  • @Olaf 在那种情况下,我很高兴你不是外科医生。
【解决方案3】:

您可以在此结构中释放大量额外空间。

键入type 字段可能不需要是字符数组。您可以将一组符号常量用于所有可能的类型。

IP 地址也不需要存储为字符串。假设 IPv4,您只需要四个字节。

status 不需要是大小为 1 的数组。一个简单的 char 就足够了。

所以现在你有这样的东西:

struct dev
{
    uint32_t ipAddress;   // 4 bytes
    char name[20];        // 20 bytes
    char type;            // 1 byte
    char status;          // 1 byte
};                        // 2 bytes padding, total = 28 bytes

将其中的 20 个放入 512 字节的内存中仍然不够,但你拥有的更好。

【讨论】:

  • 美国的 PIv4 地址已经用完。对于物联网,我强烈建议实际使用 IPv6。 (而char [1] 只需要char。这看起来像是用于灵活数组成员的 C99 之前的版本)。注意:MSP430 是 16 位架构。所以填充到偶数地址,而不是 32 位边界。
  • 你还需要一个堆栈。
【解决方案4】:

老实说,您最好的选择可能是切换到功能更强大的芯片组。 MSP430 G-line 真正适用于极低功耗和低性能应用,以太网既不是这些应用(当然也不是同时多个 TCP/IP 连接!)。

至于为什么他们要制造具有巨大闪存空间和微型 SRAM 的芯片,嗯,闪存既便宜又紧凑,而 SRAM 在裸片上的空间昂贵,因此 TI 不得不做出妥协以提供该 MCU不到 1 美元。正如其他一些答案所暗示的那样,您可以使用大量闪存来编写更多代码,这些代码可以对 SRAM 中的数据进行编码/压缩/解码/解压缩。

另一种选择是使用“Wolverine”系列 MSP430 芯片之一。它们使用统一的 FRAM bank,而不是单独的 Flash 和 SRAM bank。

【讨论】:

  • 嗯,“巨大”相对于 RAM; 32 的差异系数。
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多