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

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

|
Цитата(zhevak @ Jan 7 2008, 16:12)  К сожалению, ни готового решения, ни совета я Вам дать не могу. Выше люди уже предлагали использовать FIQ. Почему не проходит этот вариант? ... Удачи! Спасибо. Этот вариант "проходит", просто не является оптимальным по максимальной частоте вывода в порт по сравнению с его потенциальной альтернативой (интерлив кода). Моя задача скорее R&D'шная и не требует наискорейшей реализации. Поэтому я могу себе позволить "семь раз отмерить". Цитата(GetSmart @ Jan 7 2008, 16:06)  У LPC и SAM7 одинаковое ядро ARM7TDMI-S, но конвейер разный. Так что всё это будет конкретно привязано к конкретному процессору. Даже к конкретной его ревизии (ревизиям!). Так как никто не обещал, что улучшений в сторону ускорения работы процессора в новых ревизиях не предвидится. Где в документации, в таком случае, искать такты для нужного конвейера нужной ревизии LPC2103? Я знаю только про общий армовский Instruction Set... Существующие счётчики тактов тоже далеко не точны, получается? Т.е. одна из сложностей задачи - нет чёткой информации о таймингах конкретных конвейеров? Цитата(GetSmart @ Jan 7 2008, 16:06)  Вы бы ещё пояснили подробности такого нестандартного вывода из процессора. Что за данные и в какое устройство перегоняются? Это связано с управлением светодиодами? Данные идут в R-2R, т.е. такой себе дешевый тупой аналог DDS.
|
|
|
|
|
Jan 7 2008, 17:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ГУ-49А @ Jan 7 2008, 12:25)  Обратите внимание, что вопрос касался выдачи в порт по таймеру, причём на фоне другой задачи. Обратите внимание, что количество тактов для входа в обработчик прерывания (в частности в FIC) документировано (контроллер прерываний используется от ARM Company, описание соответственно...). Процедура сброса контроллера прерывания и длительность процедуры возврата тоже не является секретом фирмы. Затраты на махание ножкой - тоже известны. Длительность прерываемых команд - зависит от того, какие лично Вы собираетесь использовать. Вопрос - чего Вам не хватает для ответа на вопрос?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 8 2008, 08:20
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(ГУ-49А @ Jan 7 2008, 19:44)  Цитата(GetSmart @ Jan 7 2008, 19:06)  У LPC и SAM7 одинаковое ядро ARM7TDMI-S, но конвейер разный. Так что всё это будет конкретно привязано к конкретному процессору. Даже к конкретной его ревизии (ревизиям!). Так как никто не обещал, что улучшений в сторону ускорения работы процессора в новых ревизиях не предвидится. Где в документации, в таком случае, искать такты для нужного конвейера нужной ревизии LPC2103? Я знаю только про общий армовский Instruction Set... Существующие счётчики тактов тоже далеко не точны, получается? Т.е. одна из сложностей задачи - нет чёткой информации о таймингах конкретных конвейеров? ИМХО вы не по делу "трогаете" конвейер(ы) ядра, думаю что во всех чипах на ARM7TDMI-S ядро одинаковое. Длительности исполнения команд ядром расписаны АРМ-ом, НО.... Дальше в дело вмешивается некий контроллер памяти (внешний для ядра), именно он может вставлять вэйтстейты, именно он может иметь возможность отложенной записи (некоторой глубины и/или разной по разным адресам), именно он может разбивать одно обращение к памяти на несколько (в случае невыровненных данных и/или менее разрядной памяти). И в обшем случае невозможно определить время выполнения конкретной команды на конкретном камне не зная предистории выполнения других команд (тут влияет как состояние самого ядра, так и состояние внешней по отношению к ядру обвязке), не зная "а по какому адресу эта команда полезет в память" (одна и та же команда в внутреннюю RAM пишет за такт, а в порт в/в за N тактов, а в внешннюю RAM за M тактов), и т.д. в ряде случаев псевдокод Код вывод слова в порт ввода вывода вывод слова в порт ввода вывода будет выполняться за тоже время что и Код вывод слова в порт ввода вывода одна или несколько команд (типа пересылки регистр/регистр) вывод слова в порт ввода вывода
|
|
|
|
|
Jan 8 2008, 09:59
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Alex03) одна и та же команда в внутреннюю RAM пишет за такт За 2 такта. Код вывод слова в порт ввода вывода одна или несколько команд (типа пересылки регистр/регистр) вывод слова в порт ввода вывода Это было бы в идеально сделанном проце, но в LPC это скорее всего не так. Кажется я это проверял. Однако всю малину могут испортить команды с неопределённым во время компиляции/конвертации количеством циклов. Вообще, подводных камней в конвертере будет много, но идея всё-равно интересная. Если б мне на работе это потребовалось сделать, я бы с удовольствием занялся. Кстати, есть алгоритм, которым можно достичь супер-пиковой скорости вывода до Fosc/2. Однако в нём джиттер будет пипец как гадить. Однако и его можно полностью подавить. Короче, мисль человеческая безгранична  Пока неизвестны характеристики выходного сигнала с R-2R ничего конкретного предложить не могу. Да и алгоритм супер секретный
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 8 2008, 10:52
|
Участник

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

|
Цитата(Alex03 @ Jan 8 2008, 10:20)  Дальше в дело вмешивается некий контроллер памяти (внешний для ядра), именно он может вставлять вэйтстейты, именно он может иметь возможность отложенной записи (некоторой глубины и/или разной по разным адресам), именно он может разбивать одно обращение к памяти на несколько (в случае невыровненных данных и/или менее разрядной памяти). ... В конкретном случае с LPC2103 мы можем допустить, что подобным образом может "проказничать" MAM, ведь внешнего RAM'а нет, да и внутренний всего 1 банк в 8 кб? И тогда, отключив MAM, выполняя код из RAM и читая/записывая короткими словами, можно побороть эту проблему? Цитата(GetSmart @ Jan 8 2008, 11:59)  Кстати, есть алгоритм, которым можно достичь супер-пиковой скорости вывода до Fosc/2. Однако в нём джиттер будет пипец как гадить. Однако и его можно полностью подавить. Короче, мисль человеческая безгранична  Видимо, речь идёт о выводах MATx.y? К сожалению, этот метод не подходит, нужен честный вывод с 12-битным квантованием. Что касается алгоритма вывода, то есть область памяти с данными, их-то и надо слать в порт (16-битный, нужны 12 бит). Всё просто, как видите, за исключением маниакального желания обогнать способ вывода по прерыванию таймера.
|
|
|
|
|
Jan 8 2008, 12:01
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата Видимо, речь идёт о выводах MATx.y? К сожалению, этот метод не подходит, нужен честный вывод с 12-битным квантованием. Ну вообще-то речь идёт о честном 30-битном квантовании, но нет так нет. Всё-равно никто его не знает, иначе уже сказали бы. Цитата В конкретном случае с LPC2103 мы можем допустить, что подобным образом может "проказничать" MAM, ведь внешнего RAM'а нет, да и внутренний всего 1 банк в 8 кб? И тогда, отключив MAM, выполняя код из RAM и читая/записывая короткими словами, можно побороть эту проблему? Ну да, так чуть-чуть можно ускорить прогу т.к. после смены PC меньше тактов ожидания будет теряться, однако LPC хорош тем, что он даже из внутреннего флэша исполняет большинство команд за такт. Экономия будет только на переходах и на чтении констант из флэш. Наверное это действительно контроллер памяти и внутренних шин AHB и VPB вносят лишние циклы ожидания.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 8 2008, 14:53
|
Местный
  
Группа: Свой
Сообщений: 229
Регистрация: 3-02-06
Из: Санкт-Петербург
Пользователь №: 13 974

|
Цитата Может я что-то пропустил в обсуждении, но я бы реализовал такую задачу на стандартном порту SSC или SPI, дополнив ARM десериализатором на любой мелкой ПЛИС. Можно воспользоваться готовой микросхемой parallel<>SPI например MCP23S17 (Microchip) 16бит скорость 10мбит/сек
|
|
|
|
|
Jan 8 2008, 18:29
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(GetSmart) Кстати, есть алгоритм, которым можно достичь супер-пиковой скорости вывода до Fosc/2. Однако в нём джиттер будет пипец как гадить. Однако и его можно полностью подавить. Короче, мисль человеческая безгранична  Пока неизвестны характеристики выходного сигнала с R-2R ничего конкретного предложить не могу. Да и алгоритм супер секретный  Попытался накидать прогу. Оказывается для данного применения мой алгоритм не подходит. Жаль. Он может увеличить амплитудное разрешение, а не временное. Могу только предложить алгоритм полного избавления от джиттера во время FIQ в ущерб скорости вывода. Возможно скорость упадёт до Fosc/32.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 8 2008, 19:13
|
Участник

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

|
Цитата(GetSmart @ Jan 8 2008, 17:47)  Скорость вывода бита = 2 такта. Чтобы вывести 16 бит потратится 32 такта. Это в самом-самом идеальном случае. У меня под рукой нет мануала на LPC2103. Короче, если бы в 2103-ем был SSP как в 213х-ом. В 2103-м на SSP тоже нельзя добиться нужной скорости, это точно. К тому же, есть неприятная errata на этот случай, можно нарваться: "Initial data bits/clocks of the SSP transmission are shorter than subsequent pulses at higher frequencies. ... At high SSP frequencies, it is found that the first four pulses are shorter than the subsequent pulses.". Цитата(GetSmart @ Jan 8 2008, 20:29)  Могу только предложить алгоритм полного избавления от джиттера во время FIQ в ущерб скорости вывода. Возможно скорость упадёт до Fosc/32. С интересом выслушаю ваши предложения...
|
|
|
|
|
Jan 8 2008, 19:57
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Код LDR R9,[R8] ; R8 = T0CR (инициализируется во время LowLevelInit) AND R9,R9,#7 ; с небольшим риском эту команду можно убрать ADD R15,R15,R9 NOP NOP NOP NOP NOP NOP NOP NOP Я точно не анализировал, но может быть этот алгоритм уменьшит скорость в два раза. кол-во NOPов тоже нужно подобрать получше. Вобщем я обрисовал только идею. Возможно этот пример нужно немного доработать.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|