|
быстрый тайминг GPIO для LPC |
|
|
|
Jan 6 2008, 20:16
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 26-11-07
Пользователь №: 32 699

|
Есть такая задача: реализовать быстрый синхронный 16-битный вывод в GPIO-порт для LPC2103 (через FIO). При этом ещё должна выполняться фоновая задача. Проблема в том, что вывод в порт необходимо делать стабильно, через равные интервалы времени, с как можно большей частотой. Скорость выполнения фоновой задачи при этом не принципиальна, но она не должна задерживать основной вывод в порт.
Первое и самое простое, что приходит на ум - использовать прерывание по таймеру для вывода в порт. Но очевидно, что максимума скорости так не добиться, хотя бы из-за избыточной работы по обслуживанию прерываний. По той же причине, видимо, не годятся и RTOS-надстройки.
Если же просто перемежать вызовы команд этих двух задач, то не понятно, как при этом обеспечить стабильный тайминг вывода в порт - ведь подсчёт тактов для пайплайна задача непростая... Есть ли какой-то инструментарий для подсчёта тактов выполнения команд на LPC? Чтобы можно было с учётом этого написать на асме код фоновой задачи так, чтобы вперемешку с ним выводить в порт данные строго каждые N тактов?
Какие ещё существуют способы решения данной задачи?
|
|
|
|
|
 |
Ответов
|
Feb 18 2008, 22:42
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 26-11-07
Пользователь №: 32 699

