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

Оптимизация нарушает работу механизма эксклюзивного доступа.

54 минуты назад, Kabdim сказал:

А IAR не умеет lto с ассемблерными вставками?

Никогда не использовал inline asm - не умею его правильно готовить. Пробовал его так:

inline u32 AtomicSwp(u32 volatile *ptr, u32 arg)
{
  u32 i;
  asm(
    "p1: LDREX %0, [%1]    \n"
    "    STREX R3, %2, [%1]\n"
    "    CMP   R3, #0      \n"
    "    BNE   p1          "
    : "=r" (i)
    : "r" (ptr), "r" (arg)
    : "R3", "cc");
  return i;
}

Но при компиляции IAR падает с сообщением:

Tool Internal Error:
Internal Error: [CoreUtil/General]: 1: bad byte count for graph (184 vs. 186)
Internal Error: [CoreUtil/General]: 1: bad byte count for graph (184 vs. 186)

Не понимаю - в чём проблема?  :russian_ru:

Если Вы имеете опыт с IAR-ским встроенным асмом - подскажите как его правильно приготовить?

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


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

Попробовал добавить volatile возвращаемому параметру:

inline u32 volatile AtomicSwp2(u32 volatile *ptr, u32 arg)
{
  u32 i;
  do i = __LDREX(ptr);
  while (__STREX(arg, ptr));
  return i;
}

Получил немного отличающийся результат, чуть лучше, но лишние команды всё равно все в наличии, хоть они теперь и ушли за пределы цикла:

0xF104 0x010C      ADD      R1,R4,#+12
0x2200             MOVS     R2,#+0
               ??ConfigExec_7:
0xF104 0x000C      ADD      R0,R4,#+12
0xE850 0x0F00      LDREX    R0,[R0]
0xE841 0x2300      STREX    R3,R2,[R1]
0x2B00             CMP      R3,#+0                                            
0xD1F7             BNE.N    ??ConfigExec_7
0x9000             STR      R0,[SP, #+0]
0x9800             LDR      R0,[SP, #+0]

 

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


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

23 минуты назад, jcxz сказал:

Не понимаю - в чём проблема?

Читайте по губам: Internal Error. Программисты накосячили. Пишите в спортлототехподдержку. 

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


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

Хех! Получилось!!!  :smile:

Поборол этот inline ассемблер. Сделал так:

inline u32 AtomicSwp(u32 volatile *ptr, u32 arg)
{
  u32 i;
  asm(
    "p01: LDREX %0, [%1]    \n"
    "     STREX R3, %2, [%1]\n"
    "     CMP   R3, #0      \n"
    "     BNE   p01         "
    : "=&r"(i)
    : "r"(ptr), "r"(arg)
    : "R3", "cc");
  return i;
}

Что даёт результат на полной оптимизации:

0xF104 0x010C      ADD      R1,R4,#+12
0x2200             MOVS     R2,#+0
               ??p01:
0xE851 0x0F00      LDREX R0, [R1]
0xE841 0x2300      STREX R3, R2, [R1]
0x2B00             CMP   R3, #0
0xD1F9             BNE   ??p01

То, что доктор прописал!  :beach:

2 минуты назад, Сергей Борщ сказал:

Читайте по губам: Internal Error. Программисты накосячили.

Я это понимаю. Но от этого не легче. Уже нашёл причину: ему не нравилось имя метки "p1". Заменил на "p01" и жизнь наладилась.  :smile:

 

PS: Получается, что нужно все эти мои функции теперь переписать на встроенный асм. Никогда раньше его не использовал - не знаю какие могут быть подводные камни? (кроме проблем переноса кода на другой компилятор). Несколько настораживает фраза из мануала IAR: "The compiler’s various optimizations will disregard any effects of the inline statements, which will not be optimized at all."  :scratch_one-s_head:

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


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

Переписал функцию так:

inline u32 AtomicSwp(u32 volatile *ptr, u32 arg)
{
  u32 r, i;
  asm(
    "p01: LDREX %0, [%2]    \n"
    "     STREX %1, %3, [%2]\n"
    "     CMP   %1, #0      \n"
    "     BNE   p01           "
    : "=&r"(r), "=&r"(i)
    : "r"(ptr), "r"(arg)
    : "cc", "memory");
  i = i;
  return r;
}

Что логически корректнее.

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


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

32 минуты назад, jcxz сказал:

Уже нашёл причину: ему не нравилось имя метки "p1"

Возможно это не причина, а катализатор. А компилятор дожен выдавать вменяемое сообщение об ошибке, так что Intrnal Error надо в любом случае обязательно отправлять в техподдержку.

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


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

Только что получил из поддержки IAR письмо о том что мой багрепорт о кривой работе оптимизатора с LDREX/STREX принят и перенаправлен в development team.

Ждём новой версии с исправленным багом  :smile:

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


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

1 hour ago, jcxz said:

Только что получил из поддержки IAR письмо о том что мой багрепорт о кривой работе оптимизатора с LDREX/STREX принят и перенаправлен в development team.

Ждём новой версии с исправленным багом  :smile:

Или раньше не обращал внимания, или IAR стал чуть чаще баги выпускать...

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


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

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

Или раньше не обращал внимания, или IAR стал чуть чаще баги выпускать...

Этот баг похоже был давно. Он есть и в 7.80.4 и в поддержке протестили последнюю версию 8.32.3 - там тоже есть.

Мне вот что удивительно: Неужто никто не использует механизм эксклюзивного доступа LDREX/STREX?  :russian_ru:

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


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

26 minutes ago, jcxz said:

Неужто никто не использует механизм эксклюзивного доступа LDREX/STREX? 

Я не использую. К сожалению систему команд начал изучать тщательно относительно недавно. А так - критические секции)

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


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

Используем:wink: Просто, я, например, по работе пишу в Keil, а в нем описанного действительно некорректного поведения, к счастью, замечено не было.

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


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

В 01.03.2019 в 19:36, jcxz сказал:

Мне вот что удивительно: Неужто никто не использует механизм эксклюзивного доступа LDREX/STREX?  :russian_ru:

В gcc мне такого тоже не встречалось.

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


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

Итак - багу официально присвоено имя: EWARM-6716. Теперь это не какой-то там безымянный баг. :hi:

Ждём новой версии IAR с фиксом.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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