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

 
 
> FreeRTOS - минимальное время тика?
maxntf
сообщение May 22 2018, 09:36
Сообщение #1


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

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Всем привет.
На FreeRTOS вертятся 3 задачи, больше ничего из инструментария ОС не пользую.
Так вот когда configTICK_RATE_HZ установлен 1000Hz, все работает без проблем. Меняю это значение на 10000Hz, после ресета все задачи какое то время работают, а потом работает только одна - 2-я задача (скорее работает просто функция). Шедуллер перестает работать вовсе - vApplicationTickHook перестает вызываться и задачи не переключаются.
МК STM32L152rc работает на 16MHz.
В чем может быть дело?
Как отследить где планировщик заткнулся и почему?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
maxntf
сообщение May 29 2018, 10:17
Сообщение #2


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

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Потихоньку разбираюсь далее с FreeRTOS.
Возникла новая проблема, я ее решил но возможно не совсем правильно и не понимаю из за чего так получилось.
Сейчас системный тик 1мсек.
Может кто подскажет?

Есть таймер настроенный на 10мкс, на каждом прерывании он декрементирует глоб. переменную, значение которой задает Task2 (имеет самый высокий приоритет).
Когда переменная = 0, устанавливает семафор, чтоб разбудить задачу, которая установит новое значение переменной.
Код
//Task2
...
        IrState.ctim10ms = IrState.bRxTx[pValue->nComm][0];
        ctx_bit = 1;
        xSemaphoreTake(IrState.xSemNx, 0);
        T10_Init();
        while(ctx_bit <= IrState.cRxTx[pValue->nComm])
        {        
            [b]enableInterruptTIM10();[/b]
            if(xSemaphoreTake(IrState.xSemNx, 25) != pdTRUE) break;
            SwitchPWM;
            IrState.ctim10ms = IrState.bRxTx[pValue->nComm][ctx_bit];
            ctx_bit++;
        }
        T10_DeInit();
...

void TIM10_IRQHandler(void)
{
    static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
    
    if(TIM_GetFlagStatus(TIM10, TIM_FLAG_Update) != RESET)
    {
        TIM_ClearFlag(TIM10, TIM_FLAG_Update);
        if(IrState.ctim10ms) IrState.ctim10ms--;
        else
        {
            [b]disableInterruptTIM10();[/b]
            xSemaphoreGiveFromISR(IrState.xSemNx, &xHigherPriorityTaskWoken);
            portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
        }
    }
}

В общем пока я не начал отключать прерывания таймера (в коде выделил), все висло в обработчике таймера и ни одна задача управление не получает.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 29 2018, 11:11
Сообщение #3


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Любого ждет анафема, кто замечен за подобными злодеяниями - изменение глобальных объектов в фоне задачи и в прерываниях.
Допустимо, если будет только чтение таких объектов и оно атомарно (8...32-битное слово).
Как минимум непредсказуемые баги будут на самом ровном месте, а симптомы ни разу не однозначные. Поэтому найти такие баги крайне сложно!

Вот наглядный пример в Вашем коде:

процедура записи нового значения (между знаком "=") прервана прерыванием
Код
//Task2
...
        IrState.ctim10ms = IrState.bRxTx[pValue->nComm][0];
...


в котором будет выполнено это условие?

Код
void TIM10_IRQHandler(void)
{
....
        if(IrState.ctim10ms) IrState.ctim10ms--;
....
}


Зы. ту не поможет ни какая volatile.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 29 2018, 11:29
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ May 29 2018, 14:11) *
Любого ждет анафема, кто замечен за подобными злодеяниями - изменение глобальных объектов в фоне задачи и в прерываниях.

Ничего там криминального нет с IrState.ctim10ms, так как в задаче выполняется только запись в неё (хоть объявления IrState.ctim10ms не видно, но думаю что она - одного из встроенных типов), а запись встроенного типа 8/16/32/64 бита на Cortex-M - атомарна.
В ISR выполняется чтение-модификация-запись, приоритет ISR заведомо выше любого таска, так что таск не сможет прерывать ISR. А значит и операции внутри ISR для тасков - атомарны.

Цитата(Forger @ May 29 2018, 14:11) *
Допустимо, если будет только чтение таких объектов и оно атомарно (8...32-битное слово).

Для чтения/записи 64-битных переменных например IAR использует LDRD/STRD, а они тоже атомарны.

Цитата(Forger @ May 29 2018, 14:11) *
процедура записи нового значения (между знаком "=") прервана прерыванием
в котором будет выполнено это условие?
...