|
Позвольте изложить некоторые результаты по открытой мной теме.
1. Удалось реализовать метод интерлива кода вывода в порт (16 бит) и фоновой задачи. 2. При простых командах (см. ниже) фоновой задачи удалось достичь частоты дискретизации 14 МГц (!), без джиттера (LPC2103, 70 MHz), т.е. за 5 тактов. 3. При большинстве сложных команд частота дискретизации = 7 МГц, без джиттера (за 10 тактов).
Теперь подробности.
1) Реализация подобного вывода в порт реальна, если код выполняется из RAM (ramfunc). В этом случае тайминг команд становится предсказуем, т.е.: - простая арифметика и логика = 1 такт; - запись в память и в FIO-порт = 2 такта; - чтение из памяти, команды перехода = 3 такта, и т.д. Как видим, это соответствует заявленным таймингам для данного семейства ARM7TDMI-S. К сожалению, вызов более сложной функциональности LPC2103 требует существенно большего количества тактов, например: - запись байта в регистр SSP = 7 тактов; - чтение слова данных из ADC (независимо от режима) = целых 8 тактов. (Кстати, скажем, отправку по SSP/SPI в некоторых случаях можно выполнить программно - работает не хуже, и тайминг команд остаётся 3 такта вместо 7-ми.) 2) Использование встроенного таймера позволяет с точностью до такта определять тайминги участков кода и проверять результат. 3) Общее правило подсчёта максимальной частоты дискретизации при таком методе: Fs = Fclk/(Cycles_max + 2), где Cycles_max - длительность самой медленной команды, в тактах (но не менее 3 тактов). 4) Инструментарий писать не стал, по 2-м причинам: 4.1) В общем случае ldr/str может обращаться к каким угодно спец.регистрам периферии, и тайминг будет существенно меняться. Отследить это можно только при эмуляции прошивки, что неоправданно усложняет задачу. 4.2) Для простых же команд тайминги вычисляются слишком просто, нопы вставлять для выравнивания (align) тактов тоже просто - польза от такой утилиты в моём случае неочевидна.
Если интересно, как можно за 5 тактов и в порт выводить 16 бит из памяти, и фоновую программу по 3 такта выполнять, с контролем оверрана DDS-буфера - расскажу и покажу.
|
|
|
|
Сообщений в этой теме
ГУ-49А быстрый тайминг GPIO для LPC Jan 6 2008, 20:16 zltigo Цитата(ГУ-49А @ Jan 6 2008, 22:16) К... Jan 6 2008, 20:45 ГУ-49А Цитата(zltigo @ Jan 6 2008, 22:45) Конкре... Jan 6 2008, 21:10  zltigo Цитата(ГУ-49А @ Jan 6 2008, 23:04) в... Jan 6 2008, 21:46  rezident Цитата(ГУ-49А @ Jan 7 2008, 02:10) И... Jan 8 2008, 13:31 zhevak Цитата(ГУ-49А @ Jan 7 2008, 01:16) К... Jan 6 2008, 20:50 Rst7 ЦитатаСкоп был хороший (LeCroy) и позволял собират... Jan 6 2008, 21:01 GetSmart Думаю можно достичь скорости вывода до Fosc/25 (ме... Jan 7 2008, 09:43 ГУ-49А Цитата(zltigo @ Jan 6 2008, 23:46) Задача... Jan 7 2008, 10:25 zltigo Цитата(ГУ-49А @ Jan 7 2008, 12:25) О... Jan 7 2008, 17:12 zhevak Боюсь нарваться на скандал, но все же скажу, ибо и... Jan 7 2008, 12:46 ГУ-49А Цитата(zhevak @ Jan 7 2008, 14:46) Боюсь ... Jan 7 2008, 13:41  zhevak К сожалению, ни готового решения, ни совета я Вам ... Jan 7 2008, 14:12   ГУ-49А Цитата(zhevak @ Jan 7 2008, 16:12) К сожа... Jan 7 2008, 14:44    Alex03 Цитата(ГУ-49А @ Jan 7 2008, 19:44) Ц... Jan 8 2008, 08:20     ГУ-49А Цитата(Alex03 @ Jan 8 2008, 10:20) Дальше... Jan 8 2008, 10:52 GetSmart Цитата(ГУ-49А)Спасибо. Я готов переписать фон... Jan 7 2008, 13:37 ГУ-49А Цитата(GetSmart @ Jan 7 2008, 15:37) Я им... Jan 7 2008, 13:58 GetSmart ЦитатаИли, может, мне стоит написать такой инструм... Jan 7 2008, 13:53 GetSmart Вы бы ещё пояснили подробности такого нестандартно... Jan 7 2008, 14:06 GetSmart Цитата(ГУ-49А)Т.е. одна из сложностей задачи ... Jan 7 2008, 15:43 GetSmart Цитата(Alex03)одна и та же команда в внутреннюю RA... Jan 8 2008, 09:59 GetSmart ЦитатаВидимо, речь идёт о выводах MATx.y? К сожале... Jan 8 2008, 12:01 digital ЦитатаМожет я что-то пропустил в обсуждении, но я ... Jan 8 2008, 14:53 GetSmart Господа-товарищи!
Я тоже сначала подумал об SS... Jan 8 2008, 15:18 rezident Цитата(GetSmart @ Jan 8 2008, 20:18) макс... Jan 8 2008, 15:26 GetSmart Скорость вывода бита = 2 такта. Чтобы вывести 16 б... Jan 8 2008, 15:47 ГУ-49А Цитата(GetSmart @ Jan 8 2008, 17:47) Скор... Jan 8 2008, 19:13 GetSmart Цитата(GetSmart)Кстати, есть алгоритм, которым мож... Jan 8 2008, 18:29 GetSmart КодLDR R9,[R8] ; R8 = T0CR (иниц... Jan 8 2008, 19:57 alexander55 Вопрос к автору.
Что Вы хотите сделать ?
Варианты ... Jan 9 2008, 07:23  ГУ-49А Цитата(alexander55 @ Jan 9 2008, 09:23) В... Jan 9 2008, 18:16   alexander55 Цитата(ГУ-49А @ Jan 9 2008, 21:16) О... Jan 10 2008, 06:23 GetSmart Попытался применить код, который я тут запостил и ... Jan 13 2008, 11:41 GetSmart Попробывал применить этот алгоритм в своём генерат... Jan 21 2008, 07:23 Alex03 А если MAM=0? Jan 21 2008, 08:47 GetSmart Частота 5 МГц, PLL off, MAM=0, MAMTIM=1. Прерывани... Jan 21 2008, 10:12 GetSmart Частота 59 МГц, прерывание в RAMe, MAM = 2, MAMTIM... Jan 23 2008, 12:46 GetSmart Конечно интересно! Думаю даже не мне одному Feb 19 2008, 04:31 alexander55 Цитата(GetSmart @ Feb 19 2008, 07:31) Кон... Feb 19 2008, 06:18 ГУ-49А Цитата(GetSmart @ Feb 19 2008, 06:31) Кон... Feb 19 2008, 09:47 GetSmart Очень даже неплохо получилось. Можно сказать что э... Feb 19 2008, 10:05 GetSmart Цитата(ГУ-49А)Что ж, давайте ещё раз напомню,... Feb 24 2008, 15:04 ГУ-49А Цитата(GetSmart @ Feb 24 2008, 17:04) Мож... Feb 24 2008, 16:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|