Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Internal Error: [Post Optimize]: Any exception
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
GetSmart
Вопрос к спецам:
почему появляется ошибка в данном коде на максимальной оптимизации? На всех остальных оптимизациях и без, код нормально компилируется.
IAR 4.20. На других не пробовал. Может есть другой вариант описания данной структуры? Но хотелось чтобы поля структуры адресовались из "корня", то есть без лишнего имени структуры.

Код
typedef union
{
    u32    data;
    struct
    {    u08    light;
        u08    red;
        u08    green;
        u08    blue;
    };
} TLIGHT_DATA;

TLIGHT_DATA LightNew, LightOld;

main()
{
    if (LightNew.light <> LightOld.light) ...
}


Добавлю. Ошибка то появляется, то исчезает когда немного код изменяю. В первой версии был большой код. Здесь я всё сократил до минимума.
Палыч
Цитата(GetSmart @ Oct 23 2009, 11:54) *
Код
...    if (LightNew.light <> LightOld.light) ...
В операторе if записано "<>" - это что? Неравно? Наверное, нужно "!="?
GetSmart
Цитата(Палыч @ Oct 23 2009, 17:00) *
В операторе if записано "<>" - это что? Неравно? Наверное, нужно "!="?

Да, ошибся, но только в цитате здесь. В IARе было !=. Просто тут в параллель ещё на делфе пишу прогу и меня клинит иногда smile.gif

Собственно, юнион со структурой тут не причём. Даже такой код без каких-либо дополнительных файлов выдаёт ошибку:
Код
typedef unsigned long  u32;

#define T0TC    (*(volatile u32 *)0xE0004008)

u32 LightNew, LightCur;

void main()
{
    u32 LightStamp1 = T0TC;
    u32 tmp;
    while (1)
    {    tmp = T0TC - LightStamp1;
        if ((LightCur != LightNew) && (tmp >= 1000))
        {    LightStamp1 += 1000;
        }
    }
}

Если что-нить малость в нём изменить, то ошибка исчезает. Например, если удалить половину условия в if. Или вместо LightStamp1 += 1000; написать asm("NOP");
rezident
IAR EWARM 5.40.1 на последний пример не дает ошибок.
zltigo
Цитата(GetSmart @ Oct 23 2009, 11:54) *
почему появляется ошибка...

Да какая тут "ошибка" sad.gif. Полагаю, что просто в файле, например, какой-нибудь непечатный символ залетел, какой-нибудь временный/выходнлй файл битый или не доступен на запись, и подобное.... Ну максимум что-то с железом-операционкой-файрволом....
Ошибаться просто неначем.
GetSmart
Цитата(zltigo @ Oct 23 2009, 19:10) *
Да какая тут "ошибка" sad.gif.
1. Полагаю, что просто в файле, например, какой-нибудь непечатный символ залетел,
2. какой-нибудь временный/выходнлй файл битый или не доступен на запись, и подобное....
3. Ну максимум что-то с железом-операционкой-файрволом....
Ошибаться просто неначем.

1. Проверил. Нет. Файл прилагаю. Достаточно создать проект с одним этим файлом и выбрать любой ARM проц (других там нет smile.gif) и максимальную оптимизацию (Speed/Size без разницы). Глючит 4.20 и 4.30 оба.
2. хз как проверить, но изменяя одну мелочь как я описал ошибка исчезает и появляется снова когда восстанавливаю изменения. Так что вряд ли дело во временном файле.
3. Файрвола не стоит. Операционка ХР, стабильно работает.
Остальное без комментариев smile.gif
zltigo
Цитата(GetSmart @ Oct 24 2009, 00:57) *
без комментариев smile.gif
rezident
Еще раз подтверждаю, что в IAR EWARM 5.40.1 никаких ошибок при компиляции этого файла не возникает. Проц выбрал LPC2138. Оптимизацию ставил High->Balanced, High->Size, High-Speed. Это я к тому, что приходите на работу и возьмите последнюю версию компилятора wink.gif
GetSmart
Что я буду делать с 5-ой версией версией компилера если у меня куча проектов для 4-ой, а они несовместимы. И перелопачивать проекты у меня желания нет. В лучшем случае можно применить 5-ую для новых проектов.

Цитата(zltigo)
Прикрепленные файлы
Прикрепленный файл main.rar ( 1.19 килобайт ) Кол-во скачиваний: 3

Версия IAR 4.42 это хорошо. Меня интересует только 4.хх. Но выбран код THUMB, а надо ARM. В тумбе 4.20 и 4.30 тоже не ругаются.

Код
        if (tmp >= 1000) if (LightCur != LightNew)
так не глючит

Код
        if ((tmp >= 1000) && (LightCur != LightNew))
не глючит