И что? Пускай прервана. Она не прервёт посередине операции записи (запись атомарна), а только перед или после.
К тому же как я понимаю: указанный участок внутри таска начнёт выполняться только когда IrState.ctim10ms == 0. А при этом в ISR никакого декремента не делается, только чтение.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 29 2018, 13:01
Сообщение #5


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Я же все объяснил на конкретном примере.

Еще раз, но на пальцах:
Пусть IrState.ctim10ms равно, скажем 10, но прерывание еще не возникло и в этот момент выполняется в задаче это кусок:

IrState.ctim10ms = IrState.bRxTx[pValue->nComm][0];

скажем нас прервали как раз перед записью нового значения в IrState.ctim10ms, собирались записать туда 100, которые тока что вычитали из IrState.bRxTx[pValue->nComm][0]

и тут вдруг возникает прерывание, где мы вполняем эту строчку:
if(IrState.ctim10ms) IrState.ctim10ms--;

логично, что после выхода из прерывания будет IrState.ctim10ms = 9,
а тут мы выходим из прерывания и тут же загоняем в IrState.ctim10ms = 100

Не знаю, как это скажется на логике работы прерывания, но явно, что в следующем вызове прерывания вместо 9 вдруг получить 100 - очень странно.
Как себя поведет прога в таком случае остается только гадать.... smile3046.gif


Цитата
К тому же как я понимаю: указанный участок внутри таска начнёт выполняться только когда IrState.ctim10ms == 0.

Ну-ну. Но чуть-чуть поменяли логику и привет? Ловим баги на ровном месте, через час/сутки/год? Тут кому как повезет.

Существуют неписанные правила: доступ к глобальным объектам при чтении-модификации-записи (из задачи) должен быть защищен от любых прерываний, которые могут этот объект изменить посреди этой цепочки.
Для таких случае в простейшем варианте можно использовать критическую секцию.
А в идеале - вообще избегать "дергать" один и тот же глобальный объект из задачи и прерываний. Есть решения.
К тому же нужно постоянно держать в голове - "а что будет, если ... ". Кому нужна доп. головная боль на ровном месте?

В той же MISRA вообще рекомендуют избегать или на край очень осторожно использовать глобальные объекты.
Разумеется, если используются прерывания. Но где их нынче не используют? wink.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 29 2018, 13:37
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ May 29 2018, 16:01) *
а тут мы выходим из прерывания и тут же загоняем в IrState.ctim10ms = 100

И что???

Цитата(Forger @ May 29 2018, 16:01) *
Не знаю, как это скажется на логике работы прерывания, но явно, что в следующем вызове прерывания вместо 9 вдруг получить 100 - очень странно.

А сколько там должно быть после записи 100? 200 что-ли? smile3046.gif
В чём проблема-то??
В программе написано "записать 100", код это делает? Делает. Никакие прерывания этому не мешают. Так в чём проблема, что Вас смущает?

Цитата(Forger @ May 29 2018, 16:01) *
Существуют неписанные правила: доступ к глобальным объектам при чтении-модификации-записи (из задачи) должен быть защищен от любых прерываний, которые могут этот объект изменить посреди этой цепочки.

Проблема тут только в том, что чтение-модификацию-запись (в задаче) переменной IrState.ctim10ms в указанном примере видите здесь похоже только Вы.... laughing.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение May 29 2018, 13:51
Сообщение #7


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ May 29 2018, 16:37) *
В программе написано "записать 100", код это делает? Делает. Никакие прерывания этому не мешают. Так в чём проблема, что Вас смущает?

Это мешает самим прерываниям, точнее, нарушает логику работы кода внутри этих самых прерываний.

Короче, я указал на потенциально опасное место в коде.
И связано оно именно с обращениям к одним и тем же глобальным объектам из фона задачи и прерываний БЕЗ соотв. защиты.

Даже, если в самом коде это в данный момент работает, ну, какое-то определенное время работает. Хотя бы в текущей версии.
Если игнорировать эти вещи, то все может стать только хуже, особенно, когда проект практически готов, но сбоит на ровном месте и в самый неожиданный момент.
К тому же, судя по всему, ТС только-только осваивает RTOS и поэтому много может просто не знать. Особенно про такие очень скверные грабли с глобальными объектами.
Или Вы считаете, что это - не грабли, и так делать нормально и безопасно? wink.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 29 2018, 14:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ May 29 2018, 16:51) *
Или Вы считаете, что это - не грабли, и так делать нормально и безопасно? wink.gif

