【问题标题】:How to point a structure to a particluar address如何将结构指向特定地址
【发布时间】:2019-08-09 16:28:20
【问题描述】:

我试图将一个结构指向一个特定的内存位置,谁能告诉我如何在 c 编程中完成它。 我已经定义了一个宏来保存内存位置的起始地址。

#define START_ADDR 0xF6000 //starting address

typedef struct {
     uint32_t checksum;
     uint16_t index[len];
} block;

我使用以下语句更改了块的内存分配:

block *value = (block*) START__ADDR;

我也验证了内存分配的变化,没有问题。我正在使用闪存,我已经验证了可以在我提到的特定内存位置上完成写入操作。 现在我正在尝试使用

更新校验和的值
value->checksum=0xa5a5a5a5;

但是校验和的值是 0x00000000 并且没有更新为 0xa5a5a5a5。 谁能告诉我如何更改校验和的值。

提前致谢。

问候 维巴夫

【问题讨论】:

  • 我不确定您要做什么。为什么你需要这个结构来指向这个地址?你拥有这个地址吗?除非您正在为非常特殊的情况(内核、嵌入式)编写代码,否则您可能无权访问任意地址。
  • 这是特定于实现的。你用的是什么 C 编译器?
  • 您的意思是您希望结构变量以该地址开头吗?如果是,您可以创建一个指向结构的指针变量并将地址分配给该变量。即块 *block_addr = (block *) START_ADDR;
  • block 这里是一个类型。您需要有一个这种类型的实例来指向所需的地址
  • @MayurK,这就是我要找的。谢谢

标签: c struct structure typedef


【解决方案1】:

考虑到您确实知道自己在哪里设置或登陆(并且您有权这样做),两种主要方式是:

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) 通过链接器:

文件.c:

block_t __attribute__((section(".theSection"))) block;
block.checksum = 0;

linker.ld:

SECTIONS
{
    .theSegment 0xXXXXXX : {KEEP(*(.theSection))}
}

请注意,我已将类型 block 重命名为 block_t

【讨论】:

  • 在这种情况下结构填充会影响吗?不应该是一个打包的结构吗?
  • @Swanand 可能会影响,但问题的目的是将结构放置在特定地址中。但是,我不知道是否允许(或不允许)填充或未对齐访问。
  • IMPO,如果这很重要,我会使用架构上定义的类型
【解决方案2】:

您需要将地址转换为指向struct block 对象的指针。您还需要一个 struct block 对象的实例来分配转换后的指针。

看这个例子:

struct block * volatile block_pointer = (struct block*)START_ADDR;

【讨论】:

    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-09-20
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多