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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Проблема LPC2214 UART+T0 IRQ
Сергей Борщ
сообщение Nov 24 2006, 16:59
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(bombastic @ Nov 24 2006, 13:56) *
Цитата(dmyl @ Nov 22 2006, 11:44) *

Если точка останова на irq_handler то постоянно вылезают DummyInterrupt.

У меня такая же фигня, это наверно то что описано в SPURIOUS INTERRUPTS blink.gif
Попробуйте в окне регистров выбрать что-нибудь отличное от VIC. Или в .ddf уберите из описания этого окна VicVectAddr. Дело в том что чтение этого регистра (отладчиком) дает сигнал к загрузке в него след. значения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2006, 17:18
Сообщение #17


Гуру
******

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



Цитата(dmyl @ Nov 24 2006, 14:55) *
Если вы всетаки взгляните на код в начале ветки, то увидите что прерывание на контроллере сбрасывалось

Виноват :-(, хотя лишнего там много, отформатировать не сочли нужным и код с разными 0x01 вместо поименованных констант тоже не способствует желанию читать.
Посмотрел. Все вышесказанное относится и к парочке IIR RBR. Вычитывание FIFO c отражением сего факта в LSR
не должно приводить с сбросу запроса прерывания равно как и сброс прерывания не должен приводить :-) к сбросу содержимого FIFO
Для полного счастья нужно и вычитать FIFO и считать IIR. Операции отдельные ибо я имею право читать FIFO когда и где мне заблагорассудится и это не должно приводить к "ичезновению" флага причины прерывния в IIR наоборот - считать IIR и решив, что мне сейчас не до этого - уйти не вычитывая FIFO.

Сие абослютно логично и описано в документации.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dmyl
сообщение Nov 24 2006, 20:26
Сообщение #18


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

Группа: Свой
Сообщений: 123
Регистрация: 11-01-06
Пользователь №: 13 032



Цитата(zltigo @ Nov 24 2006, 18:18) *
Для полного счастья нужно и вычитать FIFO и считать IIR.
....
Сие абослютно логично и описано в документации.

Простите, но смотрю в таблицу #81 UART0 Interrupt Handling мануала по 2214, нахожу нужные мне две строчки для IIR=0100 и 1100 (данные доступны и таймаут по приему), смотрю на заветную колонку INTERRUPT RESET, там черным по англицки написано U0RBR READ, и ни слова что нужно читать IIR. А выходит что не читая IIR а обходясь только LSR и RBR прерывание не сбрасывается, в докции в самом начале описания обработки прерывания прямо в тексте мелким шрифтом есть что-то похожее на то что надо IIR всеже надо прочитать до выхода из обработчика.

А насчет дефайнов - сорри, я код причесывал специально чтобы поменьше в ветку вываливать текста, кроме того я тег не поставил чтобы форматироание сохранилось smile.gif все время забываю какой он.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2006, 21:33
Сообщение #19


Гуру
******

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



Цитата(dmyl @ Nov 24 2006, 19:26) *
...там черным по англицки написано U0RBR READ, и ни слова что нужно читать IIR.
А выходит что не читая IIR а обходясь только LSR и RBR прерывание не сбрасывается,
в докции в самом начале описания обработки прерывания прямо в тексте мелким шрифтом есть что-то похожее на то что надо IIR всеже надо прочитать до выхода из обработчика.

Да нормальный там шрифт :-) и написано вполне "в лоб":
Код
Interrupts are handled as described in Table 9–105. Given the status of U0IIR[3:0], an
interrupt handler routine can determine the cause of the interrupt and how to clear the
active interrupt. The U0IIR must be read in order to clear the interrupt prior to exiting the
Interrupt Service Routine.

Ну а самое главное, к чему я собственно "привязался" это то, что такое поведение является правильным, логичным и привычным для железок которые позволяют реализовывать идеи "посложнее".

Еще результаты чтения:
Выкинуть промежуточный/первичный обработчик прерывания за полной его ненадобностью.
Ну и размещения кода в RAM не слишком уж ускоряет - MAM у LPC неплохой, зато чрезмерное увлечение подпрограммами уж точно тормозит.



Цитата(aaarrr @ Nov 23 2006, 11:46) *
По-моему, описанная проблема - не вызывается обработчик прерывания - очень плохо вяжется с "проблемами со стеком".

Прочитайте - там не "не вызывается" там:
Цитата
Через какое-то время перестают вызываться обработчики прерываний,