Ещё раз: грабли там видите только Вы.
Никаких проблем (по крайней мере с работой этой переменной) в указанном фрагменте нет.
Сериализация доступа необходима только в случае неатомарных операций с переменной в прерываемом коде. Операции записи базовых типов данных в Cortex-M - все атомарные. Т.е. - в Task2 нет неатомарных операций с IrState.ctim10ms. Критические секции (или подобное) там как собаке пятая нога.

PS: Кто-нить ещё, кроме Forger, видит проблему с работой IrState.ctim10ms ? rolleyes.gif

PPS: ТСу можно разве что посоветовать объявить IrState.ctim10ms с модификатором volatile. Хотя возможно что он уже есть, так как объявления её не приведено.
Go to the top of the page
 
+Quote Post
maxntf
сообщение May 29 2018, 14:27
Сообщение #9


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

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Цитата(jcxz @ May 29 2018, 17:00) *
PPS: ТСу можно разве что посоветовать объявить IrState.ctim10ms с модификатором volatile. Хотя возможно что он уже есть, так как объявления её не приведено.

Проблема не с переменной.
Я не пойму (от незнания) почему висит ОС вот здесь:
Цитата
xSemaphoreGiveFromISR(IrState.xSemNx, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);

В том случае если Task2 еще не дошла до обработки семафора IrState.xSemNx.
То есть глючить начинает когда в прерывании первый раз семафор установили, в задаче его еще не забрали (не успели) и потом в прерывании срабатывают снова эти строки каждые 10мкс. (так как IrState.ctim10ms = 0 и его никто не устанавливает).

Сообщение отредактировал maxntf - May 29 2018, 14:28
Go to the top of the page
 
+Quote Post
Forger
сообщение May 29 2018, 14:39
Сообщение #10


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(maxntf @ May 29 2018, 17:27) *
Проблема не с переменной.
Я не пойму (от незнания) почему висит ОС вот здесь:

В том случае если Task2 еще не дошла до обработки семафора IrState.xSemNx.
То есть глючить начинает когда в прерывании первый раз семафор установили, в задаче его еще не забрали (не успели) и потом в прерывании срабатывают снова эти строки каждые 10мкс. (так как IrState.ctim10ms = 0 и его никто не устанавливает).


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

Этот как готовить первый раз какое-нить новое блюдо - что-то положили, пробуем, анализируем. Но никогда не кладем все сразу скопом к одну кастрюлю )))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
maxntf
сообщение May 29 2018, 14:44
Сообщение #11


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

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Цитата(Forger @ May 29 2018, 17:39) *
Для начала попробуйте упростить код до минимум...

