2016-08-22 4 views
3

Я работаю над встроенным mcu, который имеет два ядра, которые могут видеть область памяти, начинающуюся с 0x80000000.создание структуры данных в определенном месте памяти в c

АЦП подключен к одному сердечнику, а радио подключено к другому. Я хочу записать значение данных, получаемое АЦП, на этот адрес памяти, чтобы другое ядро ​​могло его прочитать.

Кто-нибудь сможет мне помочь выяснить, как это сделать? Это не микро-ОС, это голый металл.

Был ли я создан указатель на структуру по определенному адресу?

У меня есть два значения в массиве, как бы получить их в структуре?

#define NUM_SAMPLES_POLLED (2) 
uint16_t samples_polled[NUM_SAMPLES_POLLED] 

ответ

5

В этом случае вы бы присвоить адрес непосредственно к указателю:

char *memdata = (char *)0x80000000; 

Имейте в виду, что такое поведение определяется реализацией.

+2

Возможно. Это имеет поведение, определенное реализацией. Для реализации, которая в действительности используется, может потребоваться другой механизм или даже вообще не будет предусматривать необходимого поведения. –

+0

Это плохой подход. Использование раздела и компоновщика будет правильным. Но для обмена данными требуется больше средств. – Olaf

+0

«Мне нужно одно ядро ​​для записи данных на этот адрес, чтобы другой мог прочитать его». может потребовать координировать доступ между двумя ядрами - возможно, с использованием «volatile», «+ atomic» и т. д., но это выходит за рамки сообщения OP, но, скорее всего, это последующая проблема. – chux

1

Лучше всего прочитать документацию по цепочке инструментов для определения и использования разделяемой памяти.

+0

Что связано с общей памятью? –

+0

Ничего, очевидно ... или, возможно, все. rtfm – Mick

3

Как создать массив на этом точном адресе с некоторыми значениями?

Язык C не определяет механизм назначения переменных конкретным адресам. Действительно, такой механизм, вероятно, не будет жизнеспособным в размещенной реализации C, поскольку практически все современные хостинговые реализации полагаются на базовую ОС с виртуальной памятью.

Поскольку вы предположительно пишете для самостоятельной реализации (учитывая, что цель - встроенный MCU), вполне вероятно, что существует механизм для того, что вы просите. Тогда предложенный @dbush был бы хорошим кандидатом, но только, проверяя свою документацию, вы можете быть уверены.

1

Array - не объект. Массив в «c» - это просто представление данных. поэтому вы не можете его создать или уничтожить (или отпустить). вы можете просто получить к нему доступ, то есть читать и/или писать.

void* ptr=(void*)0x80000000; 
int* arr_of_int = (int*)ptr; //access memory location as array of int 
arr_of_int[0] = 0x100;   //write value to your array 
int i = arr_of_int[10] ;  // read value from array 

или

char* arr_of_char = (char*)ptr; // access memory as array of char 
arr_of_char[0] = 'A'; 

вы должны убедиться, что вы на самом деле доступ в этот адрес из с в вашей программе в качестве ядра операционной системы (если вы работаете код в качестве пользовательской программы) будет запретить прямой физическая адресация. В этом случае вам необходимо использовать функцию преобразования адресов для вычисления виртуального адреса, соответствующего физическому адресу.

+0

Массивы ** являются ** объектами. Извините, сегодня у меня нет нищеты. И возиться с «void *» - это бессмыслица. Любая причина, по которой вы принимаете ОС? OP упоминает MCU, поэтому, скорее всего, нет или просто легкая ОС, например FreeRTOS без управления памятью. – Olaf

+0

@Olaf Возможно, раньше у вас был комментарий, что указатели не являются объектами. AFAIK, указатели и массивы являются _derived types_ из _объектов_ C11 §6.2.5 20. – chux

+0

@chux: Где я это сказал? Во всяком случае, массив не является указателем (но указатель тоже является объектом). Термин «объект» четко определен в 3.15: «** объект **: область хранения данных в среде исполнения, содержимое которой может представлять значения». – Olaf

Смежные вопросы