Как указать местоположение переменной в физической памяти? - PullRequest
2 голосов
/ 04 апреля 2011

gcc позволяет управлять разделом, в который помещается переменная, используя атрибут section:

struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };

Есть ли способ указать точное местоположение этого раздела в физической памяти в моем C-коде? Я предполагаю, что виртуальной памяти нет, или, наоборот, виртуальный адрес напрямую преобразуется в физический адрес.

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

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Вы можете добиться эффекта наличия переменной по какому-либо физическому адресу с помощью макроса, например:

#define a (*(volatile struct duart *)0xdeadbeef)

Это не использует компоновщик; он не объявляет никаких переменных, поэтому вы не увидите a в объектном файле. Но я думаю, тебе это не нужно.

Примечание * ключевое слово volatile, которое всегда необходимо при использовании оборудования с отображенной памятью. Часто он работает без volatile, но иногда - нет, и отладка таких сбоев затруднена - поэтому не забывайте это ключевое слово volatile

Использование:

// I assume the duart structure has fields write_buf and read_buf of type uint8_t
a.write_buf = 0x55; // write data to DUART
a.write_buf = 0xaa; // write more data to DUART
uint8_t byte1 = a.read_buf; // read data from DUART
uint8_t byte2 = a.read_buf; // read more data from DUART
0 голосов
/ 04 апреля 2011

Простой способ - определить указатель на вашу структуру и инициализировать его правильным значением, чтобы вам не требовались специальные параметры компоновщика.Конечно, хитрость работает, только если вам не нужна особая функция времени соединения.

Пока!

...