Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM9G45 вывод данных посредством GPIO
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Andrew_Freeman
Здравствуйте.

Требуется выводить битовый поток посредством GPIO со скоростью порядка 5 мегагерц в секунду
На текущий момент получается со скоростью 1.5 Мгц

На текущий момент задача решается в лоб:

Код
              if (tmp & 0x01) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
              if (tmp & 0x02) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
              if (tmp & 0x04) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
              if (tmp & 0x08) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
              if (tmp & 0x10) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
              if (tmp & 0x20) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
              if (tmp & 0x40) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
              if (tmp & 0x80) set(LED_SDI);  else   clr(LED_SDI);    set(LED_CLK); asm ("nop");  clr(LED_CLK);
...


Собственно интересует, существует-ли какой-либо быстрый ввод-вывод для данного семейства (fast IO).

И интересует, как работают прерывания от периферии в Linux - скорость перехода в прерывание, и возможность обработки этого прерывания в течение длительного времени (порядка десятков, максимум сотни мс).

sasamy
Цитата(Andrew_Freeman @ Apr 13 2011, 08:07) *
Требуется выводить битовый поток посредством GPIO со скоростью порядка 5 мегагерц в секунду
На текущий момент получается со скоростью 1.5 Мгц

На текущий момент задача решается в лоб:


Судя по коду Вы изобретаете SPI ;-)

Цитата
И интересует, как работают прерывания от периферии в Linux - скорость перехода в прерывание


Это сильно зависит от реализации - Linux не RTOS поэтому гарантировать какаую-то латентность нельзя, в общем случае нужно брать осциллограф, писать тестовый драйвер и измерять на конкретной системе.

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


Для этого есть bottom half, в Linux их можно реализовать двумя методами:
1 Tasklets - имеют минимальную латентность, вызываются в контексте soft irq поэтому не могут переходить в состояние ожидания.
2 Workqueues - это по сути обычные процессы, поэтому в их контексте можно пользоваться любыми функциями ядра, но имеют большую латентность по сравнению с тасклетами
aaarrr
Цитата(Andrew_Freeman @ Apr 13 2011, 08:07) *
На текущий момент задача решается в лоб:

Это как-то совсем уж в лоб. Почитайте про synchronous output в описании PIO.
Andrew_Freeman
Можете примеров кинуть?
И посоветуйте среду разработки, а то компилить с помощью батника несколько неудобно... )

Да, UBoot можно к среде разработки прикрутить? Хочется по нажатию кнопки "Flash" прошивать без лишних заморочек. (Куда уж, в оперативку или в НАНД - это уже настроить думаю можно)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.