Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Ответ
Опции темы
Непрочитано 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_OVFvoid timer0_ovf_isr(void)
{
a++;
b--;
c=a+b;
^= 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(
== 100)    PINA |= 1;
if(
== 200)    PINA |= 2;
if(
== 75)     PINA |= 4;
if(
== 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
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от Godzilla82 Посмотреть сообщение
Ну зачем вы так? Ести я правильно понял, то код, что вы привели от IAR.
Для первого варианта с однобайтовыми переменными:
IAR для IRQ = 21 такт
CV для IRQ = 21 такт
Я вам всё скинул.
Посмотрите все операции выполняются с промежуточным сохранением в CV. Вы привели краткий кусок. Где всего 4 переменных, в варианте с int они как раз заняли все свободные регистры у вас. Дальнейший рост производительности при росте числа глобальных переменных = 0. Но даже в маленьком реальном проекте с десяток переменных наберётся. Если делать промежуточное сохранение, то вы получите несколько лишних тактов на каждый минимальный оператор с глобальной переменной.
Поэтому вменяемый компилятор требует явного указания, где требуется промежуточное сохранение, а где нет. Ну не знаю, как вам ещё объяснить.
Но главное, даже не это. Есть такое понятие, как "свобода выбора". Обратите внимание, что я лёгким движением руки сделал, то что вас так восхищало в CV. Но я сделал это осмысленно. А ваш компилятор, тупо, по умолчанию размещает. В регистрах целесообразно размещать только те глобальные переменные, обращение к которым происходит часто, либо работа с ними требует наибольшего быстродействия. Я как раз могу это сделать. А вы?
И мой правильный ответ будет такой:"Не применение volatile в CV, скорее всего не нарушит логику работы." То есть я не гарантирую, что если вы не применили квалификатор volatile, там где он нужен, согласно стандарту, то ваша программа будет работоспособна. С другой стороны, из этого же следует, что его применение, серьёзно не ухудшит работу компилятора. Исходя из этого, я бы не стал рисковать. Так как результат работы мог бы поменяться даже от компиляции к компиляции. Я с таким сталкивался.
Поэтому для начинающих программистов однозначная рекомендация максимально близко следовать стандарту. И volatile применять.
SasaVitebsk вне форума   Ответить с цитированием
Непрочитано 27.01.2014, 14:54   #123
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию 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
SasaVitebsk вне форума   Ответить с цитированием
Непрочитано 27.01.2014, 15:36   #124
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: CodeVisionAVR 2.60

Сообщение от nahimovv Посмотреть сообщение
Меняет! Это ещё раз доказывает ограниченность и примитивность CV. Code reordering, в большинстве случаев, позволяет ускорить, а иногда ещё и сократить размер кода.

Неужели? Одним из способов вернуть порядок исполнения кода к правильному как раз и является применение volatile.
Да как вы не поймёте. Я говорю про CV. В примитивном ограниченном CV нет Code reordering. Соответственно, volatile в CV на него не влияет (раз его там нет).
Godzilla82 вне форума   Ответить с цитированием
Непрочитано 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
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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
;^= 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      -YR18
        ST      
-YR17
        ST      
-YR16
        IN      R18
0x3F
a
++; 
        
LDI     R161
        ADD     R4
R16
        LDI     R16
0
        ADC     R5
R16
b
--; 
        
LDI     R16255
        ADD     R6
R16
        ADC     R7
R16
c
=a+b
        
MOVW    R17:R16R5:R4
        ADD     R16
R6
        ADC     R17
R7
        MOVW    R9
:R8R17:R16
^= 1
        
LDI     R161
        EOR     R10
R16
        TST     R11

        OUT     0x3F
R18
        LD      R16
Y+
        
LD      R17Y+
        
LD      R18Y+
        
RETI 
Сообщение от SasaVitebsk Посмотреть сообщение
Есть такое понятие, как "свобода выбора". Обратите внимание, что я лёгким движением руки сделал, то что вас так восхищало в CV. Но я сделал это осмысленно. А ваш компилятор, тупо, по умолчанию размещает. В регистрах целесообразно размещать только те глобальные переменные, обращение к которым происходит часто, либо работа с ними требует наибольшего быстродействия. Я как раз могу это сделать. А вы?
И в CV можно указать register перед нужной переменной.


Сообщение от SasaVitebsk Посмотреть сообщение
То есть я не гарантирую, что если вы не применили квалификатор volatile, там где он нужен, согласно стандарту, то ваша программа будет работоспособна. С другой стороны, из этого же следует, что его применение, серьёзно не ухудшит работу компилятора.
Вобще-то это разные вещи. И одно из другого не следует. Если вы подразумеваете под работой компилятора оптимальный код, то скорее наоборот получится (если имелись свободные регистры для хранения переменной).

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

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

Последний раз редактировалось Godzilla82; 27.01.2014 в 21:56.
Godzilla82 вне форума   Ответить с цитированием
Непрочитано 27.01.2014, 16:15   #127
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: CodeVisionAVR 2.60

Сообщение от _Артём_ Посмотреть сообщение
Зачем тогда в мануале на CV про volatile говорится?
Не знаю. Наверное, чтобы новички привыкали к правильному программированию. Чтобы после перехода на другие компиляторы в дальнейшем у них не было проблем. Да и вообще, чтобы сказать, что volatile поддерживается данным компилятором.
Godzilla82 вне форума   Ответить с цитированием
Непрочитано 27.01.2014, 21:45   #128
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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
^= 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.
Godzilla82 вне форума   Ответить с цитированием
Непрочитано 27.01.2014, 22:18   #129
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от Godzilla82 Посмотреть сообщение
Наверное, чтобы новички привыкали к правильному программированию. Чтобы после перехода на другие компиляторы в дальнейшем у них не было проблем.
А вы знаете таких?
Здесь как , если человек умный и не ленивый - забросит CVAVR сразу же .
В противном случае , так и будет сидеть на этом г... деградируя, и переход на вменяемую среду ему уже не светит...
Статистика , понимаешь...

ЗЫ. Причем не соответствие стандарту это лишь малая пакость от сего недокомпиля,
как верно говорят- компилятор с языка похожего на Си...
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 27.01.2014 в 22:22.
dosikus вне форума   Ответить с цитированием
Непрочитано 27.01.2014, 22:28   #130
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: CodeVisionAVR 2.60

Это не мешает ему решать простые (и не очень) задачи быстро и без дополнительных затрат.

Причём слово "решать" - означает готовый результат, в полном смысле этого слова.

И не забывайте - это инструмент. А какой инструмент использовать, выбирает программист.
Godzilla82 вне форума   Ответить с цитированием
Ответ

Закладки

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CodeVisionAVR selevo Embedd С 11 26.02.2016 22:16
SD и CodeVisionAvr 2.04.4a sersne Микроконтроллеры, АЦП, память и т.д 29 24.03.2010 18:39
CodeVisionAVR V2.03.2 dimonbest Микроконтроллеры, АЦП, память и т.д 253 29.09.2009 22:37
New CodeVisionAVR 1.25.8 dimonbest Микроконтроллеры, АЦП, память и т.д 15 07.02.2008 12:56
Help CodeVisionAVR Serg79 Микроконтроллеры, АЦП, память и т.д 3 15.12.2005 23:32


Часовой пояс GMT +4, время: 17:34.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot