2013-10-10 2 views
3

Из Технического описания аппаратного чипа,В Embedded Programming мы имеем дело с Виртуальным адресом и Физическим адресом?

Peripherals (at physical address 0x20000000 on) are mapped into the kernel virtual 
address 

space starting at address 0xF2000000. Thus a peripheral advertised here at bus address 
0x7Ennnnnn is available in the ARM kenel at virtual address 0xF2nnnnnn. 

Затем из кода образца,

#define BCM2835_PERI_BASE   0x20000000 

Я думал, программист должен иметь дело с виртуальным адресом, физический адрес скрывается позади. MMU скрывает меньшую сторону физического адреса и увеличивает виртуальный адрес. Конечный пользователь/программист будет иметь дело с виртуальным адресом.

Но выше, пример кода явно использовал физический адрес, почему?

Пример кода

 #define BCM2835_PERI_BASE   0x20000000 
    #define GPIO_PADS  (BCM2708_PERI_BASE + 0x00100000) 
    #define CLOCK_BASE  (BCM2708_PERI_BASE + 0x00101000) 
    #define GPIO_BASE  (BCM2708_PERI_BASE + 0x00200000) 
    #define GPIO_TIMER  (BCM2708_PERI_BASE + 0x0000B000) 
    #define GPIO_PWM  (BCM2708_PERI_BASE + 0x0020C000) 

    static volatile uint32_t *pads ; 



if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC)) < 0) 
return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; 

     pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ; 
+0

Не могли бы вы ссылаться на аппаратный чип или ссылку на контекст, из которого это было найдено? – BlackVegetable

+0

Broadcom 2835 ARM Периферийные данные. Я просто спрашиваю, предположим ли мы использовать физический или виртуальный адрес, это относится ко всему аппаратным чипам, а не только к широкополосному – lilzz

+0

. Этот код работает в ядре ARM? Если нет, то вышеуказанное утверждение не применяется. – ams

ответ

3

Хотя это правда, что разработчик ядра работает в виртуальной памяти, разработчик все еще нужно беспокоиться о физической памяти.

Устройство, которое у вас есть, имеет контроллер GPIO по физическому адресу GPIO_PADS. Вы хотите запрограммировать GPIO, для которого вам нужно получить доступ к своей памяти.

Код, который вы показываете, вызывает mmap, чтобы принять физический адрес в GPIO_PADS и получает MMU, чтобы отобразить его в вашем виртуальном адресном пространстве. Теперь вы можете напрямую читать и записывать в память и программировать GPIO.

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