Jump to content

    
haker_fox

IAR 8.40.1, static clustering даёт баг

Recommended Posts

Добрый день, коллеги! Ни у кого оптимизация "static clustering" ни приводила к глюкам?

Что-то похожее.

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

В нашем случае проявляется в том, что переменная из ОСРВ FreeRTOS pxDelayedTaskList имеет одинаковый адрес с одним из полей класса... Соответственно, когда конструктор класса пишет в своё поле, разрушается структура ОСРВ. А это ведёт к HardFault. Если эту опцию оптимизации отключить, две переменные находятся по разным адресам и всё работает корректно.

Посоветуйте что-нить, пожалуйста) Не могу придумать способ, как понять - это наш баг или их?

Да, микроконтроллер с ядром Cortex-M0.

Share this post


Link to post
Share on other sites
4 часа назад, haker_fox сказал:

Добрый день, коллеги! Ни у кого оптимизация "static clustering" ни приводила к глюкам?

IAR v7.80.4 пользуюсь давно, в разных проектах на разных МК. В релизной компиляции всегда включаю полную оптимизацию (balanced или size). Иногда и при отладке. Никаких галочек опций при этом не отжимая (оставляю по дефолту для данной оптимизации). Проблем с этим никогда не замечал. Пробовал и версии IAR >=8.00 - тоже с этим проблем не было.

Цитата

В нашем случае проявляется в том, что переменная из ОСРВ FreeRTOS pxDelayedTaskList имеет одинаковый адрес с одним из полей класса... Соответственно, когда конструктор класса пишет в своё поле, разрушается структура ОСРВ. А это ведёт к HardFault. Если эту опцию оптимизации отключить, две переменные находятся по разным адресам и всё работает корректно.

Вангую - "одно поле класса" имеет модификатор "static"?  :wink:

Цитата

Посоветуйте что-нить, пожалуйста) Не могу придумать способ, как понять - это наш баг или их?

Наверное так же как и всегда в подобных случаях: Создать проект минимального размера, в котором будет проявляться этот баг. И выложить его сюда (на форум), на всеобщее обозрение и проверку другими участниками.

Тут даже спец.раздел форума для этого есть.

Share this post


Link to post
Share on other sites
15 minutes ago, jcxz said:

Вангую - "одно поле класса" имеет модификатор "static"?

Нет, не статик. На скриншоте (не мой, поэтому маленько затёрт) может быть картина будет более полная.

image.thumb.png.5483e248e95f00b5ded201b378ff38c6.png

15 minutes ago, jcxz said:

И выложить его сюда (на форум), на всеобщее обозрение и проверку другими участниками.

