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

 
 
> TNeo: тщательно протестированная РТОС для Cortex-M0/M0+/M3/M4/M4F, PIC24/dsPIC, PIC32MX.
dimonomid
сообщение Jan 18 2015, 01:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835



Представляю новое ядро реального времени: TNeo. Как можно догадаться из названия, изначально она основана на TNKernel, но в итоге код был переписан почти полностью (потому что оригинальный код, по моему мнению, далек от совершенства), написаны подробные юнит-тесты, исправлены ошибки и добавлено много новых фич.

Список найденных и исправленных ошибок в TNKernel 2.7 можно посмотреть тут: http://dfrank.bitbucket.org/tneokernel_api...implement__bugs

Код TNeo написан аккуратно и тщательно, документирован очень подробно. Документация генерируется автоматически посредством doxygen, таким образом, легко поддерживать документацию в актуальном состоянии:
Список новых возможностей:

* Dynamic tick (опционально): если системе нечего делать, эта опция позволяет действительно ничего не делать (уйти в sleep), и даже не просыпаться каждую миллисекунду для обработки системного тика. Подробнее: http://dfrank.bitbucket.org/tneokernel_api...time_ticks.html
* Timer: позволяет попросить ядро запустить пользовательскую функцию через определенный промежуток времени. Подробнее: http://dfrank.bitbucket.org/tneokernel_api...__timer_8h.html
* Event group connection: позволяет "соединить" группу флагов с другими объектами РТОС. Очень удобно в случаях, когда в задаче нужно ждать, скажем, сообщения из нескольких очередей, или ждать каких-то флагов плюс сообщения из очереди. Подробнее: http://dfrank.bitbucket.org/tneokernel_api...ventgrp_connect
* Profiler (опционально): позволяет узнать общее время работы каждой задачи, максимальное время работы задачи подряд и т.д. Полезно для отладки.
* Software stack overflow check (опционально) - программный контроль переполнения стека, очень существенно облегчает дебаг;
* Recursive mutexes (опционально) - позволяет вложенную блокировку мютексов;
* Mutex deadlock detection (опционально) - в случае deadlock, ядро сообщает об этом посредством callback-функции;
* Separate interrupt stack - на всех поддерживаемых платформах прерывания используют отдельный стек.

Полный список фич тут: http://dfrank.bitbucket.org/tneokernel_api...l/features.html
Отличия API TNeo от API TNKernel 2.7 тут: http://dfrank.bitbucket.org/tneokernel_api...ernel_diff.html

Чем не устраивает TNKernel: см. документацию: Why reimplement TNKernel, также можно посмотреть мой старый пост на этом форуме: http://electronix.ru/forum/index.php?s=&am...t&p=1280109

Кратко: ключевые проблемы TNKernel:
  • Самая основная проблема в том, что TNKernel - проект, написанный на коленке, т.е. в спешке. Огромное количество дублирования кода, непоследовательности и недостаточной продуманности.
  • Проект не тестировался (только "вручную", как это нередко делается в эмбеддинге, к сожалению). Среди найденных багов есть банальнейшие ситуации с мютексами, которые не обрабатываются ядром корректно (см. ссылку на список багов выше). Ну, учитывая первый пункт про спешку, отсутствие тестов неудивительно, т.к. на них нужно огромное количество времени. У меня на тесты ушло примерно столько же времени, сколько на само ядро.
  • Документация живет отдельной от самого ядра жизнью.
  • Проект не поддерживается. Я присылал Юрию исправления некоторых ошибок, мои сообщения были проигнорированы.


Любопытный читатель может спросить: если уж я так сильно ругаю TNKernel, почему же я взял это ядро за основу? С удовольствием отвечу: не смотря на то, что реализация TNKernel, по моему мнению, далека от совершенства, идеи, стоящие за реализацией, я считаю в целом очень достойными. Ядро компактное и быстрое, и данные организованы грамотно.

Я хотел переписать его так, чтобы на код было приятно смотреть и легко модифицировать (не боясь что-то сломать), хотел быть уверенным в отсутствии багов (посредством юнит-тестов), хотел достойную актуальную документацию. Все это готово.

Попутно я реализовал вещи, которых мне самому раньше не хватало, плюс реализовал пожелания людей, заинтересовавшихся проектом (я представил TNeo на семинаре Microchip MASTERS 2014, после чего и получил предложение реализовать порт для линейки Cortex-M и несколько других фич)

