Как указать структуру на конкретный адрес - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь указать структуру на определенную область памяти, может кто-нибудь сказать, пожалуйста, как это может быть сделано в программировании на 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 .Может кто-нибудь, пожалуйста, скажите мне, как я могу изменить значение контрольной суммы.

Заранее спасибо.

С уважением Выбхав

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Учитывая, что вы знаете, что вы там устанавливаете или приземляетесь (и у вас есть на это разрешение), есть два основных способа:

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.

0 голосов
/ 19 марта 2019

Вам необходимо привести адрес к указателю на struct block объект. Также вам необходим экземпляр объекта struct block для назначения приведенного указателя.

См. Этот пример:

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