Port mapping

Отображение портов относится к прямому доступу к аппаратным регистрам (портам), в частности к портам ввода/вывода. Используйте этот тег для обсуждения прямого доступа к порту.


Библиотеки Arduino упрощают доступ к оборудованию процессора, предоставляя высокоуровневые функции, такие как pinMode, digitalRead и digitalWrite (среди прочих) .

Несмотря на то, что они просты в использовании, простота обычно приводит к потере скорости. Программисты, которые хотят получить быстрый доступ к оборудованию, будут использовать «прямой доступ к порту». Например (для Atmega328P, такой как используется на Arduino Uno):


Режим закрепления

Вместо:

pinMode (3, OUTPUT);

Выполнить:

DDRD |= bit (3);  // Порт D, бит 3 в режим вывода

Вместо:

pinMode (13, INPUT);

Выполнить:

DDRB &= ~bit (5);  // Порт B, бит 5 в режим ввода

Вместо:

pinMode (8, INPUT_PULLUP);

Выполнить:

DDRB &= ~bit (0);  // Порт B, бит 0 для режима ввода
PORTB |= bit (0);  // Сделать порт B, бит 0 ВЫСОКИМ, чтобы включить подтягивающий резистор

цифровая запись

Вместо:

digitalWrite (7, HIGH);

Выполнить:

PORTD |= bit (7);  // Делаем порт D, бит 7, ВЫСОКИМ

Вместо:

digitalWrite (6, LOW);

Выполнить:

PORTD &= ~bit (6);  // Делаем порт D, бит 6, НИЗКИМ

цифровое чтение

Вместо:

byte foo = digitalRead (5);

Выполнить:

byte foo = (PIND & bit (5)) ? HIGH : LOW;

Предупреждение

Буквы портов (например, PINB, PINC, PIND) и номера битов (например, бит (1), бит (2) и т. д.) зависят от каждого процессора.

Для простоты использования библиотечные функции позволяют точно определить, какие именно порты и номера битов использовать.


Время

  • pinMode (2, OUTPUT); : 4,5625 мкс (73 такта)
  • DDRD |= бит (3); : 250 нс (4 такта)

  • pinMode (13, INPUT); : 4,9375 мкс (79 тактов)
  • DDRD &= ~bit (5); : 250 нс (4 такта)

  • pinMode (8, INPUT_PULLUP);: 5 мкс (80 тактов)
  • DDRB &= ~bit (0); PORTB |= бит (0); : 375 нс (6 тактов)

  • digitalWrite (7, HIGH); : 3,9375 мкс (63 такта)
  • PINB |= бит (4); : 250 нс (4 такта)

  • digitalWrite (6, LOW); : 4,875 мкс (78 тактов)
  • PINB &= ~bit (6); : 250 нс (4 такта)

  • digitalRead (5); : 4,625 мкс (74 такта)
  • (PIND и бит (5)) ? ВЫСОКИЙ : НИЗКИЙ; : 125 нс (2 тактовых цикла)

библиотека digitalWriteFast

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

#include <digitalWriteFast.h>

void foo ()
  {
  digitalWriteFast (7, HIGH);
  byte bar = digitalReadFast (3);
  }

В этом примере digitalWriteFast и digitalReadFast работают так же быстро, как и доступ с сопоставлением портов.

  • digitalWriteFast на GitHub
  • digitalWriteFast в Google Code

Вопросы, связанные с [port mapping]:

  • 1