Как указать структуре на конкретный адрес

#c #struct #structure #typedef

#c #структура #typedef

Вопрос:

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

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

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

Комментарии:

1. Я не уверен в том, что вы пытаетесь сделать. Зачем вам нужно, чтобы эта структура указывала на этот адрес? Вам принадлежит этот адрес? Если вы не пишете код для очень конкретного случая (ядро, встроенное), у вас, вероятно, нет права доступа к произвольному адресу.

2. Это зависит от конкретной реализации. Какой компилятор C вы используете?

3. Вы имели в виду, что хотите, чтобы ваша структурная переменная начиналась с этого адреса? Если да, вы можете создать переменную-указатель на структуру и присвоить адрес этой переменной. т.е. block *block_addr = (блок *) START_ADDR;

4. блок здесь представляет собой тип. Вам потребуется экземпляр этого типа, чтобы указывать на желаемый адрес

5. @MayurK , это то, что я искал. Спасибо

Ответ №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;
  

б) Через компоновщик:

file.c:

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

компоновщик.ld:

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

Обратите внимание, что я переименовал тип block в block_t .

Комментарии:

1. Повлияет ли заполнение структуры в этом случае? Разве это не должна быть упакованная структура?

2. @Swan И это может повлиять, но цель вопроса — поместить структуру по определенному адресу. Однако я не знаю, разрешены ли дополнительные или невыровненные обращения (или нет).

3. ИМПО, если это имеет значение, я бы использовал архитектурно определенные типы

Ответ №2:

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

Смотрите этот пример:

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