Ок. Тут вынужден консультироваться с руководством... Запретили((((((((((((( Только скрин и могу предоставить. Сорр.

15 minutes ago, jcxz said:

Пробовал и версии IAR >=8.00 - тоже с этим проблем не было.

Вот и у меня лично не было проблем. Это коллега обратился ко мне... Я как бы проблему нашёл. Но хочется до конца разобраться.

Share this post


Link to post
Share on other sites
20 минут назад, haker_fox сказал:

Нет, не статик. На скриншоте (не мой, поэтому маленько затёрт) может быть картина будет более полная.

Ну и что? :unknw:

Из этих скриншотов никак не следует что компоновщик поместил эти две переменные по одному адресу. Из них следует только то, что отладчик почему-то считает, что они находятся по одному адресу.

Что может быть как правдой так и ложью. Правильные адреса переменных узнаются всегда по .map-файлу, а не по окнам отладчика.

 

PS: А также реальные адреса их можно узнать дойдя отладчиком до тех команд, которые их используют. Если уж с .map-файлом почему-то работать не получается...

Share this post


Link to post
Share on other sites
2 minutes ago, jcxz said:

Правильные адреса переменных узнаются всегда по .map-файлу

map-файл был проверен. Всё тоже

pxDelayedTaskList       0x2000'136c     0x4  Data  Lc  tasks.o [1]
  
  
  
Cycles::instance()::cyclesPtr
                        0x2000'1268    0xb0  Data  Gb  initTask.o [1] // вот этот класс

 

5 minutes ago, jcxz said:

Из них следует только то, что отладчик почему-то считает

Но пишет-то процессор. При инициализации поля cmdQueue портится и вторая переменная)

6 minutes ago, jcxz said:

Правильные адреса переменных узнаются всегда по .map-файлу

Обижаете. map-файл давно знаем и используем.

Share this post


Link to post
Share on other sites
7 минут назад, haker_fox сказал:

map-файл был проверен. Всё тоже


pxDelayedTaskList       0x2000'136c     0x4  Data  Lc  tasks.o [1]
  
  
  
Cycles::instance()::cyclesPtr
                        0x2000'1268    0xb0  Data  Gb  initTask.o [1] // вот этот класс

И где же они "одинаковые"??  :wacko2:

Цитата

Но пишет-то процессор. При инициализации поля cmdQueue портится и вторая переменная)

Инициализации кем? Программой или вручную через окно отладчика?

Из Ваших скриншотов нигде не следует что и куда пишет процессор. А тестовый проект выкладывать Вы не хотите. А значит мы можем только верить Вам на слово и только посочувствовать.  :unknw:

Цитата

Обижаете. map-файл давно знаем и используем.

Ну так он говорит, что адреса разные. См. ваш же пост.

Share this post


Link to post
Share on other sites
3 minutes ago, jcxz said:

И где же они "одинаковые"??

Неверно выразился. Указатель на класс, да, другой. Но смещение поля cmdQueue как раз попадает на адрес другой переменной.

4 minutes ago, jcxz said:

А тестовый проект выкладывать Вы не хотите.

Не я. Руководство. Я не на себя работаю..

 

5 minutes ago, jcxz said:

А значит мы можем только верить Вам на слово и только посочувствовать. 

Ну чтож) Я всё понимаю. Будет личный проект так себя вести, без колебаний выложу)

Share this post


Link to post
Share on other sites
2 минуты назад, haker_fox сказал:

Неверно выразился. Указатель на класс, да, другой. Но смещение поля cmdQueue как раз попадает на адрес другой переменной.

А где это видно??? Вы сказали, что знаете и используете .map-файл, но так и не привели выдержки из него, которая бы подтверждала Ваши слова о баге.  :unknw:

2 минуты назад, haker_fox сказал:

Не я. Руководство. Я не на себя работаю..

Иногда у меня складывается впечатление, что вы работаете рабом на какой-то галере, прикованный цепями к веслу. Уж извините... :russian_ru:

Ну даже в этом случае - никто не мешает сделать его дома и выложить.

Share this post


Link to post
Share on other sites
4 часа назад, haker_fox сказал:

Не могу рисковать своим положением...

И дома Вами тоже начальник руководит??? :shok::shok::shok:

Жесть какая!! А я думал, что крепостное право в России полтора века назад отменили....  :unknw:

Share this post


Link to post
Share on other sites

Судя по интернетам, эта проблема - известная для EWARM, решения нет.

Понимаю, интересно разобраться и т.п., но вас правда интересует проблема кластеризации и как именно IAR её реализует и использует для оптимизации? Сравните размер кода с этой птичкой или нет, и решите, устраивает ли вас результат без птички. В общем, самое время применить принцип целебного болтополагания.

Share this post


Link to post
Share on other sites
4 hours ago, jcxz said:

И дома Вами тоже начальник руководит???

А вы полагаете, что на форум только я один из отдела хожу? Ну увидят архив с рабочим кодом. По нику меня знают. И вот тебе выговор за официальный слив информации...(((

А вообще, ничего смешного. Дома мной и руководят. Мы сейчас всем отделом на удалёнке.

4 hours ago, jcxz said:

А я думал, что крепостное право в России полтора века назад отменили....

Крепостное отменили. А вот другого не дали)

3 hours ago, one_eight_seven said:

известная для EWARM, решения нет

А для каких версий?) На официальном сайте для 7.10 максимум нашёл. Дальше тишина. Нет ли у вас подтверждения, что это актуально и для 8-й ветки? Я не смог найти(((

3 hours ago, one_eight_seven said:

но вас правда интересует проблема кластеризации и как именно IAR её реализует и использует для оптимизации?

Ну лично интересно, конечно. Но вряд ли смогу узнать, ведь официальная документация очень скромна по этому поводу.

3 hours ago, one_eight_seven said:

В общем, самое время применить принцип целебного болтополагания.

Спасибо) Я просто сомневался, ведь у меня 8.40.1. собран довольно большой проект для lpc4337-m4f. А там и сетевой стэк, и USB, и сбор данных и куча ещё каких-то приблуд. Понятно, что это редкий баг и не обязан там появляться. Но я всё же стараюсь компилятор, правительство и Билла Гейтса винить в крайнюю очередь)))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.