Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Баг EWARM 5.20.3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
MALLOY2
EWARM 5.20.3 EVAL. Компилирую под STM32 ну это не важно...
Обнаружил баг, прошу проверить.

Баг проявляется при попытке выполнить условие с битовым полем.

Имеем:
Код
typedef struct my_struct_bit_tag
{
  unsigned int bit0:1;
  unsigned int bit1:1;
  unsigned int bit2:1;
  unsigned int bit3:1;
  unsigned int bit4:1;
  unsigned int bit5:1;
  unsigned int bit6:1;
  unsigned int bit7:1;
  unsigned int other:24;
}my_struct_bit_t;

typedef struct my_struct_tag
{
  volatile unsigned int A;
  volatile unsigned int B;
  union {volatile my_struct_bit_t Cbit; volatile unsigned int C;};
}my_struct_t;


Делаем такое условие:
Код
void main(void)
{
  my_struct_t *test;
  ....
  if (test->C){......}
}

Все нормально компилируеться

При таком условии
Код
void main(void)
{
  my_struct_t *test;
  ....
  if (test->Cbit.bit0){......}
}

имеем:
Internal Error: [symbol_lookup_M31]: symbol not found for mode 1 (backend generating) (P0: 0, P1: 0)
P.S. Чтение - запись битовых полей работает нормально.
GetSmart
Разная оптимизация влияет на ошибку?

И ещё хотелось бы взлянуть на пропущенный код между объявлением переменной TEST и её использованием в IF
Код
void main(void)
{
  my_struct_t *test;
  ....
  if (test->Cbit.bit0){......}
}
MALLOY2
Глюк проявляется только при высокой оптимизации и как не странно только на поцессорах с ядром Cortex

Цитата
И ещё хотелось бы взлянуть на пропущенный код между объявлением переменной TEST и её использованием в IF


да нету там ничего test присваивается начало ОЗУ и все.


Ура нашел, неимеет значения что перед IF или после, имеет значение только то что в теле IF, а именно
такой код вызывает глюк.

Код
void main(void)
{
  my_struct_t *test;
  ....
  if (test->Cbit.bit0){__enable_interrupt();}
}


Если перед __enable_interrupt(); или псле присутствуют другие команды то все компилится нормально.
GetSmart
Цитата(MALLOY2)
да нету там ничего test присваивается начало ОЗУ и все.

Послушайте, любитель сокращений. В "присваивании" могут быть нюансы. Можно присваивать из другой переменной, можно присваивать просто константу (начало ОЗУ), а можно ещё много чего присвоить. ИАР эти операции оптимизирует сильно по-разному. Например при присваивании константы, ИАР сразу будет анализировать значение из памяти (т.к. знает конкретный адрес). Аналогично ИАР может анализировать и из области флэша. Похожий глюк, но не совсем такой (но тоже в IF) я наблюдал ещё в 4-ых ИАРах на обычном ядре ARM7TDMI-S.
MALLOY2
Вот вы пристали что там, да нет там ничего вобще

Код
void main(void)
{
  my_struct_t *test;
  if (test->Cbit.bit0){__enable_interrupt();}
}


Компилятор честно выдает варнинг что test не инициализирован потом выпадает внутринняя ошибка. Да сточки зрения пргограммы такой код неработоспособен, но на 100% копилирован, а тут баг.
GetSmart
Я за то чтобы в таких случаях компилер ругался и не доходил до линковки!
Хотя ошибку он выдаёт дурацкую. Возможно компилер немного не доработан.

Цитата(MALLOY2)
но на 100% копилирован

