确定 ARM 微控制器上自定义内存区域的已用大小

问题描述 投票:0回答:1

我正在 ARM 32 位微控制器上实现一个应用程序,其中我使用部分内部闪存来存储一些持久值。 为此,我将以下内容添加到链接器脚本中:

MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 20K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 63K
  STORAGE_FLASH (rx) : ORIGIN =  ORIGIN(FLASH) + LENGTH(FLASH), LENGTH = 1K
}
SECTIONS
{
  ._customStorage :
  {
    _sCustomStorage = .;
    . = ALIGN(4);
    KEEP(*(._customStorage))
    . = ALIGN(4);
    _eCustomStorage = .;
  } >STORAGE_FLASH
}

在主程序中,我将调用一个函数来写入闪存,在其中我将传递地址作为参数。

我想知道是否可以以某种方式计算使用不同地址调用函数的次数(至少如果它们是常量),以估计消耗了多少内存。

由于不同的调用可能会写入不同的大小,因此最好将

address
参数与
size
参数相乘,但这似乎更困难。由于对于我的应用程序来说,大多数写入操作都是 16 位,因此该功能并不是非常必要。

我现在正在做的是在心里估计记忆并执行以下操作:

#define OCCUPIED_SIZE 50
const uint8_t __attribute__((section ("._customStorage"))) ___occupiedMemory[OCCUPIED_SIZE];

例如,使用以下代码:

bool writeFlash(uint32_t address,uint8_t* data,uint16_t size);
int main(){
   uint8_t value = 0;
   uint8_t array[50] = {};
   bool flag; //Not initialized indicating value is not determined by compiler
   writeFlash(12,&value,1);
   writeFlash(34,&array,7);
   writeFlash(34,&array,10);
   if(flag){
       writeFlash(67,&array,10);
   }
}

我希望链接器报告已使用 24 个字节(来自“ALIGN”的额外 3 个字节)。

c arm microcontroller
1个回答
0
投票

尽我最大的努力来回答,尽管上面代码的目标对我来说并不完全清楚。

我希望链接器报告已使用 24 个字节(来自“ALIGN”的额外 3 个字节)。

链接器不可能报告运行时确定的信息。所以你问的确切问题是不可能的。这排除了任何使用

writeFlash()
在运行时写入此特殊内存区域的解决方案。


我想知道是否有可能......估计消耗了多少内存。

但是,如果您知道在链接时将哪些数据写入

._customStorage
,那么您可以在链接时将数据写入
._customStorage
部分,并且确切地知道 ._customStorage
 中的闪存数量消耗掉了。

例如下面的C代码,

#define IN_CUSTOM_STORAGE __attribute__((section("._customStorage"))) const uint8_t IN_CUSTOM_STORAGE one_chunk_in_storage[50] = { 0 }; // init as desired ... const uint8_t IN_CUSTOM_STORAGE another_stored_thing[16] = { 0 }; // init as desired ... const uint16_t IN_CUSTOM_STORAGE one_16b_store = 0xABCD;
在链接器脚本中添加以下内容,

SECTIONS { ._customStorage : { _sCustomStorage = .; . = ALIGN(4); KEEP(*(._customStorage)) . = ALIGN(4); _eCustomStorage = .; } > STORAGE_FLASH used_custom_storage = _eCustomStorage - _sCustomStorage; ... }
当图像闪存到微控制器时,
将导致

one_chunk_in_storage

another_stored_thing
one_16b_store
的内容写入内存的
STORAGE_FLASH
区域。

如果您想

确切地在链接时消耗了STORAGE_FLASH

中的多少空间,那么您可以将
-Wl,-Map=appimage.map
添加到链接器标记中,与二进制文件一起生成的“appimage.map”文件将告诉您什么你想要。

如果您想

确切地知道 C 程序内部消耗了多少空间,那么这个函数会告诉您:

size_t how_much_data_in_storage() { // This symbol was calculated in the linker script extern const char used_custom_storage[]; return (size_t)used_custom_storage; }


如果您的用例确实需要存储在运行时确定的数据,那么您可能需要研究“键值存储”或 KVS 来构建对闪存的写入,因为细节可能会变得很复杂。

© www.soinside.com 2019 - 2024. All rights reserved.