MSP430 内存溢出
MSP430 Ram Overflow
MSP430G2553 只有 512 字节的 RAM 但有 16KB 的闪存。在这个微控制器上,所有 static/global 变量都分配在 .bss 部分下的 RAM 中。所有局部变量都分配在 .stack 部分下的 RAM 中。所有动态分配的内存变量 (malloc) 都在 .sysmem 部分下的 RAM 中分配。
我需要这个 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的理解是只读的变量。这些结构显然会被分配,因此它是可读写的,我不确定是否可能。
我不是很明白为什么TI会做一个有16KB FLASH和只有512Bytes RAM的设备,而所有需要读写操作的变量都存储在RAM中。好像是浪费space。
我试图在链接器文件中将这些部分 .bss/.stack/.sysmem 更改为 FLASH,但 MSP430 不会像这样 运行。我还尝试更改 RAM 和链接器文件的大小,并更改内存位置,再添加 512 字节,但它也不会像这样 运行。
这里有什么选择吗?
您可以在flash/program内存中存储常数数据。如果您知道某些 variables/arrays 实际上一旦初始化就不会改变,您可以在代码中将它们声明为 static const
,编译器会将它们放在 .text
部分,这通常会闪存。如果您有不适合内存的动态数据.. 好吧。你被搞砸了,除非你能想到优化(比如在不同的时间为不同的东西重用相同的 space..)。当然,如果您的部件具有对 FLASH 写入的编程访问权限,则可以使用 FLASH 实现某种 "swapping" 功能。但是真的没那么简单
为此:
I don't quite understand why TI would make a device which has 16 KB
FLASH and only 512 Bytes of RAM, when all variables requiring
read-write operations are stored in RAM. Seems like it is a waste of
space.
物有所值。每个微控制器都有特定的应用范围。如果这个特定的微处理器不适合您的应用程序,它可能不在那个范围内。
是的,您可以将数据写入闪存。唯一的问题出现在您想要更改数据时。您只能擦除大小为 512 字节的扇区。因此,您可以从闪存中取出两个闪存扇区,并在每个扇区中存储 10 个设备的数据。
闪存可以像 RAM 一样读取,因此您不需要某种交换代码,您只需使用指针寻址每个设备条目即可。
最后一个问题是闪存有擦除次数的限制,这里大约是 10000 次。因此,您可能还必须编写代码以随着时间的推移将数据分发到不同的扇区,具体取决于预期的更改量和所需的服务持久性。
您可以在此结构中释放大量额外空间。
Type 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 字节的内存中仍然不够,但比你拥有的更好。
老实说,您最好的选择可能是切换到功能更强大的芯片组。 MSP430 G 系列真正适用于极低功耗和低性能应用,以太网不是这些(当然也不是同时有多个 TCP/IP 连接!)。
至于他们为什么要制造一个带有巨大闪存 space 和微型 SRAM 的芯片,好吧,闪存既便宜又紧凑,而 SRAM 在裸片上的成本 space,所以TI 不得不做出妥协,以低于 1 美元的价格提供该 MCU。正如其他一些答案所暗示的那样,您可以使用那么多的闪存来编写更多代码,可以 encode/compress/decode/decompress 数据 to/from SRAM。
另一种选择是使用 "Wolverine" 系列的 MSP430 芯片之一。那些使用统一的 FRAM 库而不是单独的闪存和 SRAM 库。
MSP430G2553 只有 512 字节的 RAM 但有 16KB 的闪存。在这个微控制器上,所有 static/global 变量都分配在 .bss 部分下的 RAM 中。所有局部变量都分配在 .stack 部分下的 RAM 中。所有动态分配的内存变量 (malloc) 都在 .sysmem 部分下的 RAM 中分配。
我需要这个 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的理解是只读的变量。这些结构显然会被分配,因此它是可读写的,我不确定是否可能。
我不是很明白为什么TI会做一个有16KB FLASH和只有512Bytes RAM的设备,而所有需要读写操作的变量都存储在RAM中。好像是浪费space。
我试图在链接器文件中将这些部分 .bss/.stack/.sysmem 更改为 FLASH,但 MSP430 不会像这样 运行。我还尝试更改 RAM 和链接器文件的大小,并更改内存位置,再添加 512 字节,但它也不会像这样 运行。
这里有什么选择吗?
您可以在flash/program内存中存储常数数据。如果您知道某些 variables/arrays 实际上一旦初始化就不会改变,您可以在代码中将它们声明为 static const
,编译器会将它们放在 .text
部分,这通常会闪存。如果您有不适合内存的动态数据.. 好吧。你被搞砸了,除非你能想到优化(比如在不同的时间为不同的东西重用相同的 space..)。当然,如果您的部件具有对 FLASH 写入的编程访问权限,则可以使用 FLASH 实现某种 "swapping" 功能。但是真的没那么简单
为此:
I don't quite understand why TI would make a device which has 16 KB FLASH and only 512 Bytes of RAM, when all variables requiring read-write operations are stored in RAM. Seems like it is a waste of space.
物有所值。每个微控制器都有特定的应用范围。如果这个特定的微处理器不适合您的应用程序,它可能不在那个范围内。
是的,您可以将数据写入闪存。唯一的问题出现在您想要更改数据时。您只能擦除大小为 512 字节的扇区。因此,您可以从闪存中取出两个闪存扇区,并在每个扇区中存储 10 个设备的数据。 闪存可以像 RAM 一样读取,因此您不需要某种交换代码,您只需使用指针寻址每个设备条目即可。 最后一个问题是闪存有擦除次数的限制,这里大约是 10000 次。因此,您可能还必须编写代码以随着时间的推移将数据分发到不同的扇区,具体取决于预期的更改量和所需的服务持久性。
您可以在此结构中释放大量额外空间。
Type 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 字节的内存中仍然不够,但比你拥有的更好。
老实说,您最好的选择可能是切换到功能更强大的芯片组。 MSP430 G 系列真正适用于极低功耗和低性能应用,以太网不是这些(当然也不是同时有多个 TCP/IP 连接!)。
至于他们为什么要制造一个带有巨大闪存 space 和微型 SRAM 的芯片,好吧,闪存既便宜又紧凑,而 SRAM 在裸片上的成本 space,所以TI 不得不做出妥协,以低于 1 美元的价格提供该 MCU。正如其他一些答案所暗示的那样,您可以使用那么多的闪存来编写更多代码,可以 encode/compress/decode/decompress 数据 to/from SRAM。
另一种选择是使用 "Wolverine" 系列的 MSP430 芯片之一。那些使用统一的 FRAM 库而不是单独的闪存和 SRAM 库。