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

так писали про 6.4

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

Поделиться сообщением


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

Таки глюк компилятора...

 

PS: Как действовать автору топика в подобных ситуациях наглядно продемонстрировал KRS. =)

Поделиться сообщением


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

а новый компилер 6.40.4 (кажется) кто нибудь использует?

надо бы в ЯР код послать, если не исправили еще

Поделиться сообщением


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

а новый компилер 6.40.4

IAR C/C++ Compiler for ARM

6.40.4.24170 (6.40.4.24170)

C:\Program Files (x86)\IARM64\arm\bin\iccarm.exe

13/Sep/2012 05:19:20, 27336704 bytes

 

все еще бажит

Поделиться сообщением


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

Глючат именно циклы с предусловием (и не только циклы с goto тоже самое) но с проверкой условия в начале.

Причем независимо от управляющей переменной!

из этих функций нормально компилируются только нечетные!

void test_bug4(uint8_t *buf)
{
unsigned i;
unsigned j;
j=100;
i=0;
while(i<10){
	buf[i++]=j;
	j-=2;
}
buf[i]=0;
}

void test_bug5(uint8_t *buf)
{
unsigned i;
unsigned j;
j=100;
i=0;
do {
	buf[i++]=j;
	j-=2;
} while(i<10);
buf[i]=0;
}

void test_bug6(uint8_t *buf)
{
unsigned i;
unsigned j;
j=100;
i=0;
while(j>0){
	buf[i++]=j;
	j-=2;
}
buf[i]=0;
}

void test_bug7(uint8_t *buf)
{
unsigned i;
unsigned j;
j=100;
i=0;
do {
	buf[i++]=j;
	j-=2;
}while(j >0);
buf[i]=0;
}

void test_bug8(uint8_t *buf)
{
unsigned i;
unsigned j;
j=100;
i=0;
loop:
if (i < 10) {
	buf[i++]=j;
	j-=2;
	goto loop;
}	
buf[i]=0;
}

void test_bug9(uint8_t *buf)
{
unsigned i;
unsigned j;
j=100;
i=0;
loop:
buf[i++]=j;
j-=2;
if (i < 10)
	goto loop;
buf[i]=0;
}

Изменено пользователем IgorKossak
[codebox] для длинного кода!!!

Поделиться сообщением


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

Версия 5.41 - генерирует нормально. Мда, никак оно на 6.x перейти не получается, серьезно будем рассматривать GCC от CodeSourcery/Mentor.

 

 

Глючат именно циклы с предусловием

Что-то с тестированием в ЯР плоховато. Такие косяки можно автоматическими тестами выловить. Скомпилируй и запусти на реальном железе - все быстро вылезет.

 

Поделиться сообщением


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

Используйте квалификатор volatile. И будет вам счастье. Справка: Квалификатор volatile указывает компилятору на то, что значение переменной может измениться независимо от программы, т.е. вследствие воздействия еще чего-либо, не являющегося оператором программы. Например, адрес глобальной переменной можно передать в подпрограмму операционной системы, следящей за временем, и тогда эта переменная будет содержать системное время. В этом случае значение переменной будет изменяться без участия какого-либо оператора программы. Знание таких подробностей важно потому, что большинство компиляторов С автоматически оптимизируют некоторые выражения, предполагая при этом неизменность переменной, если она не встречается в левой части оператора присваивания. В этом случае при очередной ссылке на переменную может использоваться ее предыдущее значение. Некоторые компиляторы изменяют порядок вычислений в выражениях, что может привести к ошибке, если в выражении присутствует переменная, вычисляемая вне программы. Квалификатор volatile предотвращает такие изменения программы.

Поделиться сообщением


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

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

Поделиться сообщением


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

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

Компилятор не знает есть внешнее воздействие или нет. Он не будет оптимизировать код где используются переменные с квалификатором volatile

 

Поделиться сообщением


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

Компилятор не знает есть внешнее воздействие или нет. Он не будет оптимизировать код где используются переменные с квалификатором volatile

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

Поделиться сообщением


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

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

Поделиться сообщением


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

кстати с volatile тоже не все в порядке!

при цикле в 100 байт и присваивание 0. IAR сообразил что это очистка памяти и вызвал

___aaeabi_memclr

дальше не копал, но что то я сомневаюсь что эта функция будет по байтам 0 писать! А все таки раз уж volatile то менять байтовый доступ на словный не совсем корректно.

 

Поделиться сообщением


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

кстати с volatile тоже не все в порядке!

Чем дальше в лес, тем толще партизаны!

Да уж, ЯР отжигает. Им пора "горячую линию" по поводу своих багов открывать...

Поделиться сообщением


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

а что уже можно тип не указывать? только unsigned?

Всегда можно было. Читайте учебники. K&R, к примеру.

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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