Перейти к содержанию

Язык СИ для микроконтроллеров


Рекомендуемые сообщения

Только что, my504 сказал:

Полагаете себя во всем правым, а свой опыт репрезентативным?

При чем тут мой опыт, если я вам СТАНДАРТ процитировал?

Когда вы пишите код, вы должны ЗНАТЬ, как он будет себя вести. В том и смысл стандарта, чтобы определить ОДНОЗНАЧНО поведение компилятора, даже если это поведение кому-то не нравится. И стандарт определил, что результат логического выражения - число 1 или число 0. Вы с этим спорите... Похоже, что во всём правым считаете себя именно вы...

Никакая внутренняя реализация не должна беспокоить программиста ЯВУ. Тем более что какой-нибудь GCC делает так, а какой-нибудь IAR - этак. А код на Си один и тот же, и поведение в итоге получается одно и то же.

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

55 минут назад, ARV сказал:

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

Угу. Только в МК никакого более высокого уровня нет... Это под Win или Линуксом между железом и программой куча прослоек (BIOS, HAL, драйвера, системный API), позволяющих абстрагироваться от железа. 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ARV сказал:

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

То есть править практически ВСЕ. Просто потому, что чисто вычислительная часть в МК занимает ничтожную часть кода.

Основная проблема в написании кода для управляющих систем - именно драйверы. Они отнимают 99% времени разработчика. Они зачастую плохо отлаживаются, они вызывают проблемы взаимодействия между собой, собственно в них и состоит смысл устройства.

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

ЗЫ. К слову, вычислительная часть тоже будет тем эффективнее, чем меньше программист будет пытаться делать ее переносимой.

Скажем, далеко не все компиляторы используют фичи ядра контроллера, принципиально повышающие производительность. В результате мы имеем более высокую стоимость МК.

1 час назад, ARV сказал:

При чем тут мой опыт, если я вам СТАНДАРТ процитировал?

Мне "болт" положить на стандарт, если он противоречит здравому смыслу в решении задач. Вы не проблему обсуждаете, а тупо повторяете тривиальные вещи. 

Потому что целью имеете игру в спор...

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, oldmao сказал:

Угу

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

Простой пример: работа с кнопками. Можно, как 90% любителей, во всех местах программы, где требуются кнопки, работать напрямую с портами, размазывая уровень абстракции по всей программе. А можно не только выделить всю работу с кнопками в отдельный модуль, но и в этом модуле работу с портами организовать в единственной функции, которую и придется переделать, если сменится архитектура.

Работа с дисплеем - аналогично.

Ввод-вывод - аналогично. Отличный пример - библиотека FatFs от Chan-а: три функции низкого уровня платформо-зависимы, а остальное - неизменно.

Да, в некоторых случаях, на особо малоресурсных платформах, приходится таким подходом жертвовать, т.к. разделение на слои/уровни все-таки некоторые накладные расходы несет. Но это исключение из правил, а не норма.

Вот еще пример из жизни: в Си есть вполне нормальная библиотека ввода-вывода stdio. Многие ли из любителей, скажем, AVR, ею пользуются именно для ввода-вывода? Из тех проектов, что я встречал, предел использования - это sprintf. То есть формируем строку, которую потом криво-косо по символам выводим то ли в USART, то ли на ЖКИ... А ведь раз уж ресурсов хватает, чтобы мириться с форматированным выводом, то с минимальными усилиями можно организовать работу printf сразу на ЖКИ или USART - чем не абстрагирование от платформы?  Но нет, мыши будут плакать, колоться, но продолжать жрать кактус...

Только что, my504 сказал:

Лишние уровни абстракций в управляющих устройствах ведут к дополнительным проблемам  и практически никак не увеличивают переносимость кода

Соглашусь. Лишние всегда лишние. А вот нормальные уровни абстракций, необходимые и достаточные, очень даже полезны. И если они вам не нравятся, то вы, вероятно, просто не умеете их готовить...

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

15 минут назад, ARV сказал:

вы, вероятно, просто не умеете их готовить...

Не смешите меня. Отдельно взятые кнопки и ЖК (даже графический) - это даже не режим реального времени. Это даже драйвером язык не поворачивается назвать (хотя канешна он и есть). Вы "посадите" Ваши кнопки и ЖК  в устройство, где на них практически нет времени, при этом нужно обеспечить "живую" динамичную картинку и такую же реакцию на кнопки.

Большинство подобных вещей реализуются через ДМА и никакой переносимости там не может быть В ПРИНЦИПЕ. Там даже функцию не создашь. Все драйверы - сплошной единый организм.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, my504 сказал:

Большинство подобных вещей реализуются через ДМА и никакой переносимости там не может быть В ПРИНЦИПЕ.

Ну я даже не знаю... Мой уровень выше AVR как-то не поднялся, там DMA нет. А вот как вы сумели, не зная правил вычисления логических выражений, стать гуру в DMA b драйверах - я не понимаю. И при всем при том библиотеки HAL для серьёзных МК существуют, а они и реализуют необходимый уровень абстракции. Единого стандарта нет, конечно, и поэтому работа по переходу с одного HAL на другой не так уж и проста, но тем не менее возможна.

 

Только что, my504 сказал:

Вы "посадите" Ваши кнопки и ЖК  в устройство, где на них практически нет времени, при этом нужно обеспечить "живую" динамичную картинку и такую же реакцию на кнопки.

Знаете, я как-то все время этим и занимаюсь... И, знаете, отлично получается. Вот некоторые жалкие примеры:

Скачать видео
Скачать видео

 

Скачать видео

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

А что в представленных примерах грузит МК? 10 точечный БПФ с 4 разрядным разрешением? :lol:

Однако Вы согласились со мной, что код с ДМА непереносим. Только речь шла не о другом МК, а о ДРУГОЙ ПЛАТФОРМЕ.

Что касается моей работы с ДМА, то она ни чем не отличается от обычного кода. Что до моей работы с выражениями, то я не вполне понял, что конкретно препятствует ей в моих познаниях?

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Ну предположим, не 10-точечный БПФ, а 64-точечный... что само по себе для AVR уже не слабая нагрузка. Вы хотели примеров - я дал из того, что у меня есть. Вы пока что философствуете без примеров, пытаясь заставить поверить вам на слово. Не серьёзно это.

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

Только что, my504 сказал:

Что до моей работы с выражениями, то я не вполне понял, что конкретно препятствует ей в моих познаниях?

Я просто поражен, как можно взлететь на высоты драйверов DMA, не понимая, как вычисляется логическое выражение и какой у него результат... но  это к слову. 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

:wall:

1 час назад, ARV сказал:

как вычисляется логическое выражение и какой у него результат

Именно, что мы с Марком понимаем, как это реализуется на реальных процессорах, а не на сферическом коне в вакууме... Стандарт может быть каким угодно, а вот его реализация в конкретном компиляторе - жёстко завязана на железо. И никакого противоречия со стандартом нет. Ведь false == 0? Всегда, что соответствует стандарту. А true != 0, что тоже соответствует стандарту. Причём именно в понимании авторов языка, а не в ваших фантазиях. Вам уже привели цитату из книги Ричи и Карнигана:  

Цитата

В языке С значение ИСТИНА представлено любым ненулевым значением, включая отрицательные числа. Значение ЛОЖЬ всегда представлено нулем.

 

Ссылка на комментарий
Поделиться на другие сайты

Только что, oldmao сказал:

Вам уже привели цитату из книги Ричи и Карнигана

Бог мой! Да ведь Ричи говорит о том, ЧТО ВЫ можете применить в качестве true, а вот ЧТО СИ ВЫДАСТ вам в качестве true - не говорит. А это говорит стандарт. Неужели это надо пояснять?!

Еще раз.

int x = (x + 1) * (y > 2); 

В этом выражении переменная x будет увеличена на 1, если y больше двух, а если y меньше или равно 2, то x будет обнулена. То есть вышеприведенный код эквивалентен следующему

if(y > 2)
  x += 1;
else
  x = 0;

Вы понимаете, что если тупо читать Ричи&Кернигана, то первый код вообще должен давать неизвестно какой результат, ведь неизвестно, чему будет равно (y > 2) - то ли 7, то ли 29879... любое ведь ненулевое...

Только это я вам и пытаюсь объяснить! 

Вышеприведенные примеры работают одинаково на любой платформе, и абсолютно не важно, какие регистры/биты/ячейки там задейстованы! И ваше с Марком понимание совершенно бесполезно! Ибо есть стандарт, который до вас все определил.

Только что, oldmao сказал:

Причём именно в понимании авторов языка, а не в ваших фантазиях.

Еще раз: ранее я цитировал стандарт Си, в котором нет ни буквы фантазий! И там однозначно сказано, что "истинный" результат логического выражения представлен в Си не каким-то "любым ненулевым числом", а вполне конкретным - ЕДИНИЦЕЙ, тип int, т.е. со знаком. О чем еще вы спорите?!

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

А какое отношение тип int имеет к boolean? В этом выражении "int x = (x + 1) * (y > 2);" все переменные автоматически приводятся к int перед вычислением выражения! Стандарт не по диагонали читайте! Правила приведения типов там есть. И к предмету спора это не относится, изначально спорить начали, что компилятор считает true/false при проверке условия, а не при вычислениях.

Ссылка на комментарий
Поделиться на другие сайты

Только что, oldmao сказал:

А какое отношение тип int имеет к boolean?

Да очень простое: тип boolean (а уж если точнее - костыль _bool) введены в стандарт буквально позавчера (утрирую), а до этого сто лет типа boolean в Си не было.

Только что, oldmao сказал:

все переменные автоматически приводятся к int перед вычислением выражения!

Ну и вы тогда уж не по диагонали расскажите мне, какая именно переменная тут хранит результат "логического  выражения" и по каким правилам осуществляется перевод логического значения в int? Может быть если начнете рассуждать самостоятельно, поймете, наконец, что результат логического выражения (y > 2) сразу имеет (при выполнении условия) значение 1 типа int, как я (и стандарт!!!) говорю. И никакого приведения типов по умолчанию тут не требуется.

Только что, oldmao сказал:

И к предмету спора это не относится, изначально спорить начали, что компилятор считает true/false при проверке условия, а не при вычислениях.

Еще как относится. Что компилятор считает - все согласны (любое не нулевое == истина), а вот что в результате вычисления логических выражений компилятор выдает - вот об этом спор идет.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, oldmao сказал:

А какое отношение тип int имеет к boolean? В этом выражении "int x = (x + 1) * (y > 2);" все переменные автоматически приводятся к int перед вычислением выражения! Стандарт не по диагонали читайте! Правила приведения типов там есть. И к предмету спора это не относится, изначально спорить начали, что компилятор считает true/false при проверке условия, а не при вычислениях.

вроде как речь ведется имено о типе результата вычисления выражения (y>2), как его можно привести в int до вычисления???

2 часа назад, my504 сказал:

Не смешите меня. Отдельно взятые кнопки и ЖК (даже графический) - это даже не режим реального времени. Это даже драйвером язык не поворачивается назвать (хотя канешна он и есть). Вы "посадите" Ваши кнопки и ЖК  в устройство, где на них практически нет времени, при этом нужно обеспечить "живую" динамичную картинку и такую же реакцию на кнопки.

Большинство подобных вещей реализуются через ДМА и никакой переносимости там не может быть В ПРИНЦИПЕ. Там даже функцию не создашь. Все драйверы - сплошной единый организм.

Это чО кнопки через ДМА у вас реализуются???

Потом, для etherneta DMA использование наблюдаю, а для ЖК что то не припомню.

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

24 минуты назад, ruhi сказал:

для etherneta DMA использование наблюдаю, а для ЖК что то не припомню

Не припоминаете в своих проектах ?
В чём разница использования DMA для езернета от использования для любого другого периферийного модуля ?

Ссылка на комментарий
Поделиться на другие сайты

51 минуту назад, ARV сказал:

что результат логического выражения (y > 2) сразу имеет (при выполнении условия) значение 1 типа int, как я (и стандарт!!!) говорю.

Ну так это и есть костыль. Мне никогда в голову не приходило использовать результат действий над логическими (boolean) переменными, как число (int в данном примере). Они для того и логические, что их задача - решить, что дальше делать (пойти налево или домой спать направо?), зачем их в численную математику вплетать? Укажите мне хоть одну реальную задачу, где это необходимо? И где нельзя применить стандартный int (или bit, применительно к ограниченным ресурсам МК)?

Изменено пользователем oldmao
Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, oldmao сказал:

Укажите мне хоть одну реальную задачу, где это необходимо?

a+=b<c;

:)

Ибо, зачем писать кучу текста с условиями, если можно написать небольшую строчку.

Ссылка на комментарий
Поделиться на другие сайты

Только что, oldmao сказал:

зачем их в численную математику вплетать? Укажите мне хоть одну реальную задачу, где это необходимо?

Снова ваше мнение и требования стандарта вступают в противоречие. Как вы думаете, кто прав в этом споре? Я думаю - стандарт :) а вам придется смириться с этим.

Тот факт, что вам не приходило в голову это делать, не отменяет существования этого явления. Результат логической операции в Си есть int, и либо 0, либо 1 в численном измерении. И ничего более. При этом любое численное значение, отличное от нуля, будет воспринято, как логическая истина, если это потребуется. И все - никаких фантазий.

Только что, oldmao сказал:

или bit

это не стандартный тип для Си

Кстати, @oldmao , вы в курсе, что (если копнуть как следует глубоко), в Си вообще нет никаких "самостоятельных" типов, кроме int? Формально все существующие типы есть производные от int (я имею ввиду, что если меняется int, то следом меняются и все прочие типы). И даже, не смотря на то, что элементарной единицей обрабатываемой информации в Си есть байт, для него нет отдельного окончательного типа? А char - это вовсе не байт, если смотреть совсем уж формально... И только (если не ошибаюсь) начиная со стандарта С99 введены типы строгой размерности, в том числе и для байта...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, Alex сказал:

А как же вещественные числа ?

Подловили! :huh: 

Ладно, поправлю свое мнение: нет независимых типов, кроме int и float :) 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Alex сказал:

Не припоминаете в своих проектах ?
В чём разница использования DMA для езернета от использования для любого другого периферийного модуля ?

Вы что имеете ввиду под "любого другого периферийного модуля"? То есть кнопка является "любым другим периферийным модулем"?

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Любого модуля, имеющегося на борту МК. Будь то USART, I2C, SPI, ... А чем уж им управлять - дело десятое.

И причём тут кнопка ? Речь шла о ЖКИ, для которого Вы не можете припомнить управление через DMA.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Alex сказал:

Не припоминаете в своих проектах ?
В чём разница использования DMA для езернета от использования для любого другого периферийного модуля ?

Хотя ладно, может Вам действительно интересно! Но я привык работать с реальными задачами,

Езернет (на моем процессоре по крайней мере) имеет внутреннее ФИФО куда помещает принятые данные, после чего(и для этого нужно соответствующим образом настроить ДМА езернет контроллера-он имеет свой выделенный!) чтобы переложить эти данные туда где они могут быть использованы кодом приложения,

А например SPI-модуль процессора имеет только регистр принятых данных(данных на отправку), который может быть назначен ДМА каналу в общем ДМА модуле процессора, как и любой другой регистр периферии процессора.

Конечно если вас интересует такая разница.

 

8 минут назад, Alex сказал:

Любого модуля, имеющегося на борту МК. Будь то USART, I2C, SPI, ... А чем уж им управлять - дело десятое.

И причём тут кнопка ? Речь шла о ЖКИ, для которого Вы не можете припомнить управление через DMA.

Дык я и хотел понять при чем тут кнопка, хорошо что ни при чем :)!

И да ЖКИ можно ( и нужно делать с использованием ДМА, если есть возможность), я бы только не называл это использование, "управлением через ДМА"!

Я когда с ними занимался, ДМА еще не было в моих процессорах.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, ruhi сказал:

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

Вы полагаете, что только Вы работаете с реальными задачами?

Причем тут эзернет?  К ДМА подключают те регистры периферии, которые требуются по даташиту и по конфигурации.

Есть список периферии, которую может обслуживать ДМА в данном МК. 

Никто о кнопках ничего не говорил. Речь шла о ЖК - графическом, символьном - любом. С любым интерфейсом (SPI, I2C, параллельный).

 

1 час назад, ARV сказал:

 а вам придется смириться с этим.

Зачем? Какой с этого прок?

Мне совершенно фиолетово и параллельно что написано в стандарте на язык Си по поводу логических выражений. Вы можете жонглировать цитатами, как статьями УК РФ. На написание кода это вообще никак не влияет. Строго говоря, стандарт в этом смысле нужен для писателей КОМПИЛЯТОРОВ. А мне лично нужен мануал на компилятор, а не стандарт на Си.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, oldmao сказал:

Ну так это и есть костыль. Мне никогда в голову не приходило использовать результат действий над логическими (boolean) переменными, как число (int в данном примере). Они для того и логические, что их задача - решить, что дальше делать (пойти налево или домой спать направо?), зачем их в численную математику вплетать? Укажите мне хоть одну реальную задачу, где это необходимо? И где нельзя применить стандартный int (или bit, применительно к ограниченным ресурсам МК)?

Мне достаточно, чтобы было удобно, о необходимости речь не идет (обычно)!

А когда это удобно Вам привели примеры.

Хотя если рассматривать оптимизацию под конкретный ассемблер (например АРМ-ассемблер), то такие конструкции могут рассматриваться как необходимые, как раз в целях экономии ограниченных ресурсов производительности процессора!

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, ruhi сказал:

А когда это удобно Вам привели примеры.

В чем состоит пример? В каком то синтаксисе?

Это смешно. Кто короче запишет некую программную сущность - тот и молодец?

Хрень какая то...

С одной стороны декларируется, что нужно заботиться о читабельности кода, а с другой ТОТ ЖЕ САМЫЙ ЧЕЛОВЕК  виртуозно строчит код, который напоминает головоломки из журналов Квант. Нахрена?  Чтобы тут же завалить код комментами?

:lol:

Прикол еще и в том, что этот самый компактный код на Си разворачивается в перректальный АСМ. И потом нужно разбираться в последствиях...

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...