И я говорил о статистике, голой статистике - ввиду отсутствия информации к размышлению.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dmyl
сообщение Nov 25 2006, 10:23
Сообщение #20


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

Группа: Свой
Сообщений: 123
Регистрация: 11-01-06
Пользователь №: 13 032



Цитата(zltigo @ Nov 24 2006, 22:33) *
Еще результаты чтения:
Выкинуть промежуточный/первичный обработчик прерывания за полной его ненадобностью.

Это понятно, но ресурсов хватает выше крыши, а так СИ код прозрачен и понятен, врубать же ассемблерные куски лишние хлопоты. Я когда то давно спрашивал как это можно изящно изобразить на СИ, других вариантов не подсказали.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2006, 11:58
Сообщение #21


Гуру
******

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



Цитата(dmyl @ Nov 25 2006, 09:23) *
Это понятно, но ресурсов хватает выше крыши, а так СИ код прозрачен и понятен, врубать же ассемблерные куски лишние хлопоты.

A Вы свой cstartup.s79 тоже для ясности на "C" :-). Так вот - замените там одну "непонятную" строчку на другую и все.
Цитата
Я когда то давно спрашивал как это можно изящно изобразить на СИ, других вариантов не подсказали.

Даже на "C" изящность уж приведенный в первом посте код не тянет уж совсем :-(. Не говоря уже о соревновании в изяществе с ОДНОЙ строчкой на ASM.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dmyl
сообщение Nov 25 2006, 14:03
Сообщение #22


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

Группа: Свой
Сообщений: 123
Регистрация: 11-01-06
Пользователь №: 13 032



Цитата(zltigo @ Nov 25 2006, 12:58) *
Так вот - замените там одну "непонятную" строчку на другую и все.

А как выковырнуть из проекта "свой" стартап?
Со стартапом из ../lib естественно не прокатывает, там не стартап а сплошной комментарий.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2006, 15:57
Сообщение #23


Гуру
******

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



Цитата(dmyl @ Nov 25 2006, 13:03) *
Со стартапом из ../lib естественно не прокатывает, там не стартап а сплошной комментарий.

Не "выковырнуть" а положить свой, сделанный, из того-же самого библиотечного. Благо комментариев там много :-).
Если "мало" - в приложении моя болванка. Посеченная до почти полного минимализма - самое то для начала.

Сообщение отредактировал zltigo - Nov 25 2006, 18:56
Прикрепленные файлы
Прикрепленный файл  CSTARTUP.rar ( 1.46 килобайт ) Кол-во скачиваний: 49
 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dmyl
сообщение Nov 25 2006, 18:02
Сообщение #24


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

Группа: Свой
Сообщений: 123
Регистрация: 11-01-06
Пользователь №: 13 032



Цитата(zltigo @ Nov 25 2006, 16:57) *
Если "мало" - в приложении моя болванка. Посеченная до почти полного минимализма - самое то для начала.

В каком приложении?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2006, 18:54
Сообщение #25


Гуру
******

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



Цитата(dmyl @ Nov 25 2006, 17:02) *
В каком приложении?