Выражаю огромную благодарность Юрию за проделанную работу над TNKernel: без нее, конечно, TNeo никогда не появилась бы. Полный список благодарностей можно прочитать на странице Thanks.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Jan 18 2015, 22:14
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(dimonomid @ Jan 18 2015, 19:31) *
Так что ничего особо сложного, если есть желание - главное начать! sm.gif


Есть обстоятельства, охлаждающие такое желание. Например, этой ночью появилась (точнее - была выложена на сайт) очередная версия FreeRTOS V8.2.0. По этому случаю я заглянула в список поддерживаемых ею МК и очень удивилась его широте. Вероятно, там не один человек работает, а целая компания.

Так вот я вижу в том списке среди многих прочих типов интересующие меня архитектуры МК (AVR и Cortex-R4F), которые в настоящий момент не поддерживает ни TNKernel, ни TNeo. А психика любого человека, как и психика разработчика, такова, что когда есть что-то готовое, и к тому же бесплатное, то очень трудно решиться на самостоятельные проекты, достигающие той же цели, но только другим путем. Опять же колеблешься, опасаясь возможных трудностей или возникающих проблем в процессе самостоятельного творчества, тогда как перед тобой уже находится готовый халявный вариант, который нахваливает целая толпа народа. sm.gif

В этой связи у меня к вам просьба похаять FreeRTOS, указав на присущие ей недостатки, но которые отсутствуют у TNKernel/TNeo. Т.е. что в принципе можно выиграть, если использовать TNeo вместо FreeRTOS? Полагаю, что даже в том случае, если бы я не задала вам этот вопрос, то его обязательно задал бы кто-то другой, т.к. конкуренция между различными RTOS/OS - типичное дело. Да и вы сами, надо полагать, имели в голове какие-то свои соображения, если в самом начале сделали ставку на TNKernel, даже в ее недоработанном виде. Тем более что здесь и без FreeRTOS других конкурентов полно, и всяк себя в захлеб хвалит.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 19 2015, 09:52
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Xenia @ Jan 19 2015, 00:14) *
В этой связи у меня к вам просьба похаять FreeRTOS, указав на присущие ей недостатки, но которые отсутствуют у TNKernel/TNeo


Так это запросто, если вы знаете FreeRTOS то должны знать, что то там нет такой фичи как Event group connection

А это реально очень полезная фича.
В задачу действительно могут посылаться и события и майлбоксы и потоки и на все надо реагировать сразу без последовательного полинга всех объектов синхронизации от которых ожидается изменение состояния.
Во FreeRTOS такого простого механизма реагировать на все сразу в одном вызове сервиса RTOS нет.

Правда в TNeo это реализовано несколько прямолинейно и не гибко.

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

Цитата(dimonomid @ Jan 19 2015, 00:52) *
Зачем третья задача? Двух задач, использующих флешку без блокировки этого ресурса, достаточно для нарушения нормальной работы.


Это понятно, но приоритет тогда зачем поднимать. Тогда семафора достаточно.

Ведь чем больше разнородных сервисов в RTOS тем труднее программировать.
Все стремятся ограничиться минимальным набором сервисов и вот мьютексы тут как-то негармонично смотрятся.
Go to the top of the page
 
+Quote Post
dimonomid
сообщение Jan 19 2015, 10:21
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835



Цитата(AlexandrY @ Jan 19 2015, 14:47) *
В MQX, например, не надо создавать некую группу специфических флагов

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

Цитата(AlexandrY @ Jan 19 2015, 14:47) *
... у очередей, семафоров и проч. сервисов можно установить специальную функцию нотификации.
А в функции нотификации можно уже взводить хоть флаги хоть кучу флагов для разных задач.

Хм, вообще коллбэк - хорошая идея, надо подумать. Гибкость, действительно, на высоте: в коллбэк-функции можно делать что хочешь, если надо.

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

Может, у вас есть какие-то примеры, что еще может быть реально полезно сделать в этом коллбэке?

Ну и если нужно только установить флаг, то в случае с коллбэком нужно будет сделать для этого больше телодвижений, чем сейчас: нужно будет написать специальную функцию, в ней вручную ставить/снимать флаг, и зарегистрировать коллбэк в TN_DQueue. А сейчас нужно просто вызвать tn_queue_eventgrp_connect() и передать туда указатель на группу флагов и маску.

Подумаю, спасибо.

Цитата(AlexandrY @ Jan 19 2015, 14:52) *
Это понятно, но приоритет тогда зачем поднимать. Тогда семафора достаточно.

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


