Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR сходит с ума на High оптимизации
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Jenya7
функция
Код
void AT25_Write(uint32_t address, uint8_t *data, uint32_t lenght);

на любой оптимизации кроме High
Код
uint32_t addr = 128;
AT25_Write(addr, at45_data_tx, 200);

останавливаю брекпойнт в функции - address = 128 - все честно
на оптимизации High - address = 536889328 - они не охренели там случайно?
Непомнящий Евгений
Отладчик не всегда показывает правильные значения локальных переменных. Можете так попробовать

Код
volatile uint32_t g_address;
void AT25_Write(uint32_t address, uint8_t *data, uint32_t lenght) {
  g_address = address; // и дальше смотрите адрес в g_address
//...
}
Сергей Борщ
QUOTE (Jenya7 @ Aug 10 2017, 16:38) *
на оптимизации High - address = 536889328 - они не охренели там случайно?
Может на high-оптимизации он находится в регистре или уже в другом регистре, а на выделенном ему месте в стеке или в первоначальном регистре уже давно другие данные. Шагайте в окне дизассемблера и внимательно следите за путешествием address. Сколько я себя помню - "они охреневали" всего два раза и это было на довольно ранних версиях компилятора под конкретную платформу.
Jenya7
Цитата(Непомнящий Евгений @ Aug 10 2017, 19:43) *
Отладчик не всегда показывает правильные значения локальных переменных. Можете так попробовать

Код
volatile uint32_t g_address;
void AT25_Write(uint32_t address, uint8_t *data, uint32_t lenght) {
  g_address = address; // и дальше смотрите адрес в g_address
//...
}

о спасибо. так работает. проблема в том что функция не работала. адрес вычислялся неправильно.
scifi
Яры разные бывают. Например, яр для Coldfire точно генерит неправильный код даже на низком уровне оптимизации.
А вообще на высоком уровне оптимизации трудно отличить свою ошибку от глюка компилятора (второе случается гораздо реже, конечно). В результате оптимизации код вывернут наизнанку, отладчик едва ли показывает что-то вменяемое. Нужно копаться в дизассемблере и соотносить с исходным кодом, а для нетривиальных алгоритмов это адский труд.
Непомнящий Евгений
Цитата(Jenya7 @ Aug 10 2017, 16:50) *
о спасибо. так работает. проблема в том что функция не работала. адрес вычислялся неправильно.


А вот это странно и тут я бы разобрался. Конечно может быть косяк компилятора, но более вероятно что вы где-то заходите в зону UB (неопределенного поведения).

Скажем обращение по нулевому указателю запрещено

Код
void f(char *addr) {
  if (addr)  // этот if на высокой оптимизации будет выкинут, так как
    doSomething();

  *addr = '1'; // эта строка говорит компилятору, что addr точно не 0
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.