Отвлекся :-(. Добавлено.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Nov 27 2006, 10:07
Сообщение #26


Местный
***

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



Цитата(zltigo @ Nov 22 2006, 20:39) *
Цитата(Alex03 @ Nov 22 2006, 13:32) *

А почемуб по честному не читать IRR и в соответствии с причиной прерывания действовать, дабы это прерывание сбрасывалось.

Это не честнее, это просто еще более громоздко. Нормальный подход это ОДНА команда:

Код
                ldr     pc,[pc,#-0xFF0]    ; 18 Jump directly to the address given by the AIC
                                              ; from [0xFFFFF020] Curent 18h +8(conveyer)=20h



А всётаки IRR в обработчике прерывания UART читать надо smile.gif
А если прерывания все кроме приёма отключены, это не значит что не надо обрабатывать другие ситуации типа RX Line status Error, что кстати тоже зачастую лучше далать в прерывании.

Ну а про общий обработчик IRQ прерывания, тут уж что кому нравится
Стартап CW автоматом генерит
Код
ldr     pc,[pc,#-0xFF0]

если определён VECTORED_IRQ_INTERRUPTS (и я этим пользуюсь).
Но тут надо помнить что запись в VICVectAddr нужна в каждом обработчике.

Но и общий обработчик IRQ в ряде случаев полезен, например в ОС-ах и т.д., проблема у автора треда не в нём была. smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 27 2006, 11:39
Сообщение #27


Гуру
******

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



Цитата(Alex03 @ Nov 27 2006, 09:07) *
А всётаки IRR в обработчике прерывания UART читать надо smile.gif

Я утверждал обратное про обработчик прерывания UART а не про общий обработчик???
Цитата
А если прерывания все кроме приёма отключены, это не значит что не надо обрабатывать другие ситуации типа RX Line status Error, что кстати тоже зачастую лучше далать в прерывании.

А вот если 'отключены', то в IIR (полагаю речь идет о нем а не о каком-то IRR) их не будет и быть не
может.
Цитата
Но тут надо помнить что запись в VICVectAddr нужна в каждом обработчике.

Жуткий напряг и нагрузка на память программиста :-)
Цитата
Но и общий обработчик IRQ в ряде случаев полезен, например в ОС-ах и т.д.,

А вот с этого места, пожалуйста поподробнее. Очень люблю про OSы думать. Заинтриговали.
Цитата
проблема у автора треда не в нём была. smile.gif

А я сие и не утверждал - речь была просто о уменьшении количества выставленного на обозрение кода.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Nov 27 2006, 15:26
Сообщение #28


Местный
***

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



Цитата(zltigo @ Nov 27 2006, 13:39) *
Цитата

Но и общий обработчик IRQ в ряде случаев полезен, например в ОС-ах и т.д.,

А вот с этого места, пожалуйста поподробнее. Очень люблю про OSы думать. Заинтриговали.


Если Вам надо выполнять одно и то-же действие перед и/или после любого из прерываний.
Например:
- Подсчёт статистики, такой как кол-во прерываний, систем_тайм/юзер_тайм и т.д.
- Переключение задач по соответствующим условиям, как то с низкоприоритетной прерванной задачи, на более (сильно/реалтайм) приоритетную, которая была выведена из спячки текущим прерыванием.
- Разрешение вложенных прерываний, опять же в соответствии с заданной в ОС логикой.

Также в ОС-ах бывает вызов нескольких зерегестрированных обработчиков по списку, как пример, в PC архитектуре когда на одном физическом прерывании может несколько девайсов висеть, и когда драйвера, а с ними и обработчики прерываний, являются динамически загружаемыми/выгружаемыми модулями.

Ну и как доп. уровень абстракции когда писатель драйвера конкретной железки, не занимается программированием MMU или там контроллера прерываний (как то запись в VICVectAddr smile.gif ), а использует допустимые (документированные) для данной ОС механизмы.

и т.д. зависит от ОС, от архитектуры и прочего.
Чем навороченнее ОС тем больше вариантов.
Я ОС-ем пока не писал. smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 27 2006, 19:23
Сообщение #29


Гуру
******

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



Цитата(Alex03 @ Nov 27 2006, 14:26) *
Если Вам надо выполнять одно и то-же действие перед и/или после любого из прерываний.

Хорошо, посмотрим, что предлагается:
Цитата
- Подсчёт статистики, такой как кол-во прерываний,

Сильно. Просто общее количество прерываний и за каждое обработанное прерывание брать денюжку :-), хотя опять некоторые сложно обрабатывать а некоторве попроще. Тогда надо считать их отдельно, тогда зачем общий обработчик?
Цитата
систем_тайм/юзер_тайм и т.д.

А это уже конкретные обработчики, ну право-же не считать-же системное время по сумме прерываний от таймера, мышки и клавиатуры.
Цитата
- Переключение задач по соответствующим условиям, как то с низкоприоритетной прерванной задачи, на более (сильно/реалтайм) приоритетную, которая была выведена из спячки текущим прерыванием.

Действия понятны, но с этим разбирается система а не какой-то универсальный пролог/эпилог ко всем прерываниям.
Цитата
- Разрешение вложенных прерываний, опять же в соответствии с заданной в ОС логикой.

Разрешение вложенных прерываний огульно любого в любом. Выделение, например стека, неведомого размера (или наоборот не выделение) под вложенное. Причем до того, когда когда управление
получит обработчик конкретного прерывания или таже OS. При этом не запущенный обработчик
прерывания той-же OS как-то "задает логику"? Вот когда он получит управление он и будет "задавать логику" и именно он а не прокладка перед ним.
Цитата
в PC архитектуре когда на одном физическом прерывании может несколько девайсов висеть

Это к архитектуре никакого отнощения не имеет, у меня вот прямо сейчас перед носом 16 на одном
прерывании висят. И разбирается кто вылез обработчик конкретного прерывания, который знает
как разобраться "кто сказал Гав" а не некая абстрактная прокладка для всех прерываний вместе взятых.
Цитата
и когда драйвера, а с ними и обработчики прерываний, являются динамически загружаемыми/выгружаемыми модулями.

Сильно. Т.е. девайса нет (не вставили), драйвера нет(не загрузили) а обработчик прерывания - вот он уже есть и готов работать с неведомым ему железом на неведомом прерывании.
Цитата
Ну и как доп. уровень абстракции когда писатель драйвера конкретной железки, не занимается программированием MMU или там контроллера прерываний (как то запись в VICVectAddr smile.gif ), а использует допустимые (документированные) для данной ОС механизмы.

Живые примеры вышеописанного "ненавязчивого сервиса" имеют место быть, только зачем для этого обязательно иметь некую абстрактную прокладку перед или после собственно обработчика прерывания, который будет писать писатель драйвера?
Цитата
Чем навороченнее ОС тем больше вариантов.

Навернуть можно много чего, вопрос зачем?
Конкретный пример наворота присутствовал в первом примере с которого топик начался. Наворот виден и кушает такты. Польза от наворота? Не писать в каждом обработчике в VICVectAddr? А если я, простите
захочу разрешить в одном (только упаси боже не во всех зараз) обработчике вложенные прерывания?
Нафига мне тогда такой сервис?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Nov 28 2006, 12:31
Сообщение #30


Местный
***

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



Уважаемый zltigo!
У меня нет желания спорить с Вами.
Я лишь привёл несколько примеров, причём далеко на всех.

Цитата(zltigo @ Nov 27 2006, 21:23) *
Цитата(Alex03 @ Nov 27 2006, 14:26) *

- Подсчёт статистики, такой как кол-во прерываний,

Сильно. Просто общее количество прерываний и за каждое обработанное прерывание брать денюжку :-), хотя опять некоторые сложно обрабатывать а некоторве попроще. Тогда надо считать их отдельно, тогда зачем общий обработчик?


