реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> LPC2124 проблема с прерыванием на UART THRE
MALLOY2
сообщение Feb 22 2007, 01:08
Сообщение #16


Знающий
****

Группа: 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 и все он генерирует при включении прерывания.


Вот именно он и "кривой", если так поступает.


Он оптимизированный smile.gif, просто тогда об этом недогадывались наверное ....
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 22 2007, 01:51
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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++;
}

Ну раз речь пошла о быстродействии smile.gif smile.gif smile.gif
1.Знаете сколько наносекунд выполняется у LPC обращение к периферии? Cоветую поинтересоваться на досуге.
2.Приведенная Вам строка совершенно не заменяет приведенный мною код.
В своем варианте Вы кроме разрешения прерывания сделаете
- лишнее занесение первого байта в буфер в функции передачи
- лишнее извлечение первого байта из буфера в обработчике (все это естественно работа с байтами и возня с указателями)
- ну и само собой еще одно обращение в обработчике к медленной периферии для запрещения прерывания.

Вместо всех этих телодвижений - анализ/сброс бита и прямое без промежуточной буферизации занесение в THR.
Цитата
и места меньше потребляет

Да. Сколько там FLASH у LPC2124 не напомните? Сколько написали кода?
Цитата
и линейный полностью и конвейер проца не сбрасывает (зависит от компилятора).
И флагов дополнительных не надо

один бит smile.gif в слове где используется дюжина флагов из 32. Кроме того можете работать и по железному флагу TEMT - выиграите 5-6 команд (в сумме с обработчиком прерывния).
Цитата
одни минусы, так вчем прикол ?

Прикол в том, что в Ваших рассуждениях ошибка на ошибке sad.gif
Цитата
я реализовал обмен через разрешение прерываний во многих процах(

Ну и что? Из этого следует что всегда и везде надо поступать по этому шаблону?
Цитата
и нигде небыло проблем.

Их нет и в LPC, если чуть-чуть подумать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 22 2007, 08:38
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(zltigo @ Feb 21 2007, 20:25) *
Цитата(Alex03 @ Feb 21 2007, 16:30) *

Раньше я про посимвольную передачу чтото и не думал, ФИФО по максимуму. smile.gif

Так отключите FIFO и посимвольно с полным контролем над передачей.

ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш, да и шансов создания нежелательных пауз между передаваемыми словами побольше). smile.gif
А вот отправка последнего символа отдельно от всего пакета, тут можно подумать.

Меня и заинтересовало - пользовался ли кто этим для 485 в частности?


Ну а применительно к топикосоздателю:
Накой все эти игры с разрешениями/запретами прерываний? У меня все нужные прерывания включенны всегда, ну а происходят они тогда когда надо, если это не так, то порой можно отловить глюки, которых иначе не поймать было бы.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 22 2007, 09:22
Сообщение #19


Гуру
******

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



Цитата(Alex03 @ Feb 22 2007, 07:38) *
ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш,

Дело не в проигрыше/выигрыше а _необходимости_ выполнить какие-либо действия после передачи, например, байта. Если физический протокол так спроектировал кто-то, то это перечеркивает использование FIFO.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 22 2007, 10:44
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(zltigo @ Feb 22 2007, 11:22) *
Цитата(Alex03 @ Feb 22 2007, 07:38) *

ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш,

Дело не в проигрыше/выигрыше а _необходимости_ выполнить какие-либо действия после передачи, например, байта. Если физический протокол так спроектировал кто-то, то это перечеркивает использование FIFO.

Угу. А реализовать эту _необходимость_ можно всякими способами. Вот тут и рассматриваются варианты с плюсами/минусами пройгрышами/выйгрышами.
Ну да ладно, думаю мы друг-друга поняли.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Feb 22 2007, 12:18
Сообщение #21


Знающий
****

Группа: 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

Вывод: бесполезный спор который никому не нужен, на этом тему лучше закрыть.
Go to the top of the page
 
+Quote Post
gladov
сообщение Feb 22 2007, 12:44
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 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 и сравните полученный код smile.gif
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Feb 22 2007, 13:20
Сообщение #23


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



результат такой же smile.gif, и АRM имеет команды которые адресуют байты, так что ему пофиг

а я очем !!! это и есть кривизна что он не такой как у других.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 22 2007, 18:12
Сообщение #24


Гуру
******

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



Цитата(MALLOY2 @ Feb 22 2007, 11:18) *
а у вас 2 вызова идет это примено 218*2 что больше 387
Вывод: бесполезный спор который никому не нужен, на этом тему лучше закрыть.

Шлангом прикидываемся? Глупо sad.gif
Цитата(MALLOY2 @ Feb 22 2007, 12:20) *
а я очем !!! это и есть кривизна что он не такой как у других.

Из того, что Вы использовали какое-то железо через заднепроходное отверстие, а другое железо, как вдруг оказалось, не "пролезает", не следует, что одно железо кривее другого.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 22 2007, 18:24
Сообщение #25


Гуру
******

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



Цитата(gladov @ Feb 22 2007, 11:44) *
У Вас в функции print, якобы, меньше действий, но в прерывании первый байт вычитывается из буфера и помещается в регистр для отправки. Об этом забываете???

На самом деле у него и в print больше, ибо он этот самый байт в буфер еще сначала помещает.
Про сведение задачи почему-то к одной строчке кода (да то пришлось зачем-то время на два умножать для "доказательства" чего? ) вообще нет слов sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
smac
сообщение Nov 29 2009, 15:42
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(zltigo @ Feb 22 2007, 01:40) *
.. реальная функция у меня выглядит так...

Извините за тупизну и поднятие старой темы, у меня есть вопросы касающийся кода функци приведнной в сообщении zltigo.
Как реализовано "выгребание" буфера tbuf.buf? В прерываниях? Как реализована установка флага STW_THR_BUSY? Интересует конечно не конкретный код а алгоритм.
Достаточно долго пытаюсь понять предложенное решение но что-то мозжечка не хватает, если не трудно, поясните пожалуйста.
Заранее спасибо.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016