Мютексы и семафоры созданы для совершенно разных задач, и некоторая схожесть их API порождает огромное количество путаницы в головах. Семафор - механизм сигнализирования, мютекс - механизм блокировки ресурсов. Статья Michal Barr была именно об этом, вот еще до кучи вопрос-ответ на stackoverflow: http://stackoverflow.com/questions/62814/d...phore-and-mutex

Поэтому я, конечно, не вижу никакой дополнительной сложности программирования и негармоничности мютексов. У мютексов и у семафоров совершенно разные предназначения.

Цитата(AlexandrY @ Jan 19 2015, 14:52) *
но приоритет тогда зачем поднимать.

Чтобы не было инверсии приоритетов, т.е. чтобы не получилось так, что высокоприоритетная задача Б будет ждать низкоприоритетную задачу А (из моего прошлого примера про SPI флешку)


Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 19 2015, 11:40
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(dimonomid @ Jan 19 2015, 12:21) *
Может, у вас есть какие-то примеры, что еще может быть реально полезно сделать в этом коллбэке?


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


Цитата(dimonomid @ Jan 19 2015, 12:21) *
Мютексы и семафоры созданы для совершенно разных задач, и некоторая схожесть их API порождает огромное количество путаницы в головах. Семафор - механизм сигнализирования, мютекс - механизм блокировки ресурсов. Статья Michal Barr была именно об этом, вот еще до кучи вопрос-ответ на stackoverflow: http://stackoverflow.com/questions/62814/d...phore-and-mutex


Чтобы не было инверсии приоритетов, т.е. чтобы не получилось так, что высокоприоритетная задача Б будет ждать низкоприоритетную задачу А (из моего прошлого примера про SPI флешку)


Все эти рассуждения в принципе наверно правильны если мы говорим об OS типа Windows.

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

К сведению в RTOS Nucleus Plus вообще нет мьютексов, там их роль блокировки к разделяемым ресурсам выполняют семафоры.
Приоритеты задач в Nucleus не поднимаются семафорами автоматически, для этого есть явные функции управления приоритетами. И это более близко по духу к realtime.
А есть еще такие понятия как Lightweight Semaphores, угадайте чем они отличаются от обычных семафоров. wink.gif
А например в MQX подъем приоритета семафоры делают также как и мьютексы.

Вторая фишка в том что если в Windows семафоры сложнее мьютексов, то в RTOS наоборот. Поэтому чтобы не замедлять программу от мьютексов тянет отказаться.

Т.е. не советую как аргумент ссылаться на stackoverflow.com где большинство в глаза видели один лишь PC.
Go to the top of the page
 
+Quote Post
dimonomid
сообщение Jan 19 2015, 11:59
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835



Цитата(AlexandrY @ Jan 19 2015, 16:40) *
Все эти рассуждения в принципе наверно правильны если мы говорим об OS типа Windows.

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

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

"Семафор", как следует из названия, нужен для сигнализирования, а "мютекс", как опять же следует из названия (mutual exclusion - взаимное исключение), нужен для блокировки ресурсов между конкурирующими потоками.

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

