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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Нужны ли вложенные прерывания?
Altemir
сообщение Jul 31 2009, 21:45
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Уважаемые, подскажите, пожалуйста.

Проц LPC2214. Есть задача по прерыванию таймера сразу же производить чтение по I2C с девайса. Алгоритм работы по I2C сделан тоже на прерываниях. Необходима синхронность чтения данных с таймером. Следует ли в данном случае использовать вложенные прерывания или можно каким-то образом обойти? Переделать работу с I2C без прерываний? Объём записывемых/считываемых данных из девайса не более 20Байт.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2009, 22:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



ИМХО, шина I2C вообще не предполагает работу с жесткими привязками ко времени.

И зачем вложенные прерывания? Нельзя просто запустить передачу по прерыванию от таймера и продолжить на прерываниях I2C?
Go to the top of the page
 
+Quote Post
Altemir
сообщение Jul 31 2009, 22:27
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Цитата(aaarrr @ Aug 1 2009, 02:05) *
ИМХО, шина I2C вообще не предполагает работу с жесткими привязками ко времени.

Шина - да, а вот получаемые/принимаемые данные очень сильно привязаны

Цитата
Нельзя просто запустить передачу по прерыванию от таймера и продолжить на прерываниях I2C?

Как вариант - можно. Тогда в моём случае надо будет передать алгоритму старта работы с I2C указатель на функцию, которую следует вызвать по окончании цикла обмена с девайсом. Подумаю, может, так и сделаю.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 31 2009, 23:55
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Altemir @ Aug 1 2009, 01:27) *
Шина - да, а вот получаемые/принимаемые данные очень сильно привязаны

Так отвяжите. Банально добавьте в I2C пакет метку времени.
Go to the top of the page
 
+Quote Post
Altemir
сообщение Aug 1 2009, 09:36
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Цитата(defunct @ Aug 1 2009, 03:55) *
Так отвяжите. Банально добавьте в I2C пакет метку времени.

Собственно, эту метку времени и нужно считать из девайса для синхронизации времени на мастере с точностью до 2-5мс
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Aug 1 2009, 12:44
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268



Ответ таков: если вы не планируете выйти из обработчика таймера, пока не закончите обмен по шине I2C, то вам действительно будут нужны вложенные прерывания, но как раз не для I2C, а для остальной периферии. Что касается I2C, то я бы прерывания делать не стал без явной необходимости - архитектурно программный модуль I2C получается проще, надёжнее и портабельнее (т.е. этот модуль можно удобно использовать для других проектов), когда регистры опрашиваются в цикле. Но это при условии, что ядру в этот момент совсем делать нечего.
Go to the top of the page
 
+Quote Post
smac
сообщение Aug 1 2009, 14:38
Сообщение #7


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

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



Цитата(Altemir @ Aug 1 2009, 13:36) *
Собственно, эту метку времени и нужно считать из девайса для синхронизации времени на мастере с точностью до 2-5мс

Я бы применил следующий ход
0. Организовал бы системные часы на каком-либо таймере с тиком 200 - 500 мкс.
1. При приеме пакета I2C брал бы временнУю метку этого события Ti2c.
2. При входе в процедуру синхронизации также брал бы временнУю метку Tsynchro.
3. Имея метки Ti2c и Tsynchro, а также время time, пришедшее в пакете I2C подстраивал бы часы (local_time) так: local_time = time + (Tsyncro - Ti2c). Естественно предполагается, что синхронизация локальных часов происходить после приема данных о времени по i2c.
Go to the top of the page
 
+Quote Post
Altemir
сообщение Aug 1 2009, 15:45
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Цитата(smac @ Aug 1 2009, 18:38) *
Я бы применил следующий ход...

Да, тоже думал об этом. Как ближайший вариант реализации учту. Спасибо.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 1 2009, 23:25
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Altemir @ Aug 1 2009, 18:45) *
Да, тоже думал об этом. Как ближайший вариант реализации учту. Спасибо.

