27.01.2014, 13:44
|
#121
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Скиньте полностью листинг для:
PHP код:
|
#include ‹mega16.h›
unsigned int a,b,c,d;
// Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { a++; b--; c=a+b; d ^= 1; }
void main(void) { DDRA = 0b00001111; PORTA = 0b00000000;
// Timer Period: 0,016 ms TCCR0 = (0‹‹WGM00) | (0‹‹COM01) | (0‹‹COM00) | (0‹‹WGM01) | (0‹‹CS02) | (0‹‹CS01) | (1‹‹CS00); TCNT0 = 0x00; OCR0 = 0x00; TIMSK = (1‹‹TOIE0);
#asm("sei") begin: if(a == 100) PINA |= 1; if(b == 200) PINA |= 2; if(c == 75) PINA |= 4; if(d == 1) PINA |= 8; goto begin; }
|
Самому интересно, насколько хуже код.
|
Ну смотрите:
Код:
|
\ 00000000 DS8 1
2 #include ‹inavr.h›
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?‹Segment init: NEAR_Z›`
3 unsigned int a,b,c,d;
\ a:
\ 00000000 DS8 2
\ b:
\ 00000002 DS8 2
\ c:
\ 00000004 DS8 2
\ d:
\ 00000006 DS8 2
4
5 // Timer 0 overflow interrupt service routine
6 #pragma vector=TIMER0_OVF_vect
\ In segment CODE, align 2, keep-with-next
7 __interrupt void timer0_ovf_isr(void)
\ timer0_ovf_isr:
8 {
\ 00000000 93FA ST -Y, R31
\ 00000002 93EA ST -Y, R30
\ 00000004 934A ST -Y, R20
\ 00000006 933A ST -Y, R19
\ 00000008 932A ST -Y, R18
\ 0000000A 931A ST -Y, R17
\ 0000000C 930A ST -Y, R16
\ 0000000E B74F IN R20, 0x3F
9 a++;
\ 00000010 .... LDI R30, LOW(a)
\ 00000012 .... LDI R31, (a) ›› 8
\ 00000014 8100 LD R16, Z
\ 00000016 8111 LDD R17, Z+1
\ 00000018 5F0F SUBI R16, 255
\ 0000001A 4F1F SBCI R17, 255
\ 0000001C 8300 ST Z, R16
\ 0000001E 8311 STD Z+1, R17
10 b--;
\ 00000020 8102 LDD R16, Z+2
\ 00000022 8113 LDD R17, Z+3
\ 00000024 5001 SUBI R16, 1
\ 00000026 4010 SBCI R17, 0
\ 00000028 8302 STD Z+2, R16
\ 0000002A 8313 STD Z+3, R17
11 c=a+b;
\ 0000002C 8100 LD R16, Z
\ 0000002E 8111 LDD R17, Z+1
\ 00000030 8122 LDD R18, Z+2
\ 00000032 8133 LDD R19, Z+3
\ 00000034 0F02 ADD R16, R18
\ 00000036 1F13 ADC R17, R19
\ 00000038 8304 STD Z+4, R16
\ 0000003A 8315 STD Z+5, R17
12 d ^= 1;
\ 0000003C E001 LDI R16, 1
\ 0000003E 8126 LDD R18, Z+6
\ 00000040 8137 LDD R19, Z+7
\ 00000042 2720 EOR R18, R16
\ 00000044 2333 TST R19
\ 00000046 8326 STD Z+6, R18
\ 00000048 8337 STD Z+7, R19
13 }
\ 0000004A BF4F OUT 0x3F, R20
\ 0000004C 9109 LD R16, Y+
\ 0000004E 9119 LD R17, Y+
\ 00000050 9129 LD R18, Y+
\ 00000052 9139 LD R19, Y+
\ 00000054 9149 LD R20, Y+
\ 00000056 91E9 LD R30, Y+
\ 00000058 91F9 LD R31, Y+
\ 0000005A 9518 RETI
14
\ In segment CODE, align 2, keep-with-next
15 void main(void)
\ main:
16 {
\ 00000000 2E08 MOV R0, R24
17 DDRA = 0x0F;
\ 00000002 E00F LDI R16, 15
\ 00000004 BB0A OUT 0x1A, R16
18 PORTA = 0x00;
\ 00000006 E000 LDI R16, 0
\ 00000008 BB0B OUT 0x1B, R16
19
20 // Timer Period: 0,016 ms
21 TCCR0 = (0‹‹WGM00) | (0‹‹COM01) | (0‹‹COM00) | (0‹‹WGM01) | (0‹‹CS02) | (0‹‹CS01) | (1‹‹CS00);
\ 0000000A E001 LDI R16, 1
\ 0000000C BF03 OUT 0x33, R16
22 TCNT0 = 0x00;
\ 0000000E E000 LDI R16, 0
\ 00000010 BF02 OUT 0x32, R16
23 OCR0 = 0x00;
\ 00000012 BF0C OUT 0x3C, R16
24 TIMSK = (1‹‹TOIE0);
\ 00000014 E001 LDI R16, 1
\ 00000016 BF09 OUT 0x39, R16
25
26 __enable_interrupt();
\ 00000018 9478 SEI
\ 0000001A .... LDI R30, LOW(a)
\ 0000001C .... LDI R31, (a) ›› 8
\ 0000001E 8106 LDD R16, Z+6
\ 00000020 8117 LDD R17, Z+7
\ 00000022 8124 LDD R18, Z+4
\ 00000024 8135 LDD R19, Z+5
\ 00000026 8142 LDD R20, Z+2
\ 00000028 8153 LDD R21, Z+3
27 begin:
28 if(a == 100) PINA |= 1;
\ ??main_0:
\ 0000002A 8160 LD R22, Z
\ 0000002C 8171 LDD R23, Z+1
\ 0000002E 3664 CPI R22, 100
\ 00000030 E080 LDI R24, 0
\ 00000032 4070 SBCI R23, 0
\ 00000034 F409 BRNE ??main_1
\ 00000036 9AC8 SBI 0x19, 0x00
29 if(b == 200) PINA |= 2;
\ ??main_1:
\ 00000038 3C48 CPI R20, 200
\ 0000003A 0758 CPC R21, R24
\ 0000003C F409 BRNE ??main_2
\ 0000003E 9AC9 SBI 0x19, 0x01
30 if(c == 75) PINA |= 4;
\ ??main_2:
\ 00000040 342B CPI R18, 75
\ 00000042 0738 CPC R19, R24
\ 00000044 F409 BRNE ??main_3
\ 00000046 9ACA SBI 0x19, 0x02
31 if(d == 1) PINA |= 8;
\ ??main_3:
\ 00000048 3001 CPI R16, 1
\ 0000004A 0718 CPC R17, R24
\ 0000004C F771 BRNE ??main_0
\ 0000004E 9ACB SBI 0x19, 0x03
\ 00000050 CFEC RJMP ??main_0
\ 00000052 REQUIRE _A_DDRA
\ 00000052 REQUIRE _A_PORTA
\ 00000052 REQUIRE _A_TCCR0
\ 00000052 REQUIRE _A_TCNT0
\ 00000052 REQUIRE _A_OCR0
\ 00000052 REQUIRE _A_TIMSK
\ 00000052 REQUIRE _A_PINA
32 goto begin;
33 }
\ In segment INTVEC, offset 0x24, root
\ `??timer0_ovf_isr??INTVEC 36`:
\ 00000024 ........ JMP timer0_ovf_isr
Maximum stack usage in bytes:
CSTACK RSTACK Function
------ ------ --------
0 2 main
7 2 timer0_ovf_isr
Segment part sizes:
Bytes Function/Label
----- --------------
4 ??timer0_ovf_isr??INTVEC 36
1 _A_DDRA
1 _A_OCR0
1 _A_PINA
1 _A_PORTA
1 _A_TCCR0
1 _A_TCNT0
1 _A_TIMSK
8 a
b
c
d
82 main
92 timer0_ovf_isr
6 -- Other
7 bytes in segment ABSOLUTE
174 bytes in segment CODE
6 bytes in segment INITTAB
4 bytes in segment INTVEC
8 bytes in segment NEAR_Z
174 bytes of CODE memory (+ 10 bytes shared)
8 bytes of DATA memory (+ 7 bytes shared)
Errors: none
Warnings: none |
CV лучше сделает? Не сомневаюсь.
|
|
|
|
27.01.2014, 14:45
|
#122
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Ну зачем вы так? Ести я правильно понял, то код, что вы привели от IAR.
Для первого варианта с однобайтовыми переменными:
IAR для IRQ = 21 такт
CV для IRQ = 21 такт
|
Я вам всё скинул.
Посмотрите все операции выполняются с промежуточным сохранением в CV. Вы привели краткий кусок. Где всего 4 переменных, в варианте с int они как раз заняли все свободные регистры у вас. Дальнейший рост производительности при росте числа глобальных переменных = 0. Но даже в маленьком реальном проекте с десяток переменных наберётся. Если делать промежуточное сохранение, то вы получите несколько лишних тактов на каждый минимальный оператор с глобальной переменной.
Поэтому вменяемый компилятор требует явного указания, где требуется промежуточное сохранение, а где нет. Ну не знаю, как вам ещё объяснить.
Но главное, даже не это. Есть такое понятие, как "свобода выбора". Обратите внимание, что я лёгким движением руки сделал, то что вас так восхищало в CV. Но я сделал это осмысленно. А ваш компилятор, тупо, по умолчанию размещает. В регистрах целесообразно размещать только те глобальные переменные, обращение к которым происходит часто, либо работа с ними требует наибольшего быстродействия. Я как раз могу это сделать. А вы?
И мой правильный ответ будет такой:"Не применение volatile в CV, скорее всего не нарушит логику работы." То есть я не гарантирую, что если вы не применили квалификатор volatile, там где он нужен, согласно стандарту, то ваша программа будет работоспособна. С другой стороны, из этого же следует, что его применение, серьёзно не ухудшит работу компилятора. Исходя из этого, я бы не стал рисковать. Так как результат работы мог бы поменяться даже от компиляции к компиляции. Я с таким сталкивался.
Поэтому для начинающих программистов однозначная рекомендация максимально близко следовать стандарту. И volatile применять.
|
|
|
|
27.01.2014, 14:54
|
#123
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Скиньте полностью листинг для:
|
Код:
|
RSEG CODE:CODE:NOROOT(1)
// 12 __interrupt static void timer0_ovf_isr(void)
timer0_ovf_isr:
// 13 {
ST -Y, R18
ST -Y, R17
ST -Y, R16
IN R18, 0x3F
REQUIRE ?Register_R4_is_global_regvar
REQUIRE ?Register_R5_is_global_regvar
REQUIRE ?Register_R6_is_global_regvar
REQUIRE ?Register_R7_is_global_regvar
REQUIRE ?Register_R8_is_global_regvar
REQUIRE ?Register_R9_is_global_regvar
REQUIRE ?Register_R10_is_global_regvar
REQUIRE ?Register_R11_is_global_regvar
// 14 a++;
LDI R16, 1
ADD R4, R16
LDI R16, 0
ADC R5, R16
// 15 b--;
LDI R16, 255
ADD R6, R16
ADC R7, R16
// 16 c=a+b;
MOVW R17:R16, R5:R4
ADD R16, R6
ADC R17, R7
MOVW R9:R8, R17:R16
// 17 d ^= 1;
LDI R16, 1
EOR R10, R16
TST R11
// 18 }
OUT 0x3F, R18
LD R16, Y+
LD R17, Y+
LD R18, Y+
RETI
REQUIRE a
REQUIRE b
REQUIRE c
REQUIRE d
// 19
RSEG CODE:CODE:NOROOT(1)
// 20 void main(void)
main:
// 21 {
REQUIRE ?Register_R4_is_global_regvar
REQUIRE ?Register_R5_is_global_regvar
REQUIRE ?Register_R6_is_global_regvar
REQUIRE ?Register_R7_is_global_regvar
REQUIRE ?Register_R8_is_global_regvar
REQUIRE ?Register_R9_is_global_regvar
REQUIRE ?Register_R10_is_global_regvar
REQUIRE ?Register_R11_is_global_regvar
// 22 DDRA = 0xf;
LDI R16, 15
OUT 0x1A, R16
// 23 PORTA = 0;
LDI R16, 0
OUT 0x1B, R16
// 24
// 25 DDRB = 0;
OUT 0x17, R16
// 26 PORTB = 0;
OUT 0x18, R16
// 27
// 28 DDRC = 0;
OUT 0x14, R16
// 29 PORTC = 0;
OUT 0x15, R16
// 30
// 31 DDRD = 0;
OUT 0x11, R16
// 32 PORTD = 0;
OUT 0x12, R16
// 33
// 34 // Timer Period: 0,016 ms
// 35 TCCR0 = (0‹‹WGM00) | (0‹‹COM01) | (0‹‹COM00) | (0‹‹WGM01) | (0‹‹CS02) | (0‹‹CS01) | (1‹‹CS00);
LDI R16, 1
OUT 0x33, R16
// 36 TCNT0 = 0x00;
LDI R16, 0
OUT 0x32, R16
// 37 OCR0 = 0x00;
OUT 0x3C, R16
// 38
// 39 TIMSK = (1‹‹TOIE0);
LDI R16, 1
OUT 0x39, R16
// 40
// 41 ACSR = (1‹‹ACD) | (0‹‹ACBG) | (0‹‹ACO) | (0‹‹ACI) | (0‹‹ACIE) | (0‹‹ACIC) | (0‹‹ACIS1) | (0‹‹ACIS0);
LDI R16, 128
OUT 0x08, R16
// 42
// 43 __enable_interrupt();
SEI
// 44
// 45
// 46 for(;;)
// 47 {
// 48 if(a == 100) PINA |= 1;
??main_0:
LDI R16, 100
CP R4, R16
LDI R16, 0
CPC R5, R16
BRNE ??main_1
SBI 0x19, 0x00
// 49 if(b == 200) PINA |= 2;
??main_1:
LDI R16, 200
CP R6, R16
LDI R16, 0
CPC R7, R16
BRNE ??main_2
SBI 0x19, 0x01
// 50 if(c == 75) PINA |= 4;
??main_2:
LDI R16, 75
CP R8, R16
LDI R16, 0
CPC R9, R16
BRNE ??main_3
SBI 0x19, 0x02
// 51 if(d == 1) PINA |= 8;
??main_3:
LDI R16, 1
CP R10, R16
LDI R16, 0
CPC R11, R16
BRNE ??main_0
SBI 0x19, 0x03
RJMP ??main_0 |
//
// 14 bytes in segment ABSOLUTE
// 136 bytes in segment CODE
// 4 bytes in segment INTVEC
// 8 bytes in segment REGVAR_AN
//
// 136 bytes of CODE memory (+ 4 bytes shared)
// 0 bytes of DATA memory (+ 22 bytes shared)
//
//Errors: none
//Warnings: none
|
|
|
|
27.01.2014, 15:36
|
#124
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от nahimovv
|
Меняет! Это ещё раз доказывает ограниченность и примитивность CV. Code reordering, в большинстве случаев, позволяет ускорить, а иногда ещё и сократить размер кода.
Неужели? Одним из способов вернуть порядок исполнения кода к правильному как раз и является применение volatile.
|
Да как вы не поймёте. Я говорю про CV. В примитивном ограниченном CV нет Code reordering. Соответственно, volatile в CV на него не влияет (раз его там нет).
|
|
|
|
27.01.2014, 16:11
|
#125
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Я говорю про CV.
|
Понятно.
Сообщение от Godzilla82
|
В примитивном ограниченном CV нет Code reordering.Соответственно, volatile в CV на него не влияет (раз его там нет).
|
volatile по-вашему важен если Code reordering есть?
Зачем тогда в мануале на CV про volatile говорится?
|
|
|
|
27.01.2014, 16:12
|
#126
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
Я вам всё скинул.
|
Вот результат CV 2.6
PHP код:
|
_timer0_ovf_isr:
ST -Y,R30 2
ST -Y,R31 2
IN R30,SREG 1
ST -Y,R30 2
a++;
MOVW R30,R4 1
ADIW R30,1 2
MOVW R4,R30 1
b--;
MOVW R30,R6 1
SBIW R30,1 2
MOVW R6,R30 1
;c=a+b;
MOVW R30,R6 1
ADD R30,R4 1
ADC R31,R5 1
MOVW R8,R30 1
;d ^= 1;
LDI R30,LOW(1) 1
EOR R10,R30 1
LD R30,Y+ 2
OUT SREG,R30 1
LD R31,Y+ 2
LD R30,Y+ 2
RETI 4
|
Столько же тактов, что и у вас в IAR (126 пост)
PHP код:
|
timer0_ovf_isr:
ST -Y, R18
ST -Y, R17
ST -Y, R16
IN R18, 0x3F
a++;
LDI R16, 1
ADD R4, R16
LDI R16, 0
ADC R5, R16
b--;
LDI R16, 255
ADD R6, R16
ADC R7, R16
c=a+b;
MOVW R17:R16, R5:R4
ADD R16, R6
ADC R17, R7
MOVW R9:R8, R17:R16
d ^= 1;
LDI R16, 1
EOR R10, R16
TST R11
OUT 0x3F, R18
LD R16, Y+
LD R17, Y+
LD R18, Y+
RETI
|
Сообщение от SasaVitebsk
|
Есть такое понятие, как "свобода выбора". Обратите внимание, что я лёгким движением руки сделал, то что вас так восхищало в CV. Но я сделал это осмысленно. А ваш компилятор, тупо, по умолчанию размещает. В регистрах целесообразно размещать только те глобальные переменные, обращение к которым происходит часто, либо работа с ними требует наибольшего быстродействия. Я как раз могу это сделать. А вы?
|
И в CV можно указать register перед нужной переменной.
Сообщение от SasaVitebsk
|
То есть я не гарантирую, что если вы не применили квалификатор volatile, там где он нужен, согласно стандарту, то ваша программа будет работоспособна. С другой стороны, из этого же следует, что его применение, серьёзно не ухудшит работу компилятора.
|
Вобще-то это разные вещи. И одно из другого не следует. Если вы подразумеваете под работой компилятора оптимальный код, то скорее наоборот получится (если имелись свободные регистры для хранения переменной).
Сообщение от SasaVitebsk
|
Исходя из этого, я бы не стал рисковать. Так как результат работы мог бы поменяться даже от компиляции к компиляции. Я с таким сталкивался.
|
Мой опыт работы с данным компилятором говорит, что можно спокойно не указывать volatile. На работоспособность программы это не влияет.
Сообщение от SasaVitebsk
|
Поэтому для начинающих программистов однозначная рекомендация максимально близко следовать стандарту. И volatile применять.
|
Тут я спорить не буду. Но речь изначально шла о другом. И совет был дан конкретно для той ситуации. Не знаю, почему вы все решили, что я говорю про все в мире компиляторы. Если бы человек писал в WinAVR, я бы первый предложил использовать volatile.
Последний раз редактировалось Godzilla82; 27.01.2014 в 21:56.
|
|
|
|
27.01.2014, 16:15
|
#127
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от _Артём_
|
Зачем тогда в мануале на CV про volatile говорится?
|
Не знаю. Наверное, чтобы новички привыкали к правильному программированию. Чтобы после перехода на другие компиляторы в дальнейшем у них не было проблем. Да и вообще, чтобы сказать, что volatile поддерживается данным компилятором.
|
|
|
|
27.01.2014, 21:45
|
#128
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от _Артём_
|
Ну смотрите:
|
Итого 81 такт.
Сообщение от _Артём_
|
CV лучше сделает? Не сомневаюсь.
|
CV с volatile 76 тактов:
PHP код:
|
_timer0_ovf_isr: ST -Y,R26 ST -Y,R27 ST -Y,R30 ST -Y,R31 IN R30,SREG ST -Y,R30 a++; LDI R26,LOW(_a) LDI R27,HIGH(_a) LD R30,X+ LD R31,X+ ADIW R30,1 ST -X,R31 ST -X,R30 b--; LDI R26,LOW(_b) LDI R27,HIGH(_b) LD R30,X+ LD R31,X+ SBIW R30,1 ST -X,R31 ST -X,R30 c=a+b; LDS R30,_b LDS R31,_b+1 LDS R26,_a LDS R27,_a+1 ADD R30,R26 ADC R31,R27 STS _c,R30 STS _c+1,R31 d ^= 1; LDS R26,_d LDS R27,_d+1 LDI R30,LOW(1) LDI R31,HIGH(1) EOR R30,R26 EOR R31,R27 STS _d,R30 STS _d+1,R31
LD R30,Y+ OUT SREG,R30 LD R31,Y+ LD R30,Y+ LD R27,Y+ LD R26,Y+ RETI
|
UPD: Взял не тот код. Для 126 поста количество тактов одинаковое.
Для char в регистрах:
CV на 2 такта больше чем IAR
Для int в регистрах:
CV = IAR
Для int в памяти:
CV на 5 тактов меньше
Последний раз редактировалось Godzilla82; 27.01.2014 в 22:11.
|
|
|
|
27.01.2014, 22:18
|
#129
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Наверное, чтобы новички привыкали к правильному программированию. Чтобы после перехода на другие компиляторы в дальнейшем у них не было проблем.
|
А вы знаете таких? ![Прикольно](images/smilies/icon_wink3.gif)
Здесь как , если человек умный и не ленивый - забросит CVAVR сразу же .
В противном случае , так и будет сидеть на этом г... деградируя, и переход на вменяемую среду ему уже не светит...
Статистика , понимаешь...
ЗЫ. Причем не соответствие стандарту это лишь малая пакость от сего недокомпиля,
как верно говорят- компилятор с языка похожего на Си...
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 27.01.2014 в 22:22.
|
|
|
|
27.01.2014, 22:28
|
#130
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Это не мешает ему решать простые (и не очень) задачи быстро и без дополнительных затрат.
Причём слово "решать" - означает готовый результат, в полном смысле этого слова.
И не забывайте - это инструмент. А какой инструмент использовать, выбирает программист.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:34.
|
|