Ну почему же общее, считать по конкретному прерыванию.
Общий обработчик конечно же должен знать, скажем так, индекс прерывания.
Например в нашей ОС возможно максимум N источников прерываний.
Тогда имея
nIntCounts[N] - массив счётчиков по всем перрываниям
pIntFn[N] - массив указателей на зарегистрированные обработчики
В общем обработчике можно например так:
Код
    nIntCounts[nIntIdx]++;
    if(pIntFn[nIntIdx])
        pIntFn[nIntIdx]();

Откуда взять индекс? Зависит от архитектуры, но на примере того же LPC - а кто Вам сказал что в VicVectAddr/VicVectAddrX должен лежать именно адрес? Туда можно этот индекс и положить. smile.gif

Наберите в Linux-е командочку
Код
# cat /proc/interrupts

Притом если процев/ядер в системе несколько, то прерывания ещё и по каждому процу отдельно считаются.

Цитата
Цитата

систем_тайм/юзер_тайм и т.д.

А это уже конкретные обработчики, ну право-же не считать-же системное время по сумме прерываний от таймера, мышки и клавиатуры.

Не по сумме прерываний, а по сумме времени затраченного на исполнение прерываний, процессов ядра и юзерских процессов.
В роли таймера тут могут быть как некий системный таймер, так и какойнить счётчик тактов который например присутствует во всех современных пнях (и прочих x86).


Цитата
Цитата

- Переключение задач по соответствующим условиям, как то с низкоприоритетной прерванной задачи, на более (сильно/реалтайм) приоритетную, которая была выведена из спячки текущим прерыванием.

Действия понятны, но с этим разбирается система а не какой-то универсальный пролог/эпилог ко всем прерываниям.


И где по Вашему этим система разбирается?
1. Исполняется юзер-процесс
2. Происходит прерывание
3. Исполняется Ваш обработчик, который выводит из спячки высокоприоритетный процесс.
4. Возврат из прерывания
5. ??? Опять юзер-процесс ??? Где переключение контекста на высокоприоритетный процесс?

Цитата
Цитата

- Разрешение вложенных прерываний, опять же в соответствии с заданной в ОС логикой.

Разрешение вложенных прерываний огульно любого в любом. Выделение, например стека, неведомого размера (или наоборот не выделение) под вложенное. Причем до того, когда когда управление
получит обработчик конкретного прерывания или таже OS. При этом не запущенный обработчик
прерывания той-же OS как-то "задает логику"? Вот когда он получит управление он и будет "задавать логику" и именно он а не прокладка перед ним.


