#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;