|
Нужны ли вложенные прерывания? |
|
|
|
Jul 31 2009, 22:27
|
Местный
  
Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686

|
Цитата(aaarrr @ Aug 1 2009, 02:05)  ИМХО, шина I2C вообще не предполагает работу с жесткими привязками ко времени. Шина - да, а вот получаемые/принимаемые данные очень сильно привязаны Цитата Нельзя просто запустить передачу по прерыванию от таймера и продолжить на прерываниях I2C? Как вариант - можно. Тогда в моём случае надо будет передать алгоритму старта работы с I2C указатель на функцию, которую следует вызвать по окончании цикла обмена с девайсом. Подумаю, может, так и сделаю.
|
|
|
|
|
Aug 1 2009, 09:36
|
Местный
  
Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686

|
Цитата(defunct @ Aug 1 2009, 03:55)  Так отвяжите. Банально добавьте в I2C пакет метку времени. Собственно, эту метку времени и нужно считать из девайса для синхронизации времени на мастере с точностью до 2-5мс
|
|
|
|
|
Aug 1 2009, 14:38
|
Частый гость
 
Группа: Участник
Сообщений: 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.
|
|
|
|
|
Aug 1 2009, 15:45
|
Местный
  
Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686

|
Цитата(smac @ Aug 1 2009, 18:38)  Я бы применил следующий ход... Да, тоже думал об этом. Как ближайший вариант реализации учту. Спасибо.
|
|
|
|
|
Aug 1 2009, 23:56
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

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

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

|
А зачем такиие сложности с вложенным прерыванем? Таймерное прерывание делает свое грязное дело - инкрементирует/декрементирует счетчики, а после этого выставляет флажки для функций вызываемых по этому прерыванию. В главном цикле проверяется эти флажки, и по их наличию запускается I2C и/или любая другая interrupt driven передача. Таким образом таймерное прерыване удлинняется на пару тройку машиинных команд, а не на ожданиие окончание цикла обмена по шине. Вот здесь про такой подод подробнее http://tldp.org/LDP/lkmpg/2.4/html/x1210.html
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Aug 3 2009, 06:02
|
Частый гость
 
Группа: Участник
Сообщений: 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Байт. Чего-то как-то туманно :-) Нельзя ли поподробнее?
|
|
|
|
|
Aug 3 2009, 12:57
|
Частый гость
 
Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406

|
Цитата(Altemir @ Aug 3 2009, 15:00)  Ещё одна особенность - синхронизация времени должна была проходить ВНУТРИ прерывания, чтобы ни одна из процедур основного кода не получила расходящиеся значения времени. В готовый код потребовалось добавить всего 8 строчек кода. Хрень какая-то... Может объясните, что Вы хотели сказать этой фразой.
--------------------
Hemos Pasado
|
|
|
|
|
Aug 4 2009, 03:54
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870

|
Цитата(Troll @ Aug 3 2009, 16:57)  Хрень какая-то... Может объясните, что Вы хотели сказать этой фразой. Да темнит что-то человече... Сам себя перемудрил.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|