Ну почему же любого в любом?
Рядом с упомянутыми массивами nIntCounts[N], pIntFn[N] положите ещё массив с флагами для каждого прерывания, такими как возможность разрешения вложенности, флаг реентерабельности (повторного вхождения) и т.д.

Вариантов всегда множество.

В том же линуксе есть такое понятие bottom half.
При этом логику работы прерывания разбивают на две части
1. то что обязательно должно исполниться в обработчике прерывания.
2. то что обязанно исполниться после обработчика прерывания (например обработка данных), но до любого юзеского кода. Т.е. после прерывания исполняется системный процесс, который может быть в том числе прерван прерываниями.

Цитата
Цитата

в PC архитектуре когда на одном физическом прерывании может несколько девайсов висеть

Это к архитектуре никакого отнощения не имеет, у меня вот прямо сейчас перед носом 16 на одном
прерывании висят. И разбирается кто вылез обработчик конкретного прерывания, который знает
как разобраться "кто сказал Гав" а не некая абстрактная прокладка для всех прерываний вместе взятых.


Давайте видеть всю фразу, а не её части. PC архитектуру я приводил как пример, и то что Вы умеете разрулить "кто сказал Гав" заложенно в Вашей железячно-програмной архитектуре. Возвращаясь же к PC архитектуре там в случае нескольких девайсов на одной линии прерывания однозначно определить источник не возможно, и приходится ОС (точнее её универсальному обработчику прерывания) вызывать по очереди все зерегистрированные для данной линии обработчики, а уже конкретный обработчик первым делом проверяет своё железо на факт наличия прерывания, и именно по этому не советуют иметь несколько девайсов, особенно скоростных на одной линии прерывания.


Цитата
Цитата

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

Сильно. Т.е. девайса нет (не вставили), драйвера нет(не загрузили) а обработчик прерывания - вот он уже есть и готов работать с неведомым ему железом на неведомом прерывании.


Если Вы про универсальный обработчик - то да! Он может быть, но в нём нет кода по работе с неведомым железом, в нём есть код по вызову (или не вызову) зарегистрированного(ых) обработчика(ов). А регистрируют эти обработчики например драйвера при их загрузке и после инициализации железа.
И если вдруг произойдёт прерывание от некоего девайса для которого не зарегистрирован обработчик - то это факт наличия какихто неполадок в железе или ПО, который можно както обработать.


Цитата
Цитата

Ну и как доп. уровень абстракции когда писатель драйвера конкретной железки, не занимается программированием MMU или там контроллера прерываний (как то запись в VICVectAddr smile.gif ), а использует допустимые (документированные) для данной ОС механизмы.

Живые примеры вышеописанного "ненавязчивого сервиса" имеют место быть, только зачем для этого обязательно иметь некую абстрактную прокладку перед или после собственно обработчика прерывания, который будет писать писатель драйвера?


Про обязательность везде и всего я не говорил. smile.gif


Цитата
Цитата

Чем навороченнее ОС тем больше вариантов.

Навернуть можно много чего, вопрос зачем?
Конкретный пример наворота присутствовал в первом примере с которого топик начался. Наворот виден и кушает такты. Польза от наворота? Не писать в каждом обработчике в VICVectAddr? А если я, простите
захочу разрешить в одном (только упаси боже не во всех зараз) обработчике вложенные прерывания?
Нафига мне тогда такой сервис?


Во первых я сам в LPC пользую
Код
ldr     pc,[pc,#-0xFF0]

При этом я не пользую ОС.

Во вторых мы перевели разговор в сторону прерываний в ОС.
Цитата
А вот с этого места, пожалуйста поподробнее. Очень люблю про OSы думать. Заинтриговали.

ОС-ы бывают большие и маленькие, простые и сложные.
Писать их может один человек, а может и тысяча.

Ну и как пример оправданности оверхеда с тем же VICVectAddr:
Допустим Вы участвуете в разработке некой ОС или драйверов к ней.
Допустим Вам надо написать драйвер UART совместимого с x550.
Помимо всего прочего в драйвере нужен обработчик прерывания от UART-а.
Теперь вопрос: Вы хотите при этом досканально изучить все платформы на которых работает эта ОС (ну или по крайней мере есть UART совместимый с x550) и все возможные контроллеры прерываний на этих платформах чтобы использовать эти прерывания?
Go to the top of the page
 
+Quote Post

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

 


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


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