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

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

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

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

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

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

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

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

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


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

4 часа назад, haker_fox сказал:

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

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

Цитата

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

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

Цитата

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

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

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

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


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

15 minutes ago, jcxz said:

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

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

image.thumb.png.5483e248e95f00b5ded201b378ff38c6.png

15 minutes ago, jcxz said:

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

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

15 minutes ago, jcxz said:

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

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

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


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

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

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

Ну и что? :unknw:

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

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

 

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

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


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

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-файл давно знаем и используем.

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


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

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-файл давно знаем и используем.

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

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


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

3 minutes ago, jcxz said:

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

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

4 minutes ago, jcxz said:

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

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

 

5 minutes ago, jcxz said:

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

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

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


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

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

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

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

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

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

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

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

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


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

11 minutes ago, jcxz said:

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

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

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


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

4 часа назад, haker_fox сказал:

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

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

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

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


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

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

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

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


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

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, и сбор данных и куча ещё каких-то приблуд. Понятно, что это редкий баг и не обязан там появляться. Но я всё же стараюсь компилятор, правительство и Билла Гейтса винить в крайнюю очередь)))

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


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

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

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

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

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

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

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

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

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

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