我试图将结构指向特定的内存位置,任何人都可以告诉我如何在c编程中完成它。我已经定义了一个宏,它保存了内存位置的起始地址。
#define START_ADDR 0xF6000 //starting address
typedef struct {
uint32_t checksum;
uint16_t index[len];
} block;
我使用以下语句更改了块的内存分配:
block *value = (block*) START__ADDR;
我也验证了内存分配的变化,没有问题。我正在研究FLASH内存,我已经验证了写操作可以在我提到的特定内存位置上完成。现在我正在尝试使用更新校验和的值
value->checksum=0xa5a5a5a5;
但校验和的值是0x00000000并且没有更新到0xa5a5a5a5。任何人都可以告诉我如何更改校验和的值。
提前致谢。
关心Vybhav
考虑到你确实知道你在那里设置或登陆(并且你有权这样做),有两种主要方式:
a)取消指向地址的指针:
#define ADDR 0xXXXXXX
unsigned int volatile * const var = (unsigned int *) ADDR;
你的具体情况:
typedef struct {
uint32_t checksum;
uint16_t index[len];
} block_t;
unsigned block_t volatile * const block = (block_t *) ADDR;
block->checksum = 0;
b)通过链接器:
file.c:
block_t __attribute__((section(".theSection"))) block;
block.checksum = 0;
linker.ld:
SECTIONS
{
.theSegment 0xXXXXXX : {KEEP(*(.theSection))}
}
请注意,我已将block
类型重命名为block_t
。
您需要将地址转换为指向struct block
对象的指针。您还需要一个struct block
对象的实例来分配转换指针。
看这个例子:
struct block * volatile block_pointer = (struct block*)START_ADDR;