В TNeo роль этих объектов предельно близка к парадигме. Мютекс мы можем заблокировать (tn_mutex_lock) и разблокировать (tn_mutex_unlock); семафор мы можем ждать (tn_sem_wait) и сигналить (tn_sem_signal).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dimonomid   TNeo: тщательно протестированная РТОС для Cortex-M0/M0+/M3/M4/M4F, PIC24/dsPIC, PIC32MX.   Jan 18 2015, 01:41
- - Aner   Под IAR c Cortex не планируется?   Jan 18 2015, 11:11
|- - dimonomid   Цитата(Aner @ Jan 18 2015, 15:11) Под IAR...   Jan 18 2015, 11:23
- - AlexandrY   Цитата(dimonomid @ Jan 18 2015, 03:41) По...   Jan 18 2015, 12:30
|- - dimonomid   Цитата(AlexandrY @ Jan 18 2015, 17:30) Не...   Jan 18 2015, 13:15
|- - AlexandrY   Цитата(dimonomid @ Jan 18 2015, 15:15) То...   Jan 18 2015, 21:42
|- - dimonomid   Цитата(AlexandrY @ Jan 19 2015, 02:42) Да...   Jan 18 2015, 22:52
- - nill   Планируете переносить TN NET на своё ядро? И есть ...   Jan 18 2015, 13:58
|- - dimonomid   Цитата(nill @ Jan 18 2015, 17:58) Планиру...   Jan 18 2015, 14:14
- - Xenia   Цитата(dimonomid @ Jan 18 2015, 04:41) Пр...   Jan 18 2015, 14:30
|- - dimonomid   Цитата(Xenia @ Jan 18 2015, 18:30) А скач...   Jan 18 2015, 14:39
|- - Xenia   Цитата(dimonomid @ Jan 18 2015, 17:39) Во...   Jan 18 2015, 15:09
|- - dimonomid   Цитата(Xenia @ Jan 18 2015, 20:09) 1. Изв...   Jan 18 2015, 15:32
|- - Xenia   Цитата(dimonomid @ Jan 18 2015, 18:32) Пр...   Jan 18 2015, 16:10
|- - dimonomid   Цитата(Xenia @ Jan 18 2015, 20:10) А как ...   Jan 18 2015, 16:31
||- - megajohn   рассмотрите возможность 11. не плохо бы разместить...   Jan 19 2015, 10:34
|||- - dimonomid   Цитата(megajohn @ Jan 19 2015, 15:34) рас...   Jan 19 2015, 11:18
|- - den_po   Цитата(AlexandrY @ Jan 19 2015, 14:52) Та...   Jan 19 2015, 11:36
|- - dimonomid   Цитата(den_po @ Jan 19 2015, 16:36) http:...   Jan 19 2015, 11:40
- - Aner   Философия однако, не даром западные программисты в...   Jan 19 2015, 18:08
|- - dimonomid   Цитата(Aner @ Jan 19 2015, 22:08) Для ког...   Jan 19 2015, 18:50
|- - AlexandrY   Цитата(dimonomid @ Jan 19 2015, 20:50) Ис...   Jan 19 2015, 20:35
|- - dimonomid   Цитата(AlexandrY @ Jan 20 2015, 00:35) Ну...   Jan 19 2015, 21:14
|- - AlexandrY   Цитата(dimonomid @ Jan 19 2015, 23:14) Не...   Jan 20 2015, 07:09
|- - dimonomid   Цитата(AlexandrY @ Jan 20 2015, 11:09) Ну...   Jan 20 2015, 08:03
|- - LightElf   QUOTE (dimonomid @ Jan 20 2015, 12:03) Хо...   Jan 20 2015, 09:46
||- - dimonomid   Цитата(LightElf @ Jan 20 2015, 13:46) Но ...   Jan 20 2015, 10:55
|- - AlexandrY   Цитата(dimonomid @ Jan 20 2015, 10:03) Уж...   Jan 20 2015, 11:03
|- - den_po   Цитата(AlexandrY @ Jan 20 2015, 15:03) Не...   Jan 20 2015, 14:17
|- - dimonomid   Цитата(AlexandrY @ Jan 20 2015, 15:03) Пр...   Jan 20 2015, 16:39
|- - AlexandrY   Цитата(dimonomid @ Jan 20 2015, 18:39) Мд...   Jan 21 2015, 07:24
|- - dimonomid   Цитата(AlexandrY @ Jan 21 2015, 12:24) Ва...   Jan 21 2015, 08:56
|- - AlexandrY   Цитата(dimonomid @ Jan 21 2015, 10:56) Со...   Jan 21 2015, 09:47
|- - dimonomid   Цитата(AlexandrY @ Jan 21 2015, 14:47) А ...   Jan 21 2015, 10:03
|- - AlexandrY   Цитата(dimonomid @ Jan 21 2015, 12:03) Ни...   Jan 21 2015, 10:11
|- - dimonomid   Цитата(AlexandrY @ Jan 21 2015, 15:11) Па...   Jan 21 2015, 12:29
|- - AlexandrY   Цитата(dimonomid @ Jan 21 2015, 14:29) Не...   Jan 22 2015, 08:03
|- - dimonomid   Цитата(AlexandrY @ Jan 22 2015, 13:03) ...   Jan 22 2015, 09:52
|- - AlexandrY   Цитата(dimonomid @ Jan 22 2015, 11:52) По...   Jan 22 2015, 10:16
|- - dimonomid   Цитата(AlexandrY @ Jan 22 2015, 15:16) Я ...   Jan 22 2015, 11:12
- - Aner   Про то что FreeRTOS значительно медленнее TNKernel...   Jan 19 2015, 20:45
- - Mahagam   Aner, фриртос действительно тормознее других перек...   Jan 20 2015, 07:17
|- - Aner   QUOTE (Mahagam @ Jan 20 2015, 11:17) Aner...   Jan 20 2015, 09:20
|- - Mahagam   QUOTE (Aner @ Jan 20 2015, 12:20) кроме b...   Jan 20 2015, 11:33
||- - Aner   QUOTE (Mahagam @ Jan 20 2015, 15:33) поме...   Jan 20 2015, 14:45
||- - Mahagam   QUOTE (Aner @ Jan 20 2015, 17:45) Да блин...   Jan 20 2015, 17:10
|- - dimonomid   Насчет FreeRTOS: Цитата(Mahagam @ Jan 20 201...   Apr 7 2015, 23:58
- - Valentine Loginov   Спасибо! Будем смотреть. А тесты в открытом до...   Jan 20 2015, 08:06
|- - dimonomid   Цитата(Valentine Loginov @ Jan 20 2015, 12...   Jan 20 2015, 08:10
- - Aner   Шизу про догнал развивать не стоит. Я о тормозах и...   Jan 20 2015, 19:35
- - ViKo   Здесь много разговора про мьютексы. В Keil CMSIS-R...   Jan 22 2015, 10:01
|- - AHTOXA   Цитата(ViKo @ Jan 22 2015, 15:01) Я испол...   Jan 22 2015, 11:56
|- - ViKo   Цитата(AHTOXA @ Jan 22 2015, 14:56) То ес...   Jan 22 2015, 12:07
|- - AHTOXA   Цитата(ViKo @ Jan 22 2015, 17:07) Нет. Мь...   Jan 22 2015, 15:37
|- - ViKo   Цитата(AHTOXA @ Jan 22 2015, 18:37) Вот э...   Jan 22 2015, 16:51
|- - dimonomid   Цитата(ViKo @ Jan 22 2015, 21:51) Почитай...   Jan 22 2015, 17:13
- - _Pasha   Мне вообще даже эти все разговоры про ртосы не нра...   Jan 22 2015, 10:18
- - Alex B._   dimonomid – можно рассмотреть кейс, когда на...   Jan 22 2015, 11:26
|- - dimonomid   Цитата(Alex B._ @ Jan 22 2015, 16:26) dim...   Jan 22 2015, 11:35
|- - Alex B._   Цитата(dimonomid @ Jan 22 2015, 14:35) Я ...   Jan 22 2015, 11:40
- - ViKo   Хотите семафоров? - их есть у Кейла. Как говорится...   Jan 22 2015, 20:33
- - Valentine Loginov   Ай пошли войны. Создали бы тему или блог какой и о...   Jan 23 2015, 06:49
- - ViKo   Нашел принципиальное отличие мьютекса от семафора....   Jan 23 2015, 07:04
|- - LightElf   QUOTE (ViKo @ Jan 23 2015, 11:04) Так что...   Jan 23 2015, 12:01
|- - ViKo   Цитата(LightElf @ Jan 23 2015, 15:01) При...   Jan 23 2015, 12:42
- - zaicev_ekb   Прошу прошения. А почему такой древний компилятор ...   Feb 9 2015, 10:47
|- - dimonomid   Цитата(zaicev_ekb @ Feb 9 2015, 15:47) Пр...   Feb 9 2015, 16:30
- - dimonomid   Так, отставить, я ерунду написал в прошлом сообщен...   Apr 8 2015, 10:03
- - LightElf   QUOTE (dimonomid @ Apr 8 2015, 13:03) Так...   Apr 8 2015, 13:42
- - dimonomid   Цитата(LightElf @ Apr 8 2015, 17:42) Наск...   Apr 8 2015, 14:02
- - LightElf   QUOTE (dimonomid @ Apr 8 2015, 17:02) т к...   Apr 8 2015, 14:23
- - dimonomid   Цитата(LightElf @ Apr 8 2015, 18:23) Хм. ...   Apr 8 2015, 14:38
- - LightElf   QUOTE (dimonomid @ Apr 8 2015, 17:38) Мда...   Apr 8 2015, 14:46
- - dimonomid   Цитата(LightElf @ Apr 8 2015, 19:46) Во...   Apr 8 2015, 14:56
- - LightElf   QUOTE (dimonomid @ Apr 8 2015, 17:56) Вам...   Apr 8 2015, 15:05
- - dimonomid   Цитата(LightElf @ Apr 8 2015, 19:05) Так ...   Apr 8 2015, 15:13
- - LightElf   QUOTE (dimonomid @ Apr 8 2015, 18:13) Хм....   Apr 8 2015, 15:29


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:12
Рейтинг@Mail.ru


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