Этим и планирую заняться. Попробую добиться глюков на простом коде (если получиться), а потом опишу непонятные мне моменты.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- maxntf   FreeRTOS - минимальное время тика?   May 22 2018, 09:36
- - nanorobot   Цитата(maxntf @ May 22 2018, 14:36) Всем ...   May 22 2018, 09:57
- - haker_fox   QUOTE (maxntf @ May 22 2018, 17:36) Как о...   May 22 2018, 10:24
|- - maxntf   Цитата(haker_fox @ May 22 2018, 13:24) 1....   May 22 2018, 11:27
- - k155la3   Цитата(maxntf @ May 22 2018, 12:36) . . ....   May 22 2018, 10:31
|- - haker_fox   QUOTE (k155la3 @ May 22 2018, 18:31) Рабо...   May 22 2018, 10:34
- - k155la3   Кроме всего, проверьте значения стеков задач (не п...   May 22 2018, 11:43
|- - maxntf   Цитата(k155la3 @ May 22 2018, 14:43) Можн...   May 22 2018, 11:53
|- - k155la3   Цитата(maxntf @ May 22 2018, 14:53) В Кеи...   May 22 2018, 12:02
|- - maxntf   Цитата(k155la3 @ May 22 2018, 15:02) Апп....   May 22 2018, 12:27
|- - esaulenka   Цитата(maxntf @ May 22 2018, 15:27) В общ...   May 22 2018, 12:44
|- - k155la3   Цитата(maxntf @ May 22 2018, 15:27) Не по...   May 22 2018, 13:19
- - maxntf   Я функцию TSL_tim_ProcessIT перенес в TIM3. Возмож...   May 22 2018, 12:58
|- - esaulenka   Цитата(maxntf @ May 22 2018, 15:58) Я фун...   May 22 2018, 14:21
- - haker_fox   QUOTE (k155la3 @ May 22 2018, 19:43) Кром...   May 22 2018, 13:08
|- - maxntf   Цитата(haker_fox @ May 22 2018, 16:08) Кс...   May 23 2018, 10:57
- - Forger   Цитата(maxntf @ May 22 2018, 12:36) Меняю...   May 22 2018, 17:56
- - uriy   Тоже никогда не делал меньше 1 мс. Зачем вам это п...   May 23 2018, 04:19
|- - k155la3   Цитата(uriy @ May 23 2018, 07:19) Тоже ни...   May 23 2018, 08:55
|- - Forger   Цитата(k155la3 @ May 23 2018, 11:55) Зада...   May 23 2018, 09:01
- - maxntf   Нашел костыль. В функции обработка кнопок есть деф...   May 23 2018, 12:16
|- - Forger   Цитата(maxntf @ May 23 2018, 15:16) Нашел...   May 23 2018, 12:25
||- - maxntf   Цитата(Forger @ May 23 2018, 15:25) Это е...   May 23 2018, 12:46
||- - Forger   Цитата(maxntf @ May 23 2018, 15:46) Нужны...   May 23 2018, 12:49
|- - esaulenka   Цитата(maxntf @ May 23 2018, 15:16) Нашел...   May 23 2018, 19:46
||- - maxntf   Цитата(esaulenka @ May 23 2018, 22:46) Со...   May 24 2018, 08:26
||- - Forger   Цитата(maxntf @ May 24 2018, 11:26) Тольк...   May 24 2018, 09:59
|- - jcxz   Цитата(maxntf @ May 23 2018, 15:16) , а я...   May 23 2018, 22:31
|- - volodya   Цитата(jcxz @ May 24 2018, 01:31) А какой...   May 24 2018, 04:27
|- - jcxz   Цитата(volodya @ May 24 2018, 07:27) Вот ...   May 24 2018, 06:17
|- - Forger   Цитата(jcxz @ May 24 2018, 09:17) вместе ...   May 24 2018, 06:27
|- - jcxz   Цитата(Forger @ May 24 2018, 09:27) вся о...   May 24 2018, 11:11
|- - Forger   Цитата(jcxz @ May 24 2018, 14:11) Мне тож...   May 24 2018, 12:03
|- - jcxz   Цитата(Forger @ May 24 2018, 15:03) Работ...   May 24 2018, 13:59
|- - Forger   Цитата(jcxz @ May 24 2018, 16:59) Что зна...   May 24 2018, 14:14
- - Arlleex   FreeRTOS работает хорошо и правильно, если с ней п...   May 24 2018, 07:28
- - Baser   Цитата(jcxz @ May 24 2018, 01:31) А какой...   May 24 2018, 08:34
|- - Turnaev Sergey   Цитата(Baser @ May 24 2018, 11:34) А по м...   May 24 2018, 13:25
|- - esaulenka   Цитата(Turnaev Sergey @ May 24 2018, 16:2...   May 25 2018, 07:31
|- - jcxz   Цитата(esaulenka @ May 25 2018, 10:31) Кл...   May 25 2018, 19:29
- - maxntf   Что то кажется мне, что дело не в тачлиб, во второ...   May 24 2018, 09:14
- - uriy   ЦитатаНо есть и минус (для меня): пока что нет у S...   May 25 2018, 05:04
|- - Forger   Цитата(uriy @ May 25 2018, 08:04) А про э...   May 25 2018, 05:14
- - uriy   У меня было такое же мнение о вертикальной прокрут...   May 25 2018, 06:12
|- - Forger   Цитата(uriy @ May 25 2018, 09:12) А J-lin...   May 25 2018, 06:17
|- - jcxz   Цитата(maxntf @ May 29 2018, 13:17) Есть ...   May 29 2018, 10:26
||- - maxntf   Цитата(jcxz @ May 29 2018, 13:26) Чтобы н...   May 29 2018, 10:33
||- - jcxz   Цитата(maxntf @ May 29 2018, 13:33) P.S. ...   May 29 2018, 10:44
||- - ViKo   Цитата(jcxz @ May 29 2018, 13:44) у Вас в...   May 29 2018, 11:04
||- - jcxz   Цитата(ViKo @ May 29 2018, 14:04) 1600 А ...   May 29 2018, 11:07
||- - ViKo   Цитата(jcxz @ May 29 2018, 14:07) А если ...   May 29 2018, 11:11
||- - jcxz   Цитата(ViKo @ May 29 2018, 14:11) 10 кГц ...   May 29 2018, 11:17
||- - ViKo   Я думал, речь идет по-прежнему про частоту работы ...   May 29 2018, 11:24
|- - Forger   Цитата(jcxz @ May 29 2018, 17:00) Ещё раз...   May 29 2018, 14:15
|- - Arlleex   Цитата(jcxz @ May 29 2018, 18:00) PS: Кто...   May 29 2018, 14:50
|- - jcxz   Цитата(Arlleex @ May 29 2018, 17:50) ... ...   May 29 2018, 15:27
|- - Forger   Цитата(jcxz @ May 29 2018, 18:27) Где там...   May 29 2018, 16:51
- - maxntf   В общем выкинул все лишнее из программы. ТО таймер...   May 30 2018, 07:05
|- - Forger   Цитата(maxntf @ May 30 2018, 10:05) В общ...   May 30 2018, 07:13
||- - maxntf   Цитата(Forger @ May 30 2018, 10:13) Помен...   May 30 2018, 07:17
||- - Forger   Цитата(maxntf @ May 30 2018, 10:17) ну в ...   May 30 2018, 07:23
||- - maxntf   Цитата(Forger @ May 30 2018, 10:23) Если ...   May 30 2018, 07:25
||- - Forger   Цитата(maxntf @ May 30 2018, 10:25) Не в ...   May 30 2018, 07:32
||- - maxntf   Цитата(Forger @ May 30 2018, 10:32) Я смо...   May 30 2018, 07:51
||- - Arlleex   Цитата(maxntf @ May 30 2018, 11:51) Да та...   May 30 2018, 08:05
|- - jcxz   Цитата(maxntf @ May 30 2018, 10:05) Если ...   May 30 2018, 07:36
- - maxntf   Привожу проблемные участки кода (инициализация та ...   May 30 2018, 07:35
- - maxntf   Все разобрался, не верно обрабатывал семафор. Нужн...   May 30 2018, 08:06
- - Arlleex   Кодif(xSemaphoreGiveFromISR(xSemNx, &x...   May 30 2018, 08:17
|- - maxntf   Цитата(Arlleex @ May 30 2018, 11:17) Кодi...   May 30 2018, 08:25
|- - jcxz   Цитата(maxntf @ May 30 2018, 11:25) На св...   May 30 2018, 08:32
- - maxntf   На семафоре полностью развязать задачу я не смог, ...   May 30 2018, 13:03
|- - Forger   Цитата(maxntf @ May 30 2018, 16:03) Если ...   May 30 2018, 13:06
|- - maxntf   Цитата(Forger @ May 30 2018, 16:06) Очере...   May 30 2018, 13:29
||- - Forger   Цитата(maxntf @ May 30 2018, 16:29) Я спр...   May 30 2018, 13:33
||- - maxntf   Цитата(Forger @ May 30 2018, 16:33) Напос...   May 30 2018, 13:50
||- - Forger   Цитата(maxntf @ May 30 2018, 16:50) xHigh...   May 30 2018, 14:14
|- - esaulenka   Цитата(Forger @ May 30 2018, 16:06) Очере...   May 30 2018, 15:30
|- - Forger   Цитата(esaulenka @ May 30 2018, 18:30) Ра...   May 30 2018, 15:34
- - maxntf   Не тот пример был.   May 30 2018, 14:30
- - esaulenka   Никакой конкретики. Отлично. Ещё раз. Пожалуйста, ...   May 30 2018, 17:15
|- - Forger   Цитата(esaulenka @ May 30 2018, 20:15) .....   May 30 2018, 17:31
|- - maxntf   Цитата(esaulenka @ May 30 2018, 20:15) Ни...   May 30 2018, 17:58
|- - Forger   Цитата(maxntf @ May 30 2018, 20:58) Чтоб ...   May 30 2018, 18:27
- - Arlleex   Взял отладку на STM32F429, повторил код автора топ...   May 30 2018, 19:41
|- - jcxz   Цитата(Arlleex @ May 30 2018, 22:41) Взял...   May 30 2018, 20:05
|- - Arlleex   Цитата(jcxz @ May 30 2018, 23:05) Пролист...   May 30 2018, 20:15
- - maxntf   Всем участникам спасибо за помощь и в некоторых сл...   May 31 2018, 13:15
- - Arlleex   Цитата(maxntf @ May 31 2018, 17:15) В нач...   May 31 2018, 13:44
- - maxntf   Цитата(Arlleex @ May 31 2018, 16:44) Еще ...   May 31 2018, 13:46
2 страниц V   1 2 >


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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 06:03
Рейтинг@Mail.ru


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