|
Выпущена scmRTOS 4.0., Ура, товарищи! :) |
|
|
|
 |
Ответов
|
Apr 14 2012, 10:38
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Вы её просто не умеете готовить. Как, видимо, и любую другую вытесняющую ОС, так как то же самое будет в любой другой независимо от языка реализации. Если Вы «драйверные» по сути вещи будете запихивать в отдельные процессы с ожиданием посланного сообщения из тупого обработчика прерываний, то будет то же самое — большие задержки, большие расходы не переключение задач, на стеки процессов. Если Вы «драйверные» вещи выделите в отдельные классы, как в обсуждениях по ссылкам в предыдущем моём сообщении, а в процесс будете отправлять уже «высокоуровневый» результат работы драйвера, то отрабатывать драйверные прерывания будут так же быстро, как и в программе без какой-либо ОС. Всю быструю работу будет делать драйвер, остальное — разбуженный результатом процесс. Это вполне реализуемо в рамках scmRTOS. Не нравится отдельный драйверный класс — сделайте свой хитрый процесс. Раз он хитрый — Вам не удастся воспользоваться готовым шаблоном для стандарнтых процессов, но Вы тут так много говорили про С++, что у Вас не должно быть проблем сделать, например, такое (за основу взят пример 2 из пакета avr-gcc и проверено в железе): CODE //****************************************************************************** //* FULLNAME: Single-Chip Microcontroller Real-Time Operating System //* NICKNAME: scmRTOS //* PROCESSOR: AVR (Atmel) //* TOOLKIT: avr-gcc (GNU) //* PURPOSE: avr-gcc Port Test File
... порезано ...
//******************************************************************************
//--------------------------------------------------------------------------- #include <avr/io.h> #include "pin_macros.h" #include <scmRTOS.h>
#if scmRTOS_CONTEXT_SWITCH_SCHEME == 1 // for analog comparator initialisation in main() #include <util/delay.h> #endif
//--------------------------------------------------------------------------- // Sample target // The sample is intended for following AVR microcontrollers: // atmega48..atmega328 // atmega64, atmega128 // atmega640..atmega2561 // Some changes in register names may be needed for other AVRs.
#if defined(TIMSK1) # define TIMER1_IE_REG TIMSK1 #elif defined(TIMSK) # define TIMER1_IE_REG TIMSK #else # error "Timer1 interrupt mask register not defined" #endif
//--------------------------------------------------------------------------- // "Hello, scope!" pins in pin_macros.h notation. #define TIMER1_ISR D,5,H #define TIMER1_TO_PROC1 B,0,H #define PROC1 B,1,H #define PROC2 B,2,H #define PROC3 B,3,H #define TIMER_HOOK B,4,H #define IDLE_HOOK B,5,H #define MAMONT_TRUNK C,5,H
//--------------------------------------------------------------------------- struct TMamont // data type for sanding by message { enum TSource { PROC_SRC, ISR_SRC } src; int data; };
//--------------------------------------------------------------------------- // Process types
// Два процесса стандартные typedef OS::process<OS::pr1, 160> TProc2; typedef OS::process<OS::pr2, 120> TProc3;
// Третий имеет методы для общения с себе подобными и метод, отрабатывающий // «в ожидании НАСТОЯЩЕГО прерывания»
// avr-gcc не позволяет объявить статический член класса обработчиком прерывания, // приходится пользоваться помощью друга OS_INTERRUPT void TIMER1_COMPA_vect();
// Наследуем от базового типа процесса scmRTOS class TProc1 : public OS::TBaseProcess { friend void TIMER1_COMPA_vect(); public: // Раз не воспользовались шаблоном стандратного процесса — солнце закатываем вручную TProc1() : OS::TBaseProcess( &Stack[stack_size/sizeof(stack_item_t)], OS::pr0, reinterpret_cast<void (*)()>(exec) ) { TCCR1B = (1 << WGM12) | (1 << CS10); // CTC mode, clk/1 OCR1A = 40000U; TIMER1_IE_REG = (1 << OCIE1A); // Timer1 OC interrupt enable }
// Это для вызова из других процессов static void send_message(TMamont::TSource source, int data);
private: static const size_t stack_size = 120; OS_PROCESS static void exec();
static TMamont Mamont; static OS::message<TMamont> MamontMsg;
// А это НАСТОЯЩЕЕ прерывание INLINE void compa_isr(); stack_item_t Stack[stack_size/sizeof(stack_item_t)]; };
TProc1 Proc1; TMamont TProc1::Mamont; OS::message<TMamont> TProc1::MamontMsg;
void TProc1::send_message(TMamont::TSource source, int data) { TMamont m; m.src = source; m.data = data; MamontMsg = m; MamontMsg.send(); }
// Этот метод будет вызываться из НАСТОЯЩЕГО прерывания до любого перепланирования и т.п. // Отрабатывает максимально быстро и может накопить работу (например, принять весь пакет // по каналу связи) и только потом послать результирующее сообщение. void TProc1::compa_isr() { TMamont m; m.src = TMamont::ISR_SRC; m.data = 10; MamontMsg = m; ON(MAMONT_TRUNK); MamontMsg.send_isr(); }
//--------------------------------------------------------------------------- // Process objects // TProc2 Proc2; TProc3 Proc3;
//--------------------------------------------------------------------------- int main() { // Start System Timer TIMER0_CS_REG = (1 << CS01) | (1 << CS00); // clk/64 TIMER0_IE_REG |= (1 << TOIE0);
#if scmRTOS_CONTEXT_SWITCH_SCHEME == 1 // Setup analog comparator as software interrupt source #if PORT_TOGGLE_BY_PIN_WRITE // see pin_macros.h for PORT_TOGGLE_BY_PIN_WRITE definition and sing ACSR = (1 << ACBG); // Ref ON, interrupt on both edges #else ACSR = (1 << ACBG) | (1 << ACIS1); // Ref ON, falling edge #endif DRIVER(RAISE_PIN,OUT); // AIN1 - output // analog comparator propagation and synchronization delay _delay_us(2); ACSR |= (1 << ACI); // needed for chips with improved sbi/cbi behavior ACSR |= (1 << ACIE); #endif
DRIVER(TIMER1_ISR,OUT); DRIVER(TIMER_HOOK,OUT); DRIVER(IDLE_HOOK,OUT); DRIVER(MAMONT_TRUNK,OUT); // OS::run(); }
//--------------------------------------------------------------------------- void TProc1::exec() { DRIVER(PROC1,OUT); DRIVER(TIMER1_TO_PROC1,OUT); for(;;) { OFF(PROC1); MamontMsg.wait(); ON(PROC1); OFF(TIMER1_TO_PROC1); MamontMsg.out(Mamont); if(Mamont.src == TMamont::PROC_SRC) { OFF(MAMONT_TRUNK); } else { OFF(MAMONT_TRUNK); ON(MAMONT_TRUNK); OFF(MAMONT_TRUNK); } } } // TProc1::exec()
//--------------------------------------------------------------------------- namespace OS { template<> OS_PROCESS void TProc2::exec() { DRIVER(PROC2,OUT); for(;;) { OFF(PROC2); sleep(20); ON(PROC2); } } // TProc2::exec() } // namespace OS
//--------------------------------------------------------------------------- namespace OS { template<> OS_PROCESS void TProc3::exec() { DRIVER(PROC3,OUT); for(;;) { OFF(PROC3); sleep(1); ON(PROC3); ON(MAMONT_TRUNK); Proc1.send_message(TMamont::PROC_SRC, 5); // обращаемся к процессу от другого процесса } } // TProc3::exec() } // namespace OS
//--------------------------------------------------------------------------- OS_INTERRUPT void TIMER1_COMPA_vect() { ON(TIMER1_ISR); ON(TIMER1_TO_PROC1); OS::TISRW ISRW; // Часть логики процесса работает непосредственно в прерывании без перепланирования // и без переключения задач Proc1.compa_isr(); OFF(TIMER1_ISR); }
Тут имеем быструю реакцию (уже не класса драйвера, а непосредственно класса процесса) на прерывание. Но не в его методе exec(), предназначенном для работы в рамках ненастоящего прерывания вытесняющего планирования ОС, а в его методе compa_isr(). Всё как Вы хотели «но не знали как и постеснялись спросить». Если ядро имеет приоритетную систему прерываний, как в современных "Электроника-60", 1801ВМ, MSP430, i8051 (вычёркиваем, C++ для него нет и scmRTOS не спортится, но на С всё то же в виде модулей и инкапсуляцией static-об’ектами это работает), ARM, то этот подход, как и с классами драйверов, автоматически ею воспользуется. Нет — не судьба. Но страдать от необходимости « идти длинным путем через OS, через диспетчер, через полинг, через арбитр приоритетов....» не приходится и на AVR. Более того, в классе драйвера UART для работы в рамке SLIP в передатчике у меня два isr-метода. Метод udre_isr() вообще «внеосевой», оне не пользуется сервисами ОС и очень лёгкий, после него не производится перепланирование (оно и не нужно, данное прерывание ничего не поменяло в состояниях процессов). А вот метод txc_isr() уже сообщает наверх о том, что пакет передан полностью, вызывает сервисы ОС и после него происходит перепланирование. Цитата(Aprox @ Apr 14 2012, 12:01)  Точнее сказать, без привычной из прошлого OS. Из какого прошлого? Кому привычной? Привычной нам ОС или неправильного её использования Вами из-за привычной работы без ОС? В RT11 (FB) было то же самое — драйвера отрабатывали быстро, при необходимости было более медленное переключение на ожидающую задачу. Без С++ и современных чипов. А то, что Вы описали — это таки не вытесняющая ОС вообще. Это расталкивание всей работы по обработчикам прерываний с оставшейся программой без каких-либо признаков ОС либо с зачатками кооперативной ОС, пользующейся результатом работы выполненной в прерываниях обработки. Вполне себе решение, пользовался раньше и пользуюсь сейчас. Без ОС или с кооперативной ОС часто иначе невозможно. Если некоторые поселенные в прерывания задачи довольно длительны, то такой подход просит приоритетной системы вложенных прерываний. да. Но никаких современных чипов для этого не нужно, это есть в MSP430. Это было в 1801ВМ1, ВМ2 30+ лет назад. Там, кстати, в RT11 для драйверов готовые макросы были для регулирования приоритета обработчика, самое важное он делал на большом приоритете, потом снижал приоритет ядра до более низкого и его могли прервать даже те прерывания, которых он победил при первоначальном арбитраже. То же самое я делал на i8051 — после критической по времени части обработчика очищал уровень приоритета и данный обработчик уже могли прервать не только более приоритетные прерывания, но и вобще все, т.е. я снижал уровень приоритета обработчика прерываний до приоритета основного кода. Иногда при этом даже то же самое прерывание прерывало как бы само себя, но шло при этом по другой ветке (по бедности — таймеров не хватало, вот и было на один таймер навешано несколько задач разной периодичности и длительности). Не совсем то, что было в 1801ВМ или что есть у MSP430 или современных чипов, но это именно эта идеология.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 15 2012, 08:20
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(ReAl @ Apr 14 2012, 14:38)  Если Вы «драйверные» вещи выделите в отдельные классы, как в обсуждениях по ссылкам в предыдущем моём сообщении, а в процесс будете отправлять уже «высокоуровневый» результат работы драйвера, то отрабатывать драйверные прерывания будут так же быстро, как и в программе без какой-либо ОС. Всю быструю работу будет делать драйвер, остальное — разбуженный результатом процесс. Это вполне реализуемо в рамках scmRTOS. А смысл? Зачем нужна вообще scmOS, если и без нее реализуются все те же самые функции вытеснения процессов с приоритетом и защищенность данных каждой отдельной задачи? Зачем мне осваивать ставшую ненужной OS и подлаживаться под ее условности? Цитата Не нравится отдельный драйверный класс — сделайте свой хитрый процесс. Раз он хитрый — Вам не удастся воспользоваться готовым шаблоном для стандарнтых процессов, но Вы тут так много говорили про С++... Этот язык я использую для опреления задачи реального времени как класса с защищенными методами и данными. Отдельные стеки, сохранять контекст каждой задачи, уже не неужно. Соответственно, одна из главных фич многозадачных OS с приходом C++ выглядит ненужной. [ коды skipped] Цитата Тут имеем быструю реакцию (уже не класса драйвера, а непосредственно класса процесса) на прерывание. Но не в его методе exec(), предназначенном для работы в рамках ненастоящего прерывания вытесняющего планирования ОС, а в его методе compa_isr(). Разделение приложения на "драйвер" и системную часть - очень условно и субьективно. В моем случае можете считать, в программе одни только" драйверы". И эти "драйверы", которые я упорно называю автономными паралелльными процессами, прекрасно взаимодействуют друг с другом и вытесняют друг-друга, без всякой центральной системной части. Конечно, это благодаря только современным чипам, в которых реализованы вложенные прерывания периферии с приоритетом. Цитата делал на большом приоритете, потом снижал приоритет ядра до более низкого и его могли прервать даже те прерывания, которых он победил при первоначальном арбитраже. То же самое я делал на i8051 — после критической по времени части обработчика очищал уровень приоритета и данный обработчик уже могли прервать не только более приоритетные прерывания, но и вобще все, т.е. я снижал уровень приоритета обработчика прерываний до приоритета основного кода. Иногда при этом даже то же самое прерывание прерывало как бы само себя, но шло при этом по другой ветке (по бедности — таймеров не хватало, вот и было на один таймер навешано несколько задач разной периодичности и длительности). Не совсем то, что было в 1801ВМ или что есть у MSP430 или современных чипов, но это именно эта идеология. Видите ли, ссылаться на опыт прошлого, на проблемы со старыми чипами... как-то неконструктивно. Я знаю все те проблемы, сам наплясался с бубном всласть. Сейчас время другое- в чипах появились нормальные прерывания с приоритетом, периферия вся забуферирована через FIFO, не надо программно торопиться с пересылками блоков данных- это за нас делает DMA. Напичкали все, о чем мечталось лет десять назад. Так, пользоваться надо!
|
|
|
|
Сообщений в этой теме
AHTOXA Выпущена scmRTOS 4.0. Apr 5 2012, 12:57 haker_fox Искренние поздравления!
Использовал несколько ... Apr 6 2012, 02:27 Fat Robot Молодцы! Apr 6 2012, 09:10 Aprox Уважаемые авторы новой 4-ой версии!
Позвольте... Apr 9 2012, 18:32 _Артём_ Цитата(Aprox @ Apr 9 2012, 21:32) Или все... Apr 9 2012, 19:00  Aprox Цитата(_Артём_ @ Apr 9 2012, 23:00) А что... Apr 10 2012, 09:02   demiurg_spb Цитата(Aprox @ Apr 10 2012, 13:02) Зато к... Apr 10 2012, 10:12    dxp QUOTE (demiurg_spb @ Apr 10 2012, 17:12) ... Apr 10 2012, 10:17     demiurg_spb ответил в предыдущем посте. Apr 10 2012, 10:21    dxp QUOTE (demiurg_spb @ Apr 10 2012, 17:12) ... Apr 10 2012, 13:33   Сергей Борщ QUOTE (Aprox @ Apr 10 2012, 12:02) Мне пр... Apr 10 2012, 10:13    Aprox Цитата(Сергей Борщ @ Apr 10 2012, 14:13) ... Apr 10 2012, 19:47     aaarrr Цитата(Aprox @ Apr 10 2012, 23:47) Я посм... Apr 10 2012, 20:12     demiurg_spb Цитата(Aprox @ Apr 10 2012, 23:47) ... Apr 11 2012, 04:54     Сергей Борщ QUOTE (Aprox @ Apr 10 2012, 22:47) Видите... Apr 11 2012, 05:48      Aprox Цитата(Сергей Борщ @ Apr 11 2012, 09:48) ... Apr 11 2012, 12:50       mdmitry Цитата(Aprox @ Apr 11 2012, 16:50) А юзер... Apr 11 2012, 13:43       AHTOXA Цитата(Aprox @ Apr 11 2012, 18:50) Уточни... Apr 11 2012, 14:44        Aprox Цитата(AHTOXA @ Apr 11 2012, 18:44) Обраб... Apr 11 2012, 19:11         AHTOXA Цитата(Aprox @ Apr 12 2012, 00:24) OS по ... Apr 11 2012, 19:12          Aprox Цитата(AHTOXA @ Apr 11 2012, 23:12) У мен... Apr 12 2012, 07:57           Lotor Цитата(Aprox @ Apr 12 2012, 11:57) Чтобы ... Apr 12 2012, 08:29           MrYuran Цитата(Aprox @ Apr 12 2012, 11:57) Дело з... Apr 12 2012, 08:43            Aprox Цитата(MrYuran @ Apr 12 2012, 11:43) ScmR... Apr 12 2012, 11:54         Сергей Борщ QUOTE (Aprox @ Apr 11 2012, 22:11) Работа... Apr 11 2012, 19:56   _pv Цитата(Aprox @ Apr 10 2012, 16:02) Зато к... Apr 10 2012, 11:35   AHTOXA Цитата(Aprox @ Apr 10 2012, 15:02) Вот, я... Apr 10 2012, 12:31    _Артём_ Цитата(AHTOXA @ Apr 10 2012, 15:31) Вложе... Apr 10 2012, 14:11     AHTOXA Цитата(_Артём_ @ Apr 10 2012, 20:11) Може... Apr 10 2012, 16:56      _Артём_ Цитата(AHTOXA @ Apr 10 2012, 19:56) в scm... Apr 10 2012, 18:08       AHTOXA Цитата(_Артём_ @ Apr 11 2012, 00:08) Ну д... Apr 11 2012, 07:26        _Артём_ Цитата(AHTOXA @ Apr 11 2012, 10:26) Ну, у... Apr 11 2012, 17:09         AHTOXA Цитата(_Артём_ @ Apr 11 2012, 23:09) 70 г... Apr 11 2012, 18:07      Aprox Цитата(AHTOXA @ Apr 10 2012, 20:56) Нет, ... Apr 10 2012, 20:30       aaarrr Цитата(Aprox @ Apr 11 2012, 00:30) Тогда ... Apr 10 2012, 20:54 bookevg Цитата(Aprox @ Apr 9 2012, 22:32) 1. Вы ... Apr 9 2012, 19:05 Сергей Борщ QUOTE (Aprox @ Apr 9 2012, 21:32) 1. Вы ... Apr 9 2012, 20:53 Anatoly74 Найдена опечатка в порте AVR, Common/OS_Kernel.h
В... Apr 11 2012, 07:34 _pv Цитата(Anatoly74 @ Apr 11 2012, 14:34) На... Apr 11 2012, 09:05  demiurg_spb Цитата(_pv @ Apr 11 2012, 12:05) а будет ... Apr 11 2012, 09:08 Сергей Борщ QUOTE (Anatoly74 @ Apr 11 2012, 10:34) До... Apr 11 2012, 10:23  ReAl Цитата(Aprox @ Apr 11 2012, 15:50) Но ни ... Apr 11 2012, 13:48   Сергей Борщ QUOTE (ReAl @ Apr 11 2012, 16:48) Сдвигае... Apr 11 2012, 14:03    mdmitry Получается, что в текущем варианте можно использо... Apr 11 2012, 14:35     Сергей Борщ QUOTE (mdmitry @ Apr 11 2012, 17:35) Полу... Apr 11 2012, 14:45      mdmitry Зануда:
А в документации страницы с 115 по 118, ... Apr 11 2012, 14:56 ReAl Цитата(Anatoly74 @ Apr 11 2012, 10:34) На... Apr 11 2012, 13:39 mdmitry Aprox, Вас ни кто не заставляет использовать эту О... Apr 11 2012, 20:06 dxp QUOTE (mdmitry @ Apr 11 2012, 21:56) Зану... Apr 12 2012, 03:44 viterra Дело в том, что с типами данных действительно БЕДА... Apr 12 2012, 10:05 IgorKossak Хочется надеяться, что на том и порешили.
Дальше, ... Apr 12 2012, 12:24 Aprox Цитата(IgorKossak @ Apr 12 2012, 16:24) Д... Apr 12 2012, 17:42  IgorKossak Цитата(Aprox @ Apr 12 2012, 20:42) А по д... Apr 12 2012, 17:56  MrYuran Цитата(Aprox @ Apr 12 2012, 21:42) А по д... Apr 12 2012, 17:57   ReAl Цитата(MrYuran @ Apr 12 2012, 20:57) А вы... Apr 12 2012, 20:33    Aprox Цитата(ReAl @ Apr 13 2012, 00:33) Я думаю... Apr 13 2012, 07:18     Nixon Цитата(Aprox @ Apr 13 2012, 10:18) Если ч... Apr 13 2012, 07:25      Aprox Цитата(Nixon @ Apr 13 2012, 11:25) Отличн... Apr 14 2012, 09:01     haker_fox QUOTE (Aprox @ Apr 13 2012, 15:18) В моем... Apr 13 2012, 15:24     ReAl Цитата(Aprox @ Apr 13 2012, 10:18) Нет, н... Apr 13 2012, 18:47 Nixon Хотелось бы в рантайме иметь возможность определен... Apr 12 2012, 12:33 mdmitry Цитата(Nixon @ Apr 12 2012, 16:33) Хотело... Apr 12 2012, 12:52 Сергей Борщ QUOTE (Nixon @ Apr 12 2012, 15:33) Хотело... Apr 12 2012, 12:59 Nixon Все правильно, но из плагина я читаю переменную ил... Apr 12 2012, 13:04 _Артём_ Цитата(Nixon @ Apr 12 2012, 16:04) Все пр... Apr 12 2012, 13:30 dxp QUOTE (IgorKossak @ Apr 13 2012, 00:56) П... Apr 13 2012, 03:35 ReAl Цитата(dxp @ Apr 13 2012, 06:35) Ну, а си... Apr 13 2012, 05:18 IgorKossak Цитата(dxp @ Apr 13 2012, 06:35) Одну я п... Apr 13 2012, 06:42 Lotor Позиция авторов, что задачи с одинаковым приоритет... Apr 13 2012, 06:44 dxp QUOTE (ReAl @ Apr 13 2012, 12:18) Кстати,... Apr 13 2012, 13:08 Lotor Цитата(dxp @ Apr 13 2012, 17:08) Смысл в ... Apr 13 2012, 13:46  IgorKossak Цитата(Lotor @ Apr 13 2012, 16:46) ... та... Apr 13 2012, 14:29 Nixon Хотел бы еще добавить свои пять копеек. IMHO полез... Apr 13 2012, 13:27 dxp QUOTE (Nixon @ Apr 13 2012, 20:27) По пов... Apr 13 2012, 17:29 Lotor Цитата(dxp @ Apr 13 2012, 21:29) Да, тему... Apr 16 2012, 04:20  VslavX Цитата(Lotor @ Apr 16 2012, 07:20) Я согл... Apr 16 2012, 06:19  sasamy Цитата(Aprox @ Apr 15 2012, 12:20) одна и... Apr 15 2012, 11:08  AHTOXA Цитата(Aprox @ Apr 15 2012, 14:20) Зачем ... Apr 15 2012, 13:57  ReAl Цитата(Aprox @ Apr 15 2012, 11:20) Видите... Apr 15 2012, 15:46 dxp QUOTE (Aprox @ Apr 15 2012, 15:20) Отдель... Apr 16 2012, 04:52 Lotor Цитата(dxp @ Apr 16 2012, 08:52) Почему б... Apr 16 2012, 05:48  dxp QUOTE (Lotor @ Apr 16 2012, 12:48) У меня... Apr 16 2012, 06:35   ReAl Цитата(dxp @ Apr 16 2012, 09:35) Кто сказ... Apr 16 2012, 07:29    dxp QUOTE (ReAl @ Apr 16 2012, 14:29) Та не™,... Apr 16 2012, 07:46     Lotor Цитата(dxp @ Apr 16 2012, 11:46) Кстати, ... Apr 16 2012, 08:44   Lotor Цитата(dxp @ Apr 16 2012, 10:35) Всё равн... Apr 16 2012, 07:29   VslavX Цитата(dxp @ Apr 16 2012, 09:35) Это что ... Apr 16 2012, 08:40    AHTOXA Цитата(VslavX @ Apr 16 2012, 14:40) Поэто... Apr 16 2012, 08:50     VslavX Цитата(AHTOXA @ Apr 16 2012, 11:50) ваш в... Apr 16 2012, 09:11      AHTOXA У меня нет ни IAR-а ни LCP17xx
BTW, а не было ли ... Apr 16 2012, 09:27       VslavX Цитата(AHTOXA @ Apr 16 2012, 12:27) У мен... Apr 16 2012, 09:34        AHTOXA Цитата(VslavX @ Apr 16 2012, 15:34) Думаю... Apr 16 2012, 09:48         VslavX Цитата(AHTOXA @ Apr 16 2012, 12:48) Предс... Apr 16 2012, 10:09          AHTOXA Цитата(VslavX @ Apr 16 2012, 16:09) Это в... Apr 16 2012, 11:12 dxp QUOTE (VslavX @ Apr 16 2012, 15:40) Опера... Apr 16 2012, 11:03 VslavX Цитата(dxp @ Apr 16 2012, 14:03) Я про ва... Apr 16 2012, 11:17  dxp QUOTE (VslavX @ Apr 16 2012, 18:17) По зн... Apr 16 2012, 11:47   VslavX Цитата(dxp @ Apr 16 2012, 14:47) Это хоро... Apr 16 2012, 11:59
3 страниц
1 2 3 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|