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

IAR сходит с ума на High оптимизации

функция

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
//...
}

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


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

на оптимизации High - address = 536889328 - они не охренели там случайно?
Может на high-оптимизации он находится в регистре или уже в другом регистре, а на выделенном ему месте в стеке или в первоначальном регистре уже давно другие данные. Шагайте в окне дизассемблера и внимательно следите за путешествием address. Сколько я себя помню - "они охреневали" всего два раза и это было на довольно ранних версиях компилятора под конкретную платформу.

 

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


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

Отладчик не всегда показывает правильные значения локальных переменных. Можете так попробовать

 

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

о спасибо. так работает. проблема в том что функция не работала. адрес вычислялся неправильно.

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


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

Яры разные бывают. Например, яр для Coldfire точно генерит неправильный код даже на низком уровне оптимизации.

А вообще на высоком уровне оптимизации трудно отличить свою ошибку от глюка компилятора (второе случается гораздо реже, конечно). В результате оптимизации код вывернут наизнанку, отладчик едва ли показывает что-то вменяемое. Нужно копаться в дизассемблере и соотносить с исходным кодом, а для нетривиальных алгоритмов это адский труд.

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


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

о спасибо. так работает. проблема в том что функция не работала. адрес вычислялся неправильно.

 

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

 

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

 

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

  *addr = '1'; // эта строка говорит компилятору, что addr точно не 0
}

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


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

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

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

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

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

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

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

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

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

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