我正在 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 个字节)。
尽我最大的努力来回答,尽管上面代码的目标对我来说并不完全清楚。
我希望链接器报告已使用 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;
}