我想读取MCU的整个程序闪存的内存位置值,特别是OpenMote-CC2538上的CC2538。然后,将读取值计算为当前所有值的大部分。
此时,我有以下代码用于遍历内存并获取值
uint64_t readMemory() {
unsigned char * bytes = (char *) 0x200000;
size_t size = 0x0007FFD4;
size_t i;
uint64_t amount = 0;
for (i = 0; i < size; i++) {
amount += bytes[i];
}
return amount;
}
uint64_t readFlashMemory() {
unsigned int * bytes = (int *) 0x200000;
size_t size = 0x0007FFD4;
size_t i;
uint64_t amount = 0;
for (i = 0; i < size; i+=4) {
amount += FlashGet(bytes);
bytes++;
}
return amount;
}
地址0x200000,其大小为0x0007FFD4。第一个函数使用char并逐个转到每个地址,而第二个函数使用flash.c文件中的现有函数FlashGet(uint32_t),它直接访问寄存器(HWREG)。
FlashGet需要一个uint32_t地址并返回一个uint32_t值,因此它的长度为4,地址应该在循环中以4移动。第一个函数使用char作为寻址,长度为1,所以地址也应该在循环中移动1。我在这些陈述中是否正确?如果是这样,我正确执行它们吗?对于第二个函数,将指针递增为1应该将其移动为4,因为它的类型为uint32_t(类似于int)。
但是,函数返回不同的值。 第一个返回:674426297757 第二个返回:8213668631160
由于两个函数都应该相同,因此一个或两个函数必须不正确,并且不会读取整个程序闪存。
如何修复这两个功能?当您有起始地址和大小时,是否有更好或更简单的方法来读取整个内存?
答案 0 :(得分:3)
考虑你有一个带内容的4字节闪存
00 01 02 03
按字节值添加将为您提供0x000000000000006
通过32位int
值添加,您将0x0000000003020100
假设为little-endian。