MSP430G2553只有512个字节的内存,但是有16 of的闪存。在此微控制器上,所有静态/全局变量都在.bss部分下分配到内存中。所有局部变量都在内存中分配到.stack部分下。所有动态分配的内存变量(malloc)都在.sysmem部分下的内存中分配。
我需要这个MSP430通过wifi来跟踪连接的设备。我有这样一个结构:
struct dev
{
char type[20];
char ipAddress[13];
char name[20];
char status[1];
};这个结构占用每个设备54个字节的内存。我计划让20+设备连接到这个MSP430上,并且需要有20个这样的结构。20x54个字节= 1080字节。对于512字节的ram来说,这显然太大了。
由于我有16 of的内存可使用,有没有办法将这些结构写入闪存?我对闪存的理解是只有只读的变量。这些结构显然会被分配,所以它是读-写的,我不确定它是否可能。
我不太明白为什么TI会制造一个拥有16 KB闪存和512字节RAM的设备,而所有需要读写操作的变量都存储在RAM中。好像是在浪费空间。
我尝试将这些部分更改为..bss/..stack/..sysmem,使其在链接器文件中闪现,MSP430不会像这样运行。我还试图改变RAM的大小和链接器文件中的内存位置,并添加另一个512字节,但它也不会像这样运行。
我在这里有什么选择吗?
发布于 2015-07-23 20:16:14
是的,你可以把数据写入闪存。当您想要更改数据时,唯一的问题就出现了。只能擦除大小为512字节的扇区。因此,您可以从闪存中提取两个闪存扇区,并为每个扇区中的10个设备存储数据。闪存可以像RAM一样读取,所以您不需要某种交换代码,只需用指针对每个设备条目进行寻址。最后一个问题是闪存有一个擦除周期的限制,这里大约有10000个周期。因此,随着时间的推移,您还可能需要编写代码来将数据分发到不同的扇区,这取决于预期更改的数量和所需的服务持久性。
发布于 2015-07-23 19:42:47
您可以将常量数据存储在闪存/程序内存中。如果您知道一些变量/数组在初始化后实际上不会改变,那么您可以在代码中将它们声明为static const,编译器会将它们放在.text部分中,这部分通常会用到闪存。如果您有不适合内存的动态数据..井。除非你能想到优化(比如在不同的时间为不同的事情重用相同的空间),否则你就完了。当然,如果您的部分对FLASH编写具有编程权限,则可以使用FLASH实现某种“交换”功能。但其实并没有那么简单。
为此:
我不太明白为什么TI会制造一个拥有16 KB闪存和512字节RAM的设备,而所有需要读写操作的变量都存储在RAM中。好像是在浪费空间。
你正在得到你所付的钱。每个微系统都有一个特定的应用范围。如果这个特定的微环境对您的应用程序不好,那么它可能不在这个范围内。
发布于 2015-07-23 20:35:20
在这个结构里你可以腾出一些额外的空间。
类型type字段可能不需要是char数组。您可以在所有可能的类型中使用一组符号常量。
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字节的内存,但它比你拥有的更好。
https://stackoverflow.com/questions/31596580
复制相似问题