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

Jozef

На чем писать  

595 проголосовавших

  1. 1. Что чаще используете в разработках?

    • Assembler
      165
    • C
      303
    • Что-то еще
      66


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

  • 4 месяца спустя...

ASM.

Почему? Ну, причин много.

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

2) AVR ассемблер несложен - всего-то, 118 команд.

3) У асмы очень простой синтаксис.

4) Из других языков знаю только Pascal. Синтаксис Си для меня крайне неудобоваримый.

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

  • 2 месяца спустя...

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

Простое, то оно простое, но задачи может решать достаточно сложные.

>>2) AVR ассемблер несложен - всего-то, 118 команд.

Если пересчитать количество "ключевых" слов СИ, то получаться меньше 118

>>3) У асмы очень простой синтаксис.

ldi r17,18

и потом ищи где r17 равен 18, а где регистр еще на что понадобился и было внесено новое значение.

unsigned char r17 = 18;

В зависимости от места объявления, очень четкие правила жизни и области видимости данной переменной.

>>4) Из других языков знаю только Pascal. Синтаксис Си для меня крайне неудобоваримый

не буду комментировать

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

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

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

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

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

А как вы на пример на асме делите на 10? Я на си пишу А=А/10; и не заморачиваюсь.

Посчитать и на си все можно, обычно все компиляторы генерят асм файл. Открой и посмотри нужный кусочек. Любой отладчик даже показывает время выполнения каждой команды (сам считает). В той же AVR Studio можно открыть окно дизасемблера и видно что наваял тебе компилятор. К стати ваяет вполне себе не плохо. Не надо думать о инициализации стека, о том какие регистры можно использовать для загрузки константы, какие нет. Все функции, что компилятор транслирует с Си на Асм (например for) писали такие же программисты на асме и не дурнее нас с вами. Разное написание одного и того же цикла на си дает конечно разные результаты на асме, ну так ведь можно поиграться и посмотреть, что для этого компилятора лучше использовать и т.о. писать оптимальный код.

Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

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

  • 5 недель спустя...

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

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

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

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

Где-то проскальзывала прикидка, что Ассемблер вчетверо быстрее С

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

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

А как вы на пример на асме делите на 10? Я на си пишу А=А/10; и не заморачиваюсь.

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

В чем недостаток ЯВУ, так это в том что невозможно выбрать конкретную реализацию алгоритма в конкретных условиях. Ведь не векрет что одно и то же действие можно реализовать многими способами, которые обладают своими характеристиками 1) быстродействием 2) занимаемыми ресурсами 3) количеством программной памяти. И как правило они взаимоисключающие.

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

Учение - изучение правил. Опыт - изучение исключений.

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

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

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

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

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

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

чем шире кругозор, тем тупее угол обозрения

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

Свой код на Ассме (такого размера) обновляется в памяти минут через 30-ть (код все же СВОЙ). И сразу же бросаются в глаза алгоритмы, которые можно (и нужно) оптимизировать еще. Появляется мысль "чем думал, когда писАл". :)

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

Открыл, посмотрел ... сразу пришло в голову мысль что можно было активно использовать макроподстановки и как-то упорядочить все. Идея алгоритма сразу обновилась в голове по коментариям. Написано все на АСМе. Правда строк всего 850.

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

Учение - изучение правил. Опыт - изучение исключений.

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

  • 4 недели спустя...
А как вы на пример на асме делите на 10? Я на си пишу А=А/10; и не заморачиваюсь.

И получаешь универсальный код на АСМе' date=' который можно было бы во многих случаях сократить раза в 4.

В чем недостаток ЯВУ, так это в том что невозможно выбрать конкретную реализацию алгоритма в конкретных условиях. Ведь не векрет что одно и то же действие можно реализовать многими способами, которые обладают своими характеристиками 1) быстродействием 2) занимаемыми ресурсами 3) количеством программной памяти. И как правило они взаимоисключающие.[/quote']

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

Свой код на Ассме (такого размера) обновляется в памяти минут через 30-ть (код все же СВОЙ). И сразу же бросаются в глаза алгоритмы, которые можно (и нужно) оптимизировать еще. Появляется мысль "чем думал, когда писАл". :)

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

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

Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

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

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

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

Почему же? Про идиотизм библиотек никто не говорил. Люди, которые их пишут, совсем не идиоты (они прекрасно понимают, кто их библиотеками будет пользоваться). Именно поэтому библиотеки адаптируются под универсальность применения, чтобы чел не заморачивался вопросом КАК ЭТО СДЕЛАТЬ, а просто писАл A=B/10 и делал это спокойно в любых алгоритмах. Но какой бы программист-библиотечник не был, он не сможет предвидеть какими регистрами программист-пользователь будет пользоваться активно, а какие у него будут простаивать без дела. Поэтому библиотеки часто используют наиболее стандартный набор регистров во всех алгоритмах. Чего только стоит "жонглирование" со стеком при переходах из функции в функцию (многкратные сохранения и восстановления, без которых можно спокойно обойтись, выбери другой регистр для операции). Однако существует ряд причин, когда нужно принять именно решение КАК ЭТО СДЕЛАТЬ ПРОЩЕ (ОПТИМАЛЬНЕЕ). Например нехватка памяти МК или же жесткие требования к времени выполнения программы (алгоритма). Вот тут Асм может помочь и очень существенно.

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

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

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

  • 3 месяца спустя...

Помогите народ. Пробую компилировать прогу в ICC for AVR, подключил файлы, которые даны сдесь для работы с графикой. При компиляции пишет:

!ERROR file 'ks_1.o': undefined symbol '_Delay_ms'

!ERROR file 'ks_1.o': undefined symbol '_Delay_mks'

C:\iccv7avr\bin\imakew.exe: Error code 1

В чем дело?

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

ИМХО:

Пока не поздно перейдите на другой компилятор. Или поздно?

Например мои предпочтения:

IAR

GCC

Код вижен (куда же без него)

ICC - судя по форумам мало распространен. Еще бы, платный да с прибомбасами

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

  • 2 месяца спустя...

Пишу на ассемблере,на днях попробовал си мое мнение ассемблер намного понятнее там что написал то и получил а Си больше походит на магию,одни указатели чего стоят, а на ассемблере это всего лишь команда ldd.

Не стоит особо ломать копья, рациональней писать на С с ассамблерными вставками. Т.е. критичные участки по быстродействию на ассеблере и остальное на С.

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

Возможно на си писать проше, но на асм зато понятно что и как делается (меняется понимание програмного кода).

Начинал писать на асм для компа еше под 95 винду, затем паскаль со вставками асм, теперь делфи. Потихоньку осваиваю си для мк. (так просто для себя)

P.C. И не считаю что время потерял.

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

Чего только стоит "жонглирование" со стеком при переходах из функции в функцию (многкратные сохранения и восстановления, без которых можно спокойно обойтись, выбери другой регистр для операции). Однако существует ряд причин, когда нужно принять именно решение КАК ЭТО СДЕЛАТЬ ПРОЩЕ (ОПТИМАЛЬНЕЕ). Например нехватка памяти МК или же жесткие требования к времени выполнения программы (алгоритма). Вот тут Асм может помочь и очень существенно.

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

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

При написании программы на языке высокого уровня, в любом случае придется сохранять в стек регистры при вызове процедуры, от этого никуда не денешься, но как я уже говорил, ЯВУ позволяет в большей степени сосредоточиться на задаче. Компромис есть всегда. Контролееры предсавлены сейчас широкой линейкой, с различным (часто вполне достаточным)объемом памяти для решения большинства задач, если ее не хватает, так же часто проще сменить контроллер, чем вылизывать программу на ассемблере, тем более, что современные задачи очень часто связаны с вопросами коммуникации с другими устройствами и библиотеки для этого есть на ЯВУ, их легко использовать, не отрываясь от решения основной задачи.

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

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

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

Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

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

Для этого существуют комментарии и макро-определения.

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

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

Учение - изучение правил. Опыт - изучение исключений.

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

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

Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

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

  • 1 месяц спустя...

дайте ссылку на отладчик на С для atiny2313, чтобы немного весил или скорость скачки была нормальная. Желательно под SP2

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

  • 1 месяц спустя...

AVR Studio + WinAVR не устраивают?

Или любой компилятор (Си, Асма, да хоть бейсика) + Proteus?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

  • 2 месяца спустя...

Ради интереса выкладываю простенькую программу написанную и отлаженную на Си примерно за 30 минут. Кто перепишет её на ассемблере? И за сколько времени?

/*****************************************************
Project : Comparator
Version : 1.0
Date	: 05.12.2011
Author  : mazzi
Company : Reanimator Extreme Edition

Chip type   			: ATtiny2313
AVR Core Clock frequency: 8.000000 MHz
Memory model        	: Tiny
External RAM size   	: 0
Data Stack size 		: 32
*****************************************************/

#include <tiny2313.h>

#define LED  PORTB.2
#define JMP1 PINB.6
#define JMP2 PINB.7

#define M_OFF_BLINK 0x00
#define M_ON_BLINK  0x01
#define T_BLINK 	0x10

#define LED_ON  0
#define LED_OFF 1

#define VOL_LO  1000
#define VOL_HI  5000
#define VOL_MAX 6000 

typedef unsigned char uchar;
typedef unsigned int  uint;

bit f_10ms;
uchar mode = M_OFF_BLINK;
uchar t_blink = 0;
uchar bit_blink = 0;
uint  volume;
void handler_blink(void);

//===============================================
// Timer1 overflow interrupt service routine
// период 10мс
interrupt [TIM1_OVF] void timer1_ovf_isr(void) {
  TCNT1H=0xFB1D >> 8;
  TCNT1L=0xFB1D & 0xff;
  f_10ms = 1;
}

void main(void) {
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Reset Source checking
  if (MCUSR & 1)   {   // Power-on Reset
  	MCUSR=0;
  	volume = 0;
  }
  else if (MCUSR & 2)   {   // External Reset
  	MCUSR=0;
  	volume = 0;
  }
  else if (MCUSR & 4)   {   // Brown-Out Reset
  	MCUSR=0;
  }
  else   {   // Watchdog Reset
  	MCUSR=0;
  // Place your code here
  };

// Input/Output Ports initialization
PORTA=0x00;
DDRA=0x00;
PORTB=0xC4;
DDRB=0x04;
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xFB;
TCNT1L=0x1D;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Global enable interrupts
#asm("sei")

  while (1)   {
  	if ( f_10ms ) {
       	f_10ms=0;
       	handler_blink(); 
       	if ( ACSR & 0x20 ) { //if ( Uin < Uop ) {
    			if (  volume < VOL_MAX ) volume++; 
    			if (( JMP1 == 0 )&&( volume < VOL_MAX )) volume++; 
    			if (( volume >= VOL_HI )&&( mode == M_OFF_BLINK )) mode = M_ON_BLINK;
       	}
       	else	{
    			if ( volume > 0 ) volume--;
    			if (( JMP1 == 0 )&&( volume > 0 )) volume--;
    			if (( volume < VOL_LO )&&( mode == M_ON_BLINK )) mode = M_OFF_BLINK;
       	} 	
       	if ( JMP2 == 0 ) {
    			if ( ACSR & 0x20 ) mode = M_ON_BLINK;
    			else   			mode = M_OFF_BLINK;
       	}
  	}
  	#asm("wdr")
  };
}

//========================================
void handler_blink(void) {
if ( mode == M_ON_BLINK ) {
   	if ( t_blink ) t_blink--;
   	else {
			t_blink = T_BLINK;
			bit_blink++;
			if ( bit_blink & 1 ) LED = LED_ON;
			else     			LED = LED_OFF;   
   	}
}
else LED = LED_OFF;
}

Пока ты жив, надежда есть.

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

Тоже за пол часа, не больше. Если конечно ЗАРАНЕЕ знать что должна делать программа.

Учение - изучение правил. Опыт - изучение исключений.

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

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

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

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

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

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

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

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

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

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

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

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