Почитайте про RTCP. реализовывать весь нет смысла конечно, но вот оценка inter-arrival jitter'a и transit delay'я оттуда вам пригодится.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 1 2009, 23:56
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(IgorMarx @ Aug 1 2009, 16:44) *
Что касается I2C, то я бы прерывания делать не стал без явной необходимости - архитектурно программный модуль I2C получается проще, надёжнее и портабельнее (т.е. этот модуль можно удобно использовать для других проектов), когда регистры опрашиваются в цикле. Но это при условии, что ядру в этот момент совсем делать нечего.
Ерунду Вы пишете полную...
Если Вашему процу делать нечего настолько что Вы готовы сидеть в цикле и опрашивать - Вы выбрали не тот проц...
I2C это самый типичный пример для interrupt driven transfer...
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Aug 2 2009, 07:01
Сообщение #11


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



А зачем такиие сложности с вложенным прерыванем?
Таймерное прерывание делает свое грязное дело - инкрементирует/декрементирует счетчики, а после этого выставляет флажки для функций вызываемых по этому прерыванию.
В главном цикле проверяется эти флажки, и по их наличию запускается I2C и/или любая другая interrupt driven передача.
Таким образом таймерное прерыване удлинняется на пару тройку машиинных команд, а не на ожданиие окончание цикла обмена по шине.

Вот здесь про такой подод подробнее http://tldp.org/LDP/lkmpg/2.4/html/x1210.html


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение Aug 3 2009, 06:02
Сообщение #12


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

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



Цитата(IgorMarx @ Aug 1 2009, 16:44) *
Ответ таков: если вы не планируете выйти из обработчика таймера, пока не закончите обмен по шине I2C, то вам действительно будут нужны вложенные прерывания, но как раз не для I2C, а для остальной периферии. Что касается I2C, то я бы прерывания делать не стал без явной необходимости - архитектурно программный модуль I2C получается проще, надёжнее и портабельнее (т.е. этот модуль можно удобно использовать для других проектов), когда регистры опрашиваются в цикле. Но это при условии, что ядру в этот момент совсем делать нечего.

Это как это не планируете выйти из обработчика прерывания????
Зашел в прерывание таймера и сидишь там пока И2С ковыряет там байтики?
Странно как-то.


Цитата(Altemir @ Aug 1 2009, 01:45) *
Уважаемые, подскажите, пожалуйста.

Проц LPC2214. Есть задача по прерыванию таймера сразу же производить чтение по I2C с девайса. Алгоритм работы по I2C сделан тоже на прерываниях. Необходима синхронность чтения данных с таймером. Следует ли в данном случае использовать вложенные прерывания или можно каким-то образом обойти? Переделать работу с I2C без прерываний? Объём записывемых/считываемых данных из девайса не более 20Байт.

Чего-то как-то туманно :-)
Нельзя ли поподробнее?
Go to the top of the page
 
+Quote Post
Altemir
сообщение Aug 3 2009, 11:00
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Всем спасибо за предложения. Всё сделал, проверил, работает как надо.
Необходимо было с внешнего девайса получать периодически синхронизацию времени (сек и мс) с точностью +-2..5мс.
Сделал просто: по прерыванию 1мс таймера инкрементировал локальный счётчик мс, при равенстве его 1000, сбрасывал и вызывал процедуру чтения/синхронизации времени и коррекции этого мс счётчика. Процедуру чтения по I2C из внешнего девайса сделал по поллингу I2CONSET_SI. Ещё одна особенность - синхронизация времени должна была проходить ВНУТРИ прерывания, чтобы ни одна из процедур основного кода не получила расходящиеся значения времени. В готовый код потребовалось добавить всего 8 строчек кода.
Go to the top of the page
 
+Quote Post
Troll
сообщение Aug 3 2009, 12:57
Сообщение #14


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

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Цитата(Altemir @ Aug 3 2009, 15:00) *
Ещё одна особенность - синхронизация времени должна была проходить ВНУТРИ прерывания, чтобы ни одна из процедур основного кода не получила расходящиеся значения времени. В готовый код потребовалось добавить всего 8 строчек кода.

Хрень какая-то...
Может объясните, что Вы хотели сказать этой фразой.


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение Aug 4 2009, 03:54
Сообщение #15


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

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



Цитата(Troll @ Aug 3 2009, 16:57) *
Хрень какая-то...
Может объясните, что Вы хотели сказать этой фразой.

Да темнит что-то человече... Сам себя перемудрил.
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 Текстовая версия Сейчас: 18th July 2025 - 08:56
Рейтинг@Mail.ru


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