Код
        if ((LightCur != LightNew) && (LightStamp1 >= 1000))
глючит

Код
        if (LightCur != LightNew) if (LightStamp1 >= 1000)
глючит

Код
        if (LightCur != LightNew) if (tmp >= 1000)
глючит

Первый и последний примеры показательны. То же самое, но в другой очерёдности.
rezident
Установил 4.20a и 4.30a. Файл из сообщения №6. Target - LPC2138. Оптимизация High->Size и High->Speed. Режим ARM.
В 4.20a действительно в режиме ARM возникает ошибка, но по-моему это ошибка IDE, а не компилятора. См. скриншот.
В 4.30a ошибок нет.
GetSmart
Что то я в процессе кастрации не заметил когда ошибка слегка поменялась smile.gif
Вот такой код выдаёт оригинальную ошибку. В 4.20 и в 4.30A (4.30.1.537) тоже.
rezident
Может я что-то не то делаю, но в 4.20 ошибка почти такая же, а в 4.30 нет ошибок. laughing.gif Оптимизация в обоих случаях High->Size.
GetSmart
Да, странно. У меня в директории IAR4.30 лежит компилятор (iccarm.exe) версии 4.20. Я видно когда-то давно экспериментировал и заменил его. А двумя постами раньше по ошибке указал версию aarm.exe. Восстановил iccarm.exe версии 4.30.1.237. В нём действительно ошибка не возникает. Даже в полном проекте, на который ругался 4.20.

ЗЫ. Кто-нить знает как обойти (убрать, изменить, блокировать и тд) некоторые ключи компилятора, которые при компиляции передаются iccarm.exe ? А то я хотел сделать гибрид из 4 и 5-ой версий (линкер 4.хх, компилятор 5.хх), а компилятор ругается на параметр --stack_align. Вообще-то некоторые ключи отличаются, например оптимизация. Может можно как-то и их изменять в процессе передачи компилятору?
zltigo
Цитата(GetSmart @ Oct 24 2009, 02:11) *
Версия IAR 4.42 это хорошо. Меня интересует только 4.хх. Но выбран код THUMB, а надо ARM. В тумбе 4.20 и 4.30 тоже не ругаются.

Как Вы написали такк тупо и сделал. Да пофиг, какие опции - не ругается, по тому, что не может никак ругаться на простейшие коды. Кашу из IDE устроили, DLL и прочее замешали в кучу и понеслось....
Цитата
А то я хотел сделать гибрид из 4 и 5-ой версий (линкер 4.хх, компилятор 5.хх)

Вивисектор, нашелся, понимаешь - НУ РАЗНЫЕ, СОВСЕМ разные форматы объектников не слиннкует старый линкер ничего. А если V5 НЕ pro версия, то тот объектник вообще никто не слинкует, ибо для демо и иже с ней объектники специально модифицированы, дабы стандартные GCC binutils шли лесом.
Цитата
И перелопачивать проекты у меня желания нет. В лучшем случае можно применить 5-ую для новых проектов.

Ну офигенная работа - после того, как ОДИН раз сделал вообще никакая. А уж пляcки с 4.20 вместо финишного 4.42 это вообще ни в какие ворота не лезет.
GetSmart
Цитата(zltigo @ Oct 24 2009, 16:55) *
Как Вы написали такк тупо и сделал. Да пофиг, какие опции - не ругается, по тому, что не может никак ругаться на простейшие коды. Кашу из IDE устроили, DLL и прочее замешали в кучу и понеслось....

Не надо так нервничать smile.gif Я работаю уже давно в 4.20. В полноценном и никак не модифицированном, ни EXE, ни DLL. В нём и возникает (стабильно!!!) ошибка на 100% корректном Си коде. Не я виноват, что 4.20 кривой (слегка, т.к. все остальные мои проекты на нём работают).

Цитата
А уж пляcки с 4.20 вместо финишного 4.42 это вообще ни в какие ворота не лезет.

Я почему не переходил на более новые - был у меня один сложный проект, на 4.20 работал замечательно. Потом я его откомпилил в 4.30 и он перестал работать. Я тогда спешил и не стал исследовать где вылез косяк. Просто в памяти отложилась эта ситуация. Теперь жалею, что не сохранил весь проект в архиве с камментом для выяснения проблемы.

А вообще, я притягиваю баги компиляторов biggrin.gif Уже не один и не два нашёл для ARMов.

Скачал ещё 4.10, 4.41, 4.42. Буду посмотреть как они компилят и что за код генерят. Появилось время для исследований.
zltigo
Цитата(GetSmart @ Oct 24 2009, 14:57) *
Уже не один и не два нашёл для ARMов.

Возьмите IAR ну какой-нибудь 2.0 вместо 5.xx и оттягивайтесь.
Лично я наступал ровно на один IAR-овский баг лет пять назад, да и тот в следующем релизе пофиксили. Наверное я чего-то делаю неправильно sad.gif, в частности всегда перехожу на текущую версию компилятора, причем неизменно без проблем. Не все проекты переведены на V5, но все V4 безусловно на последней версии V4, и все развиваемые на V5.
GetSmart
Приехали. Взял первый попавшийся большой проджект, который в 4.20 компилится и работает в железе. Скомпилил в 4.30.1.237 и ... не работает в железе! biggrin.gif
zltigo
Цитата(GetSmart @ Oct 24 2009, 15:29) *
Приехали.

Отличный повод начать искать СВОИ ошибки. Начните, наконец, с простого включения и чтения Warnings. Только, естественно, на 4.42.
GetSmart
Провёл эксперимент. В чистом 4.20 всё работает (сразу скажу для непонятливых - в 4.20 я не менял ничто и никогда). В чистом 4.30 не работает. Если в 4.30 заменить iccarm.exe на файл из 4.20, то прошивка работает. Но. По размеру и некоторым признакам эта прошивка очень похожа на ту, которую генерит чистый 4.30, чем на ту, которую генерит чистый 4.20. Значет ещё линкер поменялся.

Цитата(zltigo)
Начните, наконец, с простого включения и чтения Warnings. Только, естественно, на 4.42.

Варнинги у меня всегда влючены. Там всё как надо. 4.42 ещё не установил. Поставлю не раньше завтра.
zltigo
Цитата(GetSmart @ Oct 24 2009, 15:49) *
Варнинги у меня всегда влючены.

Не верю, иначе бы Вы никогда не писали подобные вещи:
Код
   while (1)
    {    tmp = T0TC - LightStamp1;
......

По крайней мере в IAR...
GetSmart
Цитата(zltigo @ Oct 24 2009, 18:57) *
Не верю, иначе бы Вы никогда не писали подобные вещи:
Код
   while (1)
    {    tmp = T0TC - LightStamp1;
......

По крайней мере в IAR...

Не понимаю где тут варнинг? Дайте что ли листинг, в котором будет этот варнинг.
zltigo
Цитата(GetSmart @ Oct 24 2009, 15:59) *
Не понимаю где тут варнинг? Дайте что ли листинг, в котором будет этот варнинг.

Вот я и говорю, что надо их все включать sad.gif
Код
      7          void main()
      8          {
      9              u32 LightStamp1 = T0TC;
   \                     main:
   \   00000000   8E02A0E3           MOV      R0,#-536870904
   \   00000004   400C80E3           ORR      R0,R0,#0x4000
   \   00000008   000090E5           LDR      R0,[R0, #+0]
   \   0000000C   2C109FE5           LDR      R1,??main_0     ;; LightNew
   \   00000010   002091E5           LDR      R2,[R1, #+0]
   \   00000014   041091E5           LDR      R1,[R1, #+4]
     10              u32 tmp;
     11              while (1)
                            ^
Remark[Pe236]: controlling expression is constant
     12              {    tmp = T0TC - LightStamp1;
   \                     ??main_1:
   \   00000018   8E32A0E3           MOV      R3,#-536870904
   \   0000001C   403C83E3           ORR      R3,R3,#0x4000
   \   00000020   003093E5           LDR      R3,[R3, #+0]
   \   00000024   003043E0           SUB      R3,R3,R0
     13                  if ((LightCur != LightNew) && (tmp >= 1000))
GetSmart
А, ремарки! Это вообще бесполезная вещь, которая не влияет на генерируемый файл. Видел я эту ремарку. Она довольно глупая. Именно из-за неё я догадался почему параноидальные сишники считают что правильнее использовать for (;;) для бесконечных циклов. Я ещё могу понять, когда в дефайне ставят do {} while(0), но проблемы с while (1) выше моего понимания smile.gif

Бьюсь об заклад, что скорректировав код так, чтобы исчезли все ремарки, прошивка останется 100% идентичной.

Следуя такой логике следует запретить конструкции #if 0 ... #endif и им подобные, т.к. аналогично while-у используется константное условие. Хотя и в препроцессоре.
zltigo
Цитата(GetSmart @ Oct 24 2009, 16:10) *
Именно из-за неё я догадался почему параноидальные сишники...

Странно, по-русски Вы пишете достаточно грамотно, и наверное, не считаете это извращением. По чему-бы не писать грамотно и на 'C', даже если компилятору кажется, что он Вас понимает и в результате оптимизации выдает хороший код.
GetSmart
Цитата(zltigo @ Oct 24 2009, 19:20) *
Странно, по-русски Вы пишете достаточно грамотно, и наверное, не считаете это извращением. По чему-бы не писать грамотно и на 'C', даже если компилятору кажется, что он Вас понимает и в результате оптимизации выдает хороший код.

Ткните меня в стандарт, пожалуйста, где указано, что нельзя использовать константное условие. А иначе - всё, что не запрещено, то - разрешено. А то ведь получится, что и в дефайне ставить while(0) нельзя, и тогда получится "рыба" - без вайла будет ремарка на лишнюю точку с запятой, а с вайлом ремарка на константное условие.
zltigo
Цитата(GetSmart @ Oct 24 2009, 16:26) *
Ткните меня в стандарт, пожалуйста....

Ткните меня в учебник русского языка в котором прямо сказано, что нельзя писать "моя твоя не понимай".
Нормальная и абсолютно однозначная запись этого
for( ; ; )
без всяких начальных условий, без всяких условий, и без всяких дополнительных действий повторять кусок кода.
Цитата
А то ведь получится, что и в дефайне ставить while(0) нельзя, и тогда получится "рыба"

Неграмотно, но поскольку в данном случае речь идет о трюке, то на то он и трюк, дабы пользоваться им в крайних случаях и со знанием дела.
GetSmart
Цитата(zltigo @ Oct 24 2009, 19:20) *
Странно, по-русски Вы пишете достаточно грамотно, и наверное, не считаете это извращением. По чему-бы не писать грамотно и на 'C', даже если компилятору кажется, что он Вас понимает и в результате оптимизации выдает хороший код.

"По чему" - пишется вместе. "Почему бы" без дефиса. Перед "наверное" пропущена запятая.

zltigo, нравится Вам такое отношение (компилятора smile.gif) ??? - Мне тоже не нравится. Но мы с Вами прекрасно друг друга понимаем без параноидального соблюдения орфографии и пунктуации.
Только не говорите, что русский не родной smile.gif

Не удержался. Установил таки 4.42. Мой мега-проджект в нём... работает! smile.gif В 4.20 работает, в 4.42 работает, а в 4.30 НЕ РАБОТАЕТ!!! Щас попробую угадать - виноват конечно же я smile.gif
Хотя 4.42 делает самый жирный HEX, на долю процента больше чем 4.30. А 4.20 самый компактный. Это при одинаковой оптимизации High Size.
zltigo
Цитата(GetSmart @ Oct 24 2009, 17:58) *
zltigo, нравится Вам такое отношение (компилятора smile.gif)

Нравится!
Цитата
Только не говорите, что русский не родной smile.gif

Просто с середины 6 класса русская школа в Будапеште сказывается, ну и жена украинка.
Цитата
Щас попробую угадать - виноват конечно же я smile.gif

Тем не менее, на 99% да sad.gif. Список исправленных-внесенных ошибок IAR ведет и выкладывает в комплекте с компилятором - можете поискать ту, которая присутствует в Вашем исходнике не идущем на 4.30.
GetSmart
Цитата(zltigo @ Oct 24 2009, 21:52) *
Тем не менее, на 99% да sad.gif. Список исправленных-внесенных ошибок IAR ведет и выкладывает в комплекте с компилятором - можете поискать ту, которая присутствует в Вашем исходнике не идущем на 4.30.

Вы опять неправы smile.gif
http://electronix.ru/forum/index.php?showtopic=68803
Я редко ошибаюсь cool.gif
zltigo
Цитата
Список исправленных-внесенных ошибок IAR ведет и выкладывает в комплекте с компилятором - можете поискать ту, которая присутствует в Вашем исходнике не идущем на 4.30.


Цитата(GetSmart @ Oct 26 2009, 14:13) *
Вы опять неправы smile.gif

В чем? Вот описание этой ошибки от IAR исправленной в 4.31
Код
V4.31A 2006-02-03

Program corrections
.....
Nested irq functions did not return properly.
[EW17032, EW17033, EW17038]
....

Так в чем я виноват? В том, что Вы не читаете документацию, пользуетесь в конце 2009 года компиляторами января 2005 и после этого радостно наступаете на грабли описанные и исправленные в феврале 2006 года?
GetSmart
Цитата(zltigo @ Oct 26 2009, 17:25) *
Так в чем я виноват? В том, что Вы не читаете документацию, пользуетесь в конце 2009 года компиляторами января 2005 и после этого радостно наступаете на грабли описанные и исправленные в феврале 2006 года?

Да, начиная с 2005 года я юзаю 4.20 и был им полностью доволен до создания этой темы. Лучшее - враг хорошего. В этом я убедился, когда вышел 4.30 и я сразу же встал на эти грабли. С тех пор я никуда не спешил переходить, тем более когда с 5.хх поменяли совместимость исходников.

Кроме всего, 4.20 создаёт самый компактный код, меньше чем 4.42. Ещё один бонус.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.