Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка прерываний и тайминг в 5мс
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
cz_nikita
Никак не могу найти литературы и пример обработки прерываний для Соrtex-M3.
Задача такова: по USART приходят данные и нужно выдавать АСК в течении 5мс.
SeriouSerg
Цитата(cz_nikita @ Nov 29 2008, 15:29) *
Никак не могу найти литературы и пример обработки прерываний для Соrtex-M3.
Задача такова: по USART приходят данные и нужно выдавать АСК в течении 5мс.


А какой у Вас кристалл? Если STM32, то скачайте с офсайта библиотеку, там будут примеры.
По личному опыту рекомендую настроить DMA делать анализ приемного буфера на предмет принятых данных в течение 5 мс и выдавать акноледж. У меня подобная задача была реализована. С прерываниями на STM32 веселье начинается, особенно если использовать глючный Keil.
Alex B._
Цитата(SeriouSerg @ Dec 1 2008, 03:08) *
С прерываниями на STM32 веселье начинается, особенно если использовать глючный Keil.

это вы, кажется, сказали не подумав
Dog Pawlowa
Цитата(SeriouSerg @ Dec 1 2008, 04:08) *
рекомендую настроить DMA делать анализ приемного буфера на предмет принятых данных в течение 5 мс и выдавать акноледж.

Скорее же разъясните, как можно настоить DMA что-то анализировать, а то мой моск взорвется! sad.gif
Sanek_spb
Цитата(cz_nikita @ Nov 29 2008, 15:29) *
Никак не могу найти литературы и пример обработки прерываний для Соrtex-M3.
Задача такова: по USART приходят данные и нужно выдавать АСК в течении 5мс.


Как раз сейчас мучаю кортекс, Вы бы сказали что за мк, на какой частоте проц, на какой уарт и какой поток данных, может и идейку бы подкинули.

Но по любому несколько простых путей:
1. данные приходят медленно: каждый байтик обрабатываете, как придет последний, выдавай АК
2. данные приходят быстро:
2.1. буферизуете полностью (например в прерывании) и по последнему байтику обрабатываете и выдаете АК
2.2. кольцевой буфер - по приходу даных кидаете в буфер (в прерывании например), по возможности обрабатываете (в главном цикле), последний байт -> АК
2.3. настраиваете ДМА, по окончании приема приходит прерывание -> обрабатываете и выдаете АК

Соотв. проблема сводится к вопросу успеете ли обработать свои данные, а уже основываясь на ответе выбираете себе вариант.
cz_nikita
Цитата(Sanek_spb @ Dec 1 2008, 15:58) *
Как раз сейчас мучаю кортекс, Вы бы сказали что за мк, на какой частоте проц, на какой уарт и какой поток данных, может и идейку бы подкинули.

Но по любому несколько простых путей:
1. данные приходят медленно: каждый байтик обрабатываете, как придет последний, выдавай АК
2. данные приходят быстро:
2.1. буферизуете полностью (например в прерывании) и по последнему байтику обрабатываете и выдаете АК
2.2. кольцевой буфер - по приходу даных кидаете в буфер (в прерывании например), по возможности обрабатываете (в главном цикле), последний байт -> АК
2.3. настраиваете ДМА, по окончании приема приходит прерывание -> обрабатываете и выдаете АК

С МК раньше работать не доводилось, но задачу нужно решать...
Модель: STM32F103CBT6. Задача: прокачка данных с одного УАРТ на другой УАРТ (преобразование с одного протокола в другой).
Сегодня выяснил, что эта самая прокачка очень сильно глючит (потеря данных и т.д.).
УАРТ1 работает на скорости 9600, УАРТ2 на скорости 115200.
Сейчас реализовано так: находясь в прерывании УАРТ1 делается посылка данных на УАРТ2, и наборот соответсвенно: находясь в прерывании УАРТ2 делается посылка данных на УАРТ1.
Но как подсказывает логика: если у нас существует два интерфейса с разными скоростями, то между ними должен быть "выравнивающий" буфер.
Т.е. УАРТ1 кидает данные в очередь, в майне читаем наш буфер, анализируем, и отсылаем на УАРТ2. Также с УАРТ2 кидаем в очередь, в майне читаем, анализируем, и отсылаем на УАРТ1.

ЗЫ: Хотелось бы услышать комментарии от гуру, правильный ли путь выбран с буферизацией данных?
koyodza
Цитата(cz_nikita @ Dec 1 2008, 23:03) *
Сейчас реализовано так: находясь в прерывании УАРТ1 делается посылка данных на УАРТ2, и наборот соответсвенно: находясь в прерывании УАРТ2 делается посылка данных на УАРТ1.

Вот так как раз делать не следует.

Цитата(cz_nikita @ Dec 1 2008, 23:03) *
Но как подсказывает логика: если у нас существует два интерфейса с разными скоростями, то между ними должен быть "выравнивающий" буфер.
Т.е. УАРТ1 кидает данные в очередь, в майне читаем наш буфер, анализируем, и отсылаем на УАРТ2. Также с УАРТ2 кидаем в очередь, в майне читаем, анализируем, и отсылаем на УАРТ1.

Да, в общих чертах правильно. Только желательно учитывать особенности протокола, а то, например, при подаче запроса через "быстрый" порт к устройству, подключенному к "медленному" порту, пославший запрос может просто не дождаться ответа. Или другой вариант: на "быстром" порту висит устройство, которое может отправлять довольно длинные пакеты (или вообще лить данные потоком). И вот от этих особенностей будет сильно зависеть и реализация Вашего моста.

Да, в STM32 очень хорошо DMA использовать (если получится - я тут нарвался по невнимательности wacko.gif на невозможность одновременной работы USART1 и SPI2 через DMA), фактически вы получаете фифо произвольного размера, да еще и данные сразу окажутся там где надо. Метод работы по прерываниям по каждому байту довольно неэффективен.
defunct
Цитата(koyodza @ Dec 10 2008, 23:20) *
Метод работы по прерываниям по каждому байту довольно неэффективен.

Смотря для чего.
Если идет "поток в потоке" (Escaped последовательность, или програмный контроль потока XON/XOFF), то побайтовая обработка будет наиболее эффективной как по быстродейтсвию так и по расходу памяти. Кстати второе - эффективность по расходу памяти - для побайтовой обработки всегда TRUE.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.