Embedded 在Atmel SAMD21J18A微控制器中查找剩余闪存大小?

Embedded 在Atmel SAMD21J18A微控制器中查找剩余闪存大小?,embedded,microcontroller,iot,atmel,atmelstudio,Embedded,Microcontroller,Iot,Atmel,Atmelstudio,我在一个物联网项目中工作,我使用Atmel SAMD21J18A芯片将数据发送到远程服务器。我想包括一个功能,我可以在运行时发送使用过的闪存和剩余的闪存大小。是否有保存此数据的寄存器?我查看了数据表,但找不到答案。应该可以修改链接器脚本以创建一个符号,其值等于链接器分配的闪存的末尾(如果它还没有)。然后可以在代码中将该符号声明为extern,并使用其值。例如: extern uint32_t END_OF_LINK_ROM ; // Linker generated symbol 如何生成链接

我在一个物联网项目中工作,我使用Atmel SAMD21J18A芯片将数据发送到远程服务器。我想包括一个功能,我可以在运行时发送使用过的闪存和剩余的闪存大小。是否有保存此数据的寄存器?我查看了数据表,但找不到答案。

应该可以修改链接器脚本以创建一个符号,其值等于链接器分配的闪存的末尾(如果它还没有)。然后可以在代码中将该符号声明为
extern
,并使用其值。例如:

extern uint32_t END_OF_LINK_ROM ; // Linker generated symbol

如何生成链接器符号本身将是特定于工具链的。如果您的链接器没有在ROM的开头找到代码,您可能还需要一个符号作为开头。您需要查阅链接器文档并考虑内存映射。

登记器不能保存的东西,一般来说,Flash消耗是由工具链定义的,二进制数是多么大,因此您可以使用链接器脚本来获得二进制文件的整体大小,直到该部分的闪存擦除块大小为止,并且应该能够检测到该部件或编译该部件,以知道该部件有多少闪存,减去,这就是空闲的。或者采取另一种方法,从顶部开始,检查ram,直到找到数据,取整到闪存擦除边界。没有已用和空闲的闪存,它一直都在使用,数据可能是擦除值,但它是一个值。它是每位两个状态(一个或零个),而不是三个状态(一个、零个、自由)。@老定时器非常感谢。内存使用情况如何?有没有办法确定呢?除了stack是的,假设你不使用malloc,我真的希望你不要。如果您保持某种传统(只使用静态分配的变量,而不只是随意进入ram),那么您可以在编译时告诉.data和.bss使用了多少ram。但是堆栈是动态的,您需要进行分析,您无论如何都应该进行分析以确保。如果没有其他方法,您可以使用valgrind类型的方法,但这会添加使用资源的代码,并且不是100%,因为它没有覆盖所有可能的路径。您将如何计算剩余的RAM?我有一个客户端-服务器(IOT)代码运行在我的Atmel芯片上。服务器定期请求剩余的RAM,我需要编写一个逻辑来报告它。我没有使用任何堆(没有动态分配)。我的data+bss总计13160字节(这是编译器提供给我的),RAM为32000字节。我想找到运行时使用的堆栈数量,以便将其添加到13160并向服务器报告。例如,如果我从函数a调用freeMem,那么直到该函数+13160为止使用的堆栈量就是答案。如果从函数B调用,则答案是该函数+13160之前使用的堆栈量。当我在服务器端接收到剩余内存时,我希望看到剩余内存值发生变化。有没有办法找到所使用的堆栈的近似值?像堆栈开始-堆栈指针?如果你发布一个新问题,你会得到更好的答案;因此,这不是一个讨论论坛。堆栈是由链接器静态分配的,就像任何其他数据结构一样。瞬时堆栈级别可以由堆栈指针的值确定(记住堆栈通常从高内存地址向下增长到低内存地址)。如果要估计堆栈的峰值使用率(可能更有用),则需要使用水印值填充堆栈,并从堆栈自上而下扫描以找到高潮标记。是的。我一发表评论就意识到了这一点。我也发布了一个新问题。无论如何,非常感谢你。