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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Оптимизация кода IAR С++ v5.10 компилятора, весьма странный код... :(
sonycman
сообщение May 26 2008, 17:12
Сообщение #31


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Сергей Борщ @ May 21 2008, 19:32) *
А попробуйте что-то вроде
Код
  if(RSStatus==RS_RECCMD)
{
   memcpy(RSRecCmdBuffer, &RSRecCmdBuffer, 7);
   RSRecCmdBuffer[7] = b;
memcpy - intrinsic, компилятор может ее реализовать эффективнее, чем компилируя ваш цикл.


Дело в том, что memcpy использует в качестве счетчика регистровую пару, работа с которой при переброске маленьких блоков данных выглядит весьма неэффективной...
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 26 2010, 18:30
Сообщение #32


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Немного не в тему, потому как речь о версии ИАР 4.3. Но опера та-же. Не понимаю, почему ИАР считает заранее известным условие с volatile переменными:
Код
volatile union {       // для доступа к одной ячейке памяти разными способами
        unsigned long all;          // для доступа ко всем 4-м байтам
        unsigned char byte[4];      // для побайтного доступа
    } recbuf;

#pragma vector=INT0_vect
__interrupt void ext_int0_isr(void)
{
...
          recbuf.all>>=1; // сдвиг буфера на 1 бит
      if(bit)recbuf.byte[3]|=0x80;  // добавили единичку, если это она
...
}

void  main(void)
{
__enable_interrupt();
while (1)
  {

  if((recbuf.byte[0] ==~recbuf.byte[1])    // это условие даже не проверяется
  &&(recbuf.byte[2]==~recbuf.byte[3]))   // правда ругается на неопределенный порядок доступа
        {
            //  чтото делаем  - этот код компилятор выкидывает даже на низких уровнях оптимизации
         }
  }
}

Если то условие заменить таким - то все работает:
Код
    tmp = ~recbuf.byte[1];
    if(recbuf.byte[0] == tmp)
     {
        tmp = ~recbuf.byte[3];
        if(recbuf.byte[2] == tmp)

Присоединяю файл проекта если у кого не развита телепатия wink.gif
Прикрепленные файлы
Прикрепленный файл  testout.zip ( 14.75 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 27 2010, 18:25
Сообщение #33


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А если так:
Код
union {       // для доступа к одной ячейке памяти разными способами
         volatile unsigned long all;          // для доступа ко всем 4-м байтам
         volatile unsigned char byte[4];      // для побайтного доступа
     } recbuf;


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 28 2010, 06:37
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Waso @ Nov 26 2010, 21:30) *
Немного не в тему
if((recbuf.byte[0] ==~recbuf.byte[1]) // это условие даже не проверяется

Вы предупреждения компилятора вообще не читаете?
Писатель? wink.gif

Правая часть приводится к типу int. После инверсии в старшем байте казывается 0xff.
Результат сравнения 0xXX и 0xFFYY компилятору ясен на этапе компиляции.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 28 2010, 07:37
Сообщение #35


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Вот так напишите и будет вам щастье: smile.gif

Код
void  main(void)
{
__enable_interrupt();
while (1)
  {
    if((recbuf.byte[0] ==(unsigned char)~recbuf.byte[1])
      &&(recbuf.byte[2]==(unsigned char)~recbuf.byte[3]))
    {
        //  что-то делаем
    }
  }
}
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 28 2010, 19:33
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



demiurg_spb, неа, не канает.

Xenia, Dog Pawlowa, я фшоке! Это действительно работает!! У меня сорвало крышу! Господа и дамы! Прошу! Объясните мне ради Бога! С какого рожна
Цитата
Правая часть приводится к типу int.
Это что, происходит всегда, когда я произвожу над операндом какую-либо операцию прямо в условии??? Где прописано что это так делается? Я понимаю, если бы один из операндов был int или я например прибавлял к нему число голое.. Но туут.. %[]
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 28 2010, 20:43
Сообщение #37


Гуру
******

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



Цитата(Waso @ Nov 29 2010, 00:33) *
Где прописано что это так делается?
В стандарте С99 вестимо.
Цитата("ISO/IEC 9899:1999 (E)")
6.5 Expressions
...
4 Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, and |,
collectively described as bitwise operators) are required to have operands that have
integer type
. These operators return values that depend on the internal representations of
integers, and have implementation-defined and undefined aspects for signed types.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 28 2010, 22:18
Сообщение #38


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (rezident @ Nov 28 2010, 22:43) *
В стандарте С99 вестимо.
А также там (и в предыдущих версиях стандарта тоже) написано, что при любых арифметических действиях операнды размером меньше int (unsigned int) неявно приводятся к int (unsigned int), но потом оптимизатор может выкинуть действия не влияющие на результат. И все это называется integer promotion rules.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 29 2010, 08:17
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Спасибо. Каюсь. Грешен. Ненавижу читать стандарты...

Уже в который раз я удивляюсь - каким чудом работали мои предыдущие программы??...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 21:13
Рейтинг@Mail.ru


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