|
LPC2124 проблема с прерыванием на UART THRE |
|
|
|
Feb 22 2007, 01:08
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата В "идеальном" с Вашей точки зрения железе дергать разрешение прерывания когда есть/нет чего передавать (разбираясь перед этим есть или нет чего)это типа "прямо" и правильно . А глянуть на один флаг в момент начала передачи порции это "разве это работа". ну насчет правильно неправильно тут я судить не буду но код U0IER |= IER_THREIE; куда быстрее выполняется чем код if( !(status_word & STW_THR_BUSY) ) { status_word |= STW_THR_BUSY; U0THR = *string++; } и места меньше потребляет и линейный полностью и конвейер проца не сбрасывает (зависит от компилятора). И флагов дополнительных не надо, одни минусы, так вчем прикол ? я реализовал обмен через разрешение прерываний во многих процах(ATMEGA, ST16C1550+8051, TMS320VC5502 ... ) и намой взгляд это наиболее быстрый и экономический вариант если проц без ДМА, и нигде небыло проблем. Цитата (MALLOY2 @ Feb 21 2007, 16:41)
но у меня лежит плата с ST16C1550 и все он генерирует при включении прерывания.
Вот именно он и "кривой", если так поступает. Он оптимизированный  , просто тогда об этом недогадывались наверное ....
|
|
|
|
|
Feb 22 2007, 01:51
|

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

|
Цитата(MALLOY2 @ Feb 22 2007, 00:08)  но код
U0IER |= IER_THREIE;
куда быстрее выполняется чем код if( !(status_word & STW_THR_BUSY) ) { status_word |= STW_THR_BUSY; U0THR = *string++; } Ну раз речь пошла о быстродействии  1.Знаете сколько наносекунд выполняется у LPC обращение к периферии? Cоветую поинтересоваться на досуге. 2.Приведенная Вам строка совершенно не заменяет приведенный мною код. В своем варианте Вы кроме разрешения прерывания сделаете - лишнее занесение первого байта в буфер в функции передачи - лишнее извлечение первого байта из буфера в обработчике (все это естественно работа с байтами и возня с указателями) - ну и само собой еще одно обращение в обработчике к медленной периферии для запрещения прерывания. Вместо всех этих телодвижений - анализ/сброс бита и прямое без промежуточной буферизации занесение в THR. Цитата и места меньше потребляет Да. Сколько там FLASH у LPC2124 не напомните? Сколько написали кода? Цитата и линейный полностью и конвейер проца не сбрасывает (зависит от компилятора). И флагов дополнительных не надо один бит  в слове где используется дюжина флагов из 32. Кроме того можете работать и по железному флагу TEMT - выиграите 5-6 команд (в сумме с обработчиком прерывния). Цитата одни минусы, так вчем прикол ? Прикол в том, что в Ваших рассуждениях ошибка на ошибке  Цитата я реализовал обмен через разрешение прерываний во многих процах( Ну и что? Из этого следует что всегда и везде надо поступать по этому шаблону? Цитата и нигде небыло проблем. Их нет и в LPC, если чуть-чуть подумать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 22 2007, 08:38
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(zltigo @ Feb 21 2007, 20:25)  Цитата(Alex03 @ Feb 21 2007, 16:30)  Раньше я про посимвольную передачу чтото и не думал, ФИФО по максимуму.  Так отключите FIFO и посимвольно с полным контролем над передачей. ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш, да и шансов создания нежелательных пауз между передаваемыми словами побольше).  А вот отправка последнего символа отдельно от всего пакета, тут можно подумать. Меня и заинтересовало - пользовался ли кто этим для 485 в частности? Ну а применительно к топикосоздателю: Накой все эти игры с разрешениями/запретами прерываний? У меня все нужные прерывания включенны всегда, ну а происходят они тогда когда надо, если это не так, то порой можно отловить глюки, которых иначе не поймать было бы.
|
|
|
|
|
Feb 22 2007, 10:44
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(zltigo @ Feb 22 2007, 11:22)  Цитата(Alex03 @ Feb 22 2007, 07:38)  ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш,
Дело не в проигрыше/выигрыше а _необходимости_ выполнить какие-либо действия после передачи, например, байта. Если физический протокол так спроектировал кто-то, то это перечеркивает использование FIFO. Угу. А реализовать эту _необходимость_ можно всякими способами. Вот тут и рассматриваются варианты с плюсами/минусами пройгрышами/выйгрышами. Ну да ладно, думаю мы друг-друга поняли.
|
|
|
|
|
Feb 22 2007, 12:18
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата и нигде небыло проблем.
Их нет и в LPC, если чуть-чуть подумать. да нет никаких проблем в работе, броблема в том что надо переписывать драйвер под этот проц что даже не планировалось. по поводу времени выполнения тут спорный момент. тест 1 Код IO1SET = (1<<16); U0IER_bit.THREIE = 1; IO1CLR = (1<<16); врямя замеряю осцилом ~387нс тест 2 Код volatile unsigned char status_word; //<= volatile т.к. изменяется в прерываниии
IO1SET = (1<<16); status_word |= 1<<0; IO1CLR = (1<<16); врямя замеряю осцилом ~218нс а у вас 2 вызова идет это примено 218*2 что больше 387 Вывод: бесполезный спор который никому не нужен, на этом тему лучше закрыть.
|
|
|
|
|
Feb 22 2007, 12:44
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(MALLOY2 @ Feb 22 2007, 12:18)  врямя замеряю осцилом ~218нс
а у вас 2 вызова идет это примено 218*2 что больше 387
Вывод: бесполезный спор который никому не нужен, на этом тему лучше закрыть. Вы говорите о двух принципиально разных подходах в реализации железа UART. AVR и LPC имеют разные реализации и управлять ими придется по-разному. Для LPC, имхо, zltigo показал более правильный способ. У Вас в функции print, якобы, меньше действий, но в прерывании первый байт вычитывается из буфера и помещается в регистр для отправки. Об этом забываете??? И при чем тут время, затрачиваемое на установку или проверку флага занятости передатчика? Если он занят, а Вы хотите дождаться его освобождения, не все ли равно сколько нс будет затрачено на проверку занятости? Ведь времена проверки флага и передачи бита, который эту занятость вызвал, просто несоизмеримы. Цитата(MALLOY2 @ Feb 22 2007, 12:18)  тест 2 Код volatile unsigned char status_word; //<= volatile т.к. изменяется в прерываниии
IO1SET = (1<<16); status_word |= 1<<0; IO1CLR = (1<<16); тест неправильный. ARM - 32-битная архитектура, которой тяжело работать с байтами. zltigo говорил про 32 флага, а Вы char тестируете. Ради интереса сделайте тест с int и сравните полученный код
|
|
|
|
|
Feb 22 2007, 18:12
|

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

|
Цитата(MALLOY2 @ Feb 22 2007, 11:18)  а у вас 2 вызова идет это примено 218*2 что больше 387 Вывод: бесполезный спор который никому не нужен, на этом тему лучше закрыть. Шлангом прикидываемся? Глупо  Цитата(MALLOY2 @ Feb 22 2007, 12:20)  а я очем !!! это и есть кривизна что он не такой как у других. Из того, что Вы использовали какое-то железо через заднепроходное отверстие, а другое железо, как вдруг оказалось, не "пролезает", не следует, что одно железо кривее другого.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 29 2009, 15:42
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(zltigo @ Feb 22 2007, 01:40)  .. реальная функция у меня выглядит так... Извините за тупизну и поднятие старой темы, у меня есть вопросы касающийся кода функци приведнной в сообщении zltigo. Как реализовано "выгребание" буфера tbuf.buf? В прерываниях? Как реализована установка флага STW_THR_BUSY? Интересует конечно не конкретный код а алгоритм. Достаточно долго пытаюсь понять предложенное решение но что-то мозжечка не хватает, если не трудно, поясните пожалуйста. Заранее спасибо.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|