Тупым компилятором. Чтобы потом юзер в рантайме встал на эти грабли. Типа Data Abort. ИАР слишком умный для таких граблей. Если бы Вы хоть чуть умели писать компилеры и понимали методы оптимизации, а не только умели писать такие кривые проги, то не говорили бы что этот код 100% компилируемый.
Сергей Борщ
Цитата(GetSmart @ Jan 6 2009, 13:39) *
Я за то чтобы в таких случаях компилер ругался и не доходил до линковки!
А что же он, по-вашему, делает?
Цитата
Internal Error:
После Error линковка не производится, ибо не создается объектный файл.
Цитата(GetSmart @ Jan 6 2009, 13:39) *
Хотя ошибку он выдаёт дурацкую. Возможно компилер немного не доработан.
Если читать документацию внимательно, то в ней сказано (и из названия ошибки следует), что Internal Error - внутреняя ошибка (бага) компилятора. В этом случае надо отправлять баг-репорт в IAR:
Цитата
INTERNAL ERROR
An internal error is a diagnostic message that signals that there has been a serious and unexpected failure due to a fault in the compiler. It is produced using the following form:
Internal error: message
where message is an explanatory message. If internal errors occur, they should be reported to your software distributor or IAR Technical Support. Include information enough to reproduce the problem, typically:
● The product name
● The version number of the compiler, which can be seen in the header of the list files
generated by the compiler
● Your license number
● The exact internal error message text
● The source file of the program that generated the internal error
● A list of the options that were used when the internal error occurred.
Rst7
Цитата
В этом случае надо отправлять баг-репорт в IAR:
...
● Your license number


Тонкий намек на то, что если у Вас IAR ворованный, то, возможно, пошлют в маленькое эротическое путешествие.

Рекомендую зарегаться на IAR'овском сайте, получить свеженькую триальную лицензию (очень желательно указать свои реальные (или близкие к реальности) данные), вычленить тестовый кусок, приводящий к падению компилятора и послать им баг-репорт (на английском, конечно, а не "ПРЕВЕД МЕДВЕД!" wink.gif )

Тогда есть шанс расчитывать на ответ.

PS Кстати, шанс этот очень велик, если все сделаете правильно. В отличии от всяких гнутых, которые позиционируются как "жрите что дают" smile.gif
MALLOY2
Цитата
Тупым компилятором. Чтобы потом юзер в рантайме встал на эти грабли. Типа Data Abort. ИАР слишком умный для таких граблей. Если бы Вы хоть чуть умели писать компилеры и понимали методы оптимизации, а не только умели писать такие кривые проги, то не говорили бы что этот код 100% компилируемый.


1. Думаю вы точно не умеете их писать. Если вы умеете читать я писал что компилятор выдает честный варнинг на то что test не инициализирован ! он не имеет права запрещать мне так делать !

2. По поводу кривых прог не вам судить. По вашему я должен был выложить комерческий код сюда у которого больше 1000 строк чтобы показать этот глюк ? а не проще сделать так как я сделал ?

Если кто может послать баг репорт в IAR огромное спасибо, я его посылать не буду так как пишу по буржуйски токо "Привед медвед".

Баг не серьезный и работе никак не мешает, но вот на 2 машине когда попробыл его повторить с подключенным виглером почемуто среда еще повисла, это уже может напрягать.
rezident
Цитата(Rst7 @ Jan 6 2009, 17:57) *
Рекомендую зарегаться на IAR'овском сайте, получить свеженькую триальную лицензию (очень желательно указать свои реальные (или близкие к реальности) данные), вычленить тестовый кусок, приводящий к падению компилятора и послать им баг-репорт (на английском, конечно, а не "ПРЕВЕД МЕДВЕД!" wink.gif )

Тогда есть шанс расчитывать на ответ.

PS Кстати, шанс этот очень велик, если все сделаете правильно.
Фирма IAR не занимается технической поддержкой Evaluation-версий своих продуктов. Версии Evaluation предоставляются только для ознакомительных целей. Так что про license number там не зря упоминание и bug-report слать бесполезно.
Кстати, при регистрации на сайте для техподдержки (не для скачивания Eval-версий!!!) тоже спрашивают license number, но для full-версии. license number сгенерированный всем известной клизмой для eval там ни разу не катит.
Сергей Борщ
Цитата(rezident @ Jan 6 2009, 16:15) *
Фирма IAR не занимается технической поддержкой Evaluation-версий своих продуктов. Версии Evaluation предоставляются только для ознакомительных целей. Так что про license number там не зря упоминание и bug-report слать бесполезно.
Но фирма IAR заинтересована в устранении ошибок в своих продуктах (ибо они вылезут и в коммерческой версии). Поэтому польза от bug-репорта будет. Скорее всего они не пришлют вам заплатку, но велика вероятность, что в следующей версии этот баг будет исправлен. А версии выходят достаточно часто.

Цитата(MALLOY2 @ Jan 6 2009, 15:29) *
Если кто может послать баг репорт в IAR огромное спасибо, я его посылать не буду так как пишу по буржуйски токо "Привед медвед".
Ну, сложно подчиненные предложения там не требуются. Достаточно чего-либо вроде "Hello. I got internal error <текст ошибки> in attached project with <номер версии> version of EWARM. Regards <ФИО>." К сообщению приложить зазипованный (! а не за rarенный) минимальный проект, на котором воспроизводится ошибка. Все. Адрес техподдержки есть на сайте.
rezident
Цитата(Сергей Борщ @ Jan 6 2009, 19:31) *
Но фирма IAR заинтересована в устранении ошибок в своих продуктах (ибо они вылезут и в коммерческой версии). Поэтому польза от bug-репорта будет.
Польза для IAR - да, наверное. Для пользователя с его текущей eval-версией и конкретной ситуацией применения компилятора - нет, если конечно не считать сам факт обнаружения бага.
Цитата(Сергей Борщ @ Jan 6 2009, 19:31) *
Скорее всего они не пришлют вам заплатку, но велика вероятность, что в следующей версии этот баг будет исправлен. А версии выходят достаточно часто.
Заплатки, а точнее upgrade выпускаются регулярно только для full-версий. sad.gif Eval-версии обновляются только в том случае, если баги весьма критичны для функционирования. Вон глюк с volatile в EW430 4.10A исправили в 4.10C, но скачивать-то давали все равно 4.10A, до тех пор пока 4.20.1 не вышла.
Я, Сергей, не критикую твою позицию, а просто хоть и пессимистично, но реально рассматриваю ситуацию. Eval-версия бесплатная и поэтому применение ее "as is" не считаю как намеренную дискриминацию пользователей фирмой IAR путем внесения багов и отсутствия техподдержки.
GetSmart
Цитата(MALLOY2 @ Jan 6 2009, 19:29) *
1. Думаю вы точно не умеете их писать. Если вы умеете читать я писал что компилятор выдает честный варнинг на то что test не инициализирован ! он не имеет права запрещать мне так делать !

2. По поводу кривых прог не вам судить. По вашему я должен был выложить комерческий код сюда у которого больше 1000 строк чтобы показать этот глюк ? а не проще сделать так как я сделал ?

1. Я не могу написать (сейчас) что-то подобное компилеру ИАРа. Нет богатого заказчика на этот проект. Но 10 лет назад написал компилер паскаля (уровня турбопаскаля) с более расширенным синтаксисом. Выдать варнинг в этой ситуации - мало! Это только ошибка первого этапа компиляции. Далее идёт оптимизатор, для которого эта ситуация должна быть фатальной и им должна быть выдана реальная ошибка, останавливающая компиляцию. И это не Internal Error (которую я назвал дурацкой). С другой стороны, компилер мог бы вообще откомпилить код по своему усмотрению. Хоть сразу выполнить условие, хоть просто пропустить его. И был бы прав в обоих случаях.

2. 1000 коммерческих строк сюда не нужно выкладывать, оставьте себе. Сюда выложить надо было только непокоцанную часть, хотя бы внутри IFа. Хотя вам видимо не дано разобраться где мухи, где котлеты. Так что если в будущем попросят выложить побольше, то не надо сразу посылать. Либо сами создайте минимальный проект с минимум строк, приводящих к аналогичной ошибке и уже весь проект выкладывайте на всеобщее обозрение.

Цитата(Сергей Борщ @ Jan 6 2009, 18:31) *
1. А что же он, по-вашему, делает?После Error линковка не производится, ибо не создается объектный файл.

2. Если читать документацию внимательно, то в ней сказано (и из названия ошибки следует), что Internal Error - внутреняя ошибка (бага) компилятора. В этом случае надо отправлять баг-репорт в IAR:

1. Правильно делает. Я и говорю, что я за то, чтобы он так делал и впредь.

2. Именно из-за того, что компилятор недоработан, он выдаёт Internal Error, а не что-то внятное-понятное.
MALLOY2
Цитата
Либо сами создайте минимальный проект с минимум строк, приводящих к аналогичной ошибке

а я что сделал ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.