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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> LPC177x UART, использовать FIFO для передачи
Golikov A.
сообщение Sep 28 2013, 05:05
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Terminator @ Sep 28 2013, 08:52) *
это всё конечно красиво, но попробуйте сделать вывод в отладочный порт из разных задач. Останавливать задачу ради вывода отладки нельзя, что влезло в буфер, то влезло. Заводить отдельную задачу для слежения за заполненостью буфера, очень не хочется. Запрещать прерывания перед каждым обращением в uart тоже (тут я конечно несколько лукавлю, т.к. при складывании в буфер прерывания всё равно запрещаются).


так в чем проблема то?

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


в остальном проблем нет. Я же писал функции работают идентично, просто вместо вашей проверки на запрет прерывания и его разрешение, у нас делает проверка на пустоту буфера и его запуск на передачу. Дальше у всех циклический буфер в который кладутся остатки сообщения.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 28 2013, 11:34
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Возможно товарищи по каким-то причинам (религиозным?) очень хотят писать в FIFO именно из ISR. Непреодолимое желание сиё понять трудно... twak.gif
Но, коли так уж хочется, после разрешения empty-tx IRQ можно программно возбудить прерывание при помощи NVIC.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 28 2013, 19:11
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Аминьsm.gif
Go to the top of the page
 
+Quote Post
Terminator
сообщение Sep 30 2013, 02:59
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Цитата(jcxz @ Sep 28 2013, 18:34) *
Возможно товарищи по каким-то причинам (религиозным?) очень хотят писать в FIFO именно из ISR. Непреодолимое желание сиё понять трудно... twak.gif
Но, коли так уж хочется, после разрешения empty-tx IRQ можно программно возбудить прерывание при помощи NVIC.

Чем плохо писать в FIFO из ISR? Это позволяет (не в случае с LPC конечно) в коде записать в буфер данные и разрешить прерывание. Всё остальное делается в прерывании.

Пинать NVIC не пробовал. При случае попробую. Хотя это чревато лишними вызовами прерываний.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Sep 30 2013, 07:01
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(jcxz @ Sep 28 2013, 15:34) *
Возможно товарищи по каким-то причинам (религиозным?) очень хотят писать в FIFO именно из ISR. Непреодолимое желание сиё понять трудно... twak.gif
Но, коли так уж хочется, после разрешения empty-tx IRQ можно программно возбудить прерывание при помощи NVIC.


про первичное наполнение FIFO из ISR это можно охарактеризовать как странность восприятия мира
но "докладка" в процессе передачи - вполне обыденное действие.

К примеру на RTOS: задача utx_task принимает от других задач task0, taskN то что нужно передать.
тогда есть два варианта разруливания:
#1
utx_task заполняет FIFO и размещает в глобальной переменной ptr и len чего еще не успело передать и ожидает события завершения ВСЕЙ передачи
в прерывании после опустошения FIFO передачи проверяется len и если != 0 то в ISR досылаем в FIFO иначе выставляем признак события чтобы разбудить utx_task задачу для повторения всех циклов

#2
utx_task заполняет FIFO и ожидает события завершения передачи FIFO
в прерывании после опустошения FIFO выставляем признак события чтобы разбудить utx_task задачу для повторения заполнения FIFO и так по кругу

вроде одинаковый результат, но сдается мне что во втором случае будет чаще дергатся шедуллер

Цитата(Terminator @ Sep 28 2013, 08:52) *
это всё конечно красиво, но попробуйте сделать вывод в отладочный порт из разных задач.
Останавливать задачу ради вывода отладки нельзя, что влезло в буфер, то влезло.
Заводить отдельную задачу для слежения за заполненостью буфера, очень не хочется.
Запрещать прерывания перед каждым обращением в uart тоже (тут я конечно несколько лукавлю, т.к. при складывании в буфер прерывания всё равно запрещаются).


тут только отдельная задача, которая:
1. для синхронной отправки ( блокирующая задача ) - выставляет семафор/событие для блокировки текущей задачи
2. для ассинхронной отправки ( неблокирующая задача ) отправка буфера из кучи - сохраняет в своей очереди ptr и len что передать, и по завершению FREE
3. для ассинхронной отправки ( неблокирующая задача ) отправка из стека - свой MALLOC и MEMCPY и предыдущий вариант 2
4. для ассинхронной отправки ( неблокирующая задача ) отправка из const и CODEMEM/FLASH - вариант 2 без FREE


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Terminator
сообщение Sep 30 2013, 10:34
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Отправка выглядела примерно так: уарт не занят, разрешаем прерывание tx_empty, пихаем в фифо первый(или заполняем всё fifo) байт посылки, остальное в очередь которую проверит isr. Если уарт занят, то пихаем всё в очередь.
В моём случае заморочка была в том что прерывание tx_empty бывало, что не срабатывало.
Перебрал кучу вариантов, всё равно случались пропуски. Стабильно заработало когда завёл dma на передачу.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 30 2013, 20:39
Сообщение #22


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



По поводу докладывания FIFO 16-тью элементами. Цитата из UM10360 (LPC17xx user manual)
Цитата
4.14 UARTn FIFO Level register (U0FIFOLVL - 0x4000 C058, U2FIFOLVL - 0x4009 8058, U3FIFOLVL - 0x4009 C058)

UnFIFOLVL register is a read-only register that allows software to read the current FIFO
level status. Both the transmit and receive FIFO levels are present in this register.

Так что можно докладывать не заходя в прерывание. Точнее, не дожидаясь полного освобождения Tx FIFO.

Жаль, во многих других процах нет этого регистра.

Сообщение отредактировал GetSmart - Sep 30 2013, 20:43


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 1 2013, 03:09
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Terminator @ Sep 30 2013, 16:34) *
Отправка выглядела примерно так: уарт не занят, разрешаем прерывание tx_empty, пихаем в фифо первый(или заполняем всё fifo) байт посылки, остальное в очередь которую проверит isr. Если уарт занят, то пихаем всё в очередь.
В моём случае заморочка была в том что прерывание tx_empty бывало, что не срабатывало.

Что-то вы криво делали - у меня стабильно работает всегда.
Например - после разрешения tx_empty и перед пиханием в буфер, вы не забывали запрещать прерывания? sm.gif
К тому же - по вашему алгоритму придётся запрет прерывания продлить до конца пихания в очередь всех данных.
Логичнее делать по-другому:
В задаче пишем всё в очередь (с разрешёнными прерываниями). После писания - проверим разрешено-ли прерывание UART (ну или программного флага, если в ISR не запрещаем IRQ TX_EMPTY при опустошении, а просто игнорим его), если запрещено - запрещаем прерывания CPU, вызываем функцию переписывающую из очереди в TX FIFO (эту же функцию вызываем из ISR при TX_EMPTY).
Внутри этой функции, если в очереди имеется хотя-бы один байт - она разрешает прерывания TX_EMPTY (ставит программный флаг), заполняет FIFO из очереди. Если на входе в функцию очередь пуста, она запрещает TX_EMPTY (сбрасывает программный флаг).
Если всё реализуете аккуратно, в том числе очередь - реерентерабельную для перекрывающихся чтений/записей, то всё будет работать как часы.
Go to the top of the page
 
+Quote Post
Grape
сообщение Oct 1 2013, 10:02
Сообщение #24


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



Цитата(GetSmart @ Oct 1 2013, 00:39) *
По поводу докладывания FIFO 16-тью элементами. Цитата из UM10360 (LPC17xx user manual)

Так что можно докладывать не заходя в прерывание. Точнее, не дожидаясь полного освобождения Tx FIFO.

Жаль, во многих других процах нет этого регистра.


UM10360, rev2, 20100819

Modifications:
• UART0/1/2/3: FIFOLVL register removed.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 4 2014, 05:29
Сообщение #25


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Grape @ Oct 1 2013, 16:02) *
UM10360, rev2, 20100819

Modifications:
• UART0/1/2/3: FIFOLVL register removed.

Removed from document or removed from new revision chip?

Читая мануал на LPC122x этот регистр снова присутствует. Разработчики развлекаются или мануальщики...


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Jan 30 2015, 09:10
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Люди, идиотский вопрос. Столкнулся тоже с этим ньюансом про прерывание при опустошении FIFO и подумал, если такие хлопоты, то почему бы просто не запретить аппаратные FIFO в регистре UART1 FIFO Control Register. И тогда прерывание по THRE будет происходить при отправке каждого байта. И тогда кольцевые буфферы без всяких нарезаний по 16 байт можно поместить в прерывание по отправке. Это будет работать и чем это плохо?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 30 2015, 09:46
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



отсутствием FIFO, например.... тем что нельзя пихнуть 16 байт и делать свои дела пока их выдавливает, а надо постоянно отвлекаться и по байту класть. А если у вас ModBus с условием определения конца по паузе между байтами посылки?
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Jan 30 2015, 10:08
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(Golikov A. @ Jan 30 2015, 14:46) *
отсутствием FIFO, например.... тем что нельзя пихнуть 16 байт и делать свои дела пока их выдавливает, а надо постоянно отвлекаться и по байту класть. А если у вас ModBus с условием определения конца по паузе между байтами посылки?


Да, но так ли это заметно, если процессор работает на частоте под 100 MГц. Ему переложить из регистра в регистр что из fifo, что вручную велика ли разница?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 30 2015, 10:21
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Велика, если есть критические секции в которых у вас может быть запрещено прерывание, или есть какое-то более приоритетное прерывание.
Если класть по символу у вас есть время 1 символ, если класть по фифо, то задержка может быть до 16 символов

Это все удобства.
У СТМ вот к примеру нет фифо ни на входе ни на выходе. Иногда это неудобно, иногда ДМА решает все проблемы. Но в целом наличие фифо все же благо, и просто от него отказываться я бы не стал
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jan 30 2015, 10:22
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(yanvasiij @ Jan 30 2015, 13:08) *
Да, но так ли это заметно, если процессор работает на частоте под 100 MГц. Ему переложить из регистра в регистр что из fifo, что вручную велика ли разница?

Если ничего не нужно делать в процессе отправки, то почему бы и нет. Только как правило позже выясняется что что-то делать нужно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:24
Рейтинг@Mail.ru


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