jenya7 0 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба функция 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 - они не охренели там случайно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба Отладчик не всегда показывает правильные значения локальных переменных. Можете так попробовать volatile uint32_t g_address; void AT25_Write(uint32_t address, uint8_t *data, uint32_t lenght) { g_address = address; // и дальше смотрите адрес в g_address //... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба на оптимизации High - address = 536889328 - они не охренели там случайно?Может на high-оптимизации он находится в регистре или уже в другом регистре, а на выделенном ему месте в стеке или в первоначальном регистре уже давно другие данные. Шагайте в окне дизассемблера и внимательно следите за путешествием address. Сколько я себя помню - "они охреневали" всего два раза и это было на довольно ранних версиях компилятора под конкретную платформу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба Отладчик не всегда показывает правильные значения локальных переменных. Можете так попробовать volatile uint32_t g_address; void AT25_Write(uint32_t address, uint8_t *data, uint32_t lenght) { g_address = address; // и дальше смотрите адрес в g_address //... } о спасибо. так работает. проблема в том что функция не работала. адрес вычислялся неправильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 августа, 2017 Опубликовано 10 августа, 2017 · Жалоба Яры разные бывают. Например, яр для Coldfire точно генерит неправильный код даже на низком уровне оптимизации. А вообще на высоком уровне оптимизации трудно отличить свою ошибку от глюка компилятора (второе случается гораздо реже, конечно). В результате оптимизации код вывернут наизнанку, отладчик едва ли показывает что-то вменяемое. Нужно копаться в дизассемблере и соотносить с исходным кодом, а для нетривиальных алгоритмов это адский труд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 11 августа, 2017 Опубликовано 11 августа, 2017 · Жалоба о спасибо. так работает. проблема в том что функция не работала. адрес вычислялся неправильно. А вот это странно и тут я бы разобрался. Конечно может быть косяк компилятора, но более вероятно что вы где-то заходите в зону UB (неопределенного поведения). Скажем обращение по нулевому указателю запрещено void f(char *addr) { if (addr) // этот if на высокой оптимизации будет выкинут, так как doSomething(); *addr = '1'; // эта строка говорит компилятору, что addr точно не 0 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться