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

 
 
> Непонятки с оптимизацией
Allregia
сообщение Dec 6 2009, 13:18
Сообщение #1


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Читаю в цикле с SPI:

Код
       for (j=0; j<(BLen/2);j++){
  
         U0IFG &= ~URXIFG0;               // reset flag
         U0TXBUF = 0;                        // data request
         while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
         BEven = U0RXBUF;                  // read 1st
  
  
         U0IFG &= ~URXIFG0;               // reset flag
         U0TXBUF = 0;                        // data request
         while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
         BOdd = U0RXBUF;                       // read 1st
  
         if(BOdd!=~BEven)           done=false;


Компилируется это в:
Код
     for (i=0; i<(BUF_LENGTH/2);i++){
  00592A   0F43          clr.w   R15
     for (i=0; i<(BUF_LENGTH/2);i++){
  00592C   3F900040      cmp.w   #0x4000,R15
  005930   2B2C          jc      0x5988
       U0IFG &= ~URXIFG0;   // reset flag
  005932   F2C040000200  bic.b   #0x40,&IFG1
       U0TXBUF = 0;                  // data request
  005938   C2437700      clr.b   &U0TXBUF
       while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
  00593C   F2B040000200  bit.b   #0x40,&IFG1
  005942   FC2B          jnc     0x593C
       BEven = U0RXBUF;                 // read 1st
  005944   D24276005012  mov.b   &U0RXBUF,&BEven
       U0IFG &= ~URXIFG0;   // reset flag
  00594A   F2C040000200  bic.b   #0x40,&IFG1
       U0TXBUF = 0;                  // data request
  005950   C2437700      clr.b   &U0TXBUF
       while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
  005954   F2B040000200  bit.b   #0x40,&IFG1
  00595A   FC2B          jnc     0x5954
       BOdd = U0RXBUF;                 // read 1st
  00595C   D24276005112  mov.b   &U0RXBUF,&BOdd



Теперь включаю оптимизацию (max speed):
Код
     for (i=0; i<(BUF_LENGTH/2);i++){
  005612   0F43          clr.w   R15
       U0IFG &= ~URXIFG0;   // reset flag
  005614   F2C040000200  bic.b   #0x40,&IFG1
       U0TXBUF = 0;                  // data request
  00561A   C2437700      clr.b   &U0TXBUF
       while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
  00561E   F2B040000200  bit.b   #0x40,&IFG1
  005624   FC2B          jnc     0x561E
       BEven = U0RXBUF;                 // read 1st
  005626   5E427600      mov.b   &U0RXBUF,R14
  00562A   C24E5012      mov.b   R14,&BEven

       U0IFG &= ~URXIFG0;   // reset flag
  00562E   F2C040000200  bic.b   #0x40,&IFG1
       U0TXBUF = 0;                  // data request
  005634   C2437700      clr.b   &U0TXBUF
       while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
  005638   F2B040000200  bit.b   #0x40,&IFG1
  00563E   FC2B          jnc     0x5638
       BOdd = U0RXBUF;                 // read 1st
  005640   C24E5112      mov.b   R14,&BOdd


И разумеется, все перестает работать, ибо перед последней строчкой должно быть:
mov.b &U0RXBUF,R14

Переменные обьявлены как глобальные:
char dh,dl;

Вопрос - я что-то неправильно делаю, или это глюки IAR'а ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Dec 6 2009, 17:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



У вас неполный листинг. Поэтому не совсем понятно, что там с условием в конце должно быть (какие операции при ветвлении)? Возможно, что необходимо эти переменные (BOdd и BEven) как volatile объявить, либо как-то по-другому объяснить компилятору, что вы от него хотите?
Go to the top of the page
 
+Quote Post
Allregia
сообщение Dec 7 2009, 09:00
Сообщение #3


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(rezident @ Dec 6 2009, 20:28) *
У вас неполный листинг. Поэтому не совсем понятно, что там с условием в конце должно быть (какие операции при ветвлении)?


А по вот этому непонятно? :

Цитата
if(BOdd!=~BEven) done=false;


Дальше там только конец цикла и возврат, т.е полностью так:
Код
char BEven, BOdd;
   bool MyFunction(void){
   int i;
   bool done;
       done = true;
       for (j=0; j<(BLen/2);j++){
      
            U0IFG &= ~URXIFG0;               // reset flag
            U0TXBUF = 0;                        // data request
            while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
            BEven = U0RXBUF;                  // read 1st
      
      
            U0IFG &= ~URXIFG0;               // reset flag
            U0TXBUF = 0;                        // data request
            while ( !( U0IFG & URXIFG0 )); // Waiting for URXIFG0
            BOdd = U0RXBUF;                       // read 1st
      
            if(BOdd!=~BEven)           done=false;
        }
        return done;
   }


Цитата
Возможно, что необходимо эти переменные (BOdd и BEven) как volatile объявить, либо как-то по-другому объяснить компилятору, что вы от него хотите?


Пробовал, обявлял volatile (потому онии обьявлены вне функции), не помогло, тоже самое - читает первый раз из U0RXBUF в R15 и записывет его в BEven, а второй раз - не читая U0RXBUF переписывет R15 (вк отором старое знечение) в BOdd.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 00:47
Рейтинг@Mail.ru


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