Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: И снова Wiggler & IAR.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
bolmoe
smile3046.gif
Никто не сталкивался с тем, что при отладке в IAR функции memcmp(), strcmp() не сравнивают, хотя физически видно в памяти, что символы совпадают. ???
Кристалл LPC2148, компилер IAR 4.40А
Еще замечено, что при описании струтуры
к пр. typedef struct __SSS{....}sss;
main()
{
sss s;
sss *p;

p=&s;
}

в 'р' не передается адрес струтуры 's', приходится работать через р=malloc() || р=calloc(), хотя опять же видно, что под 's' память выделяется ????

Возможно, что требуются какие то настройки в дебаггере?
scifi
Как это memcmp не сравнивает? В чём это выражается? Может быть, при сравнении структур мешают padding байты? Пробовали пройти по шагам по дизассемблеру?
Ну а отсутствие присваивания напоминает трюки оптимизатора: он может довольно сильно покорёжить код, усложняя отладку. Попробуйте поставить уровень оптимизации на минимум. Или вставьте нетривиальную обработку этой самой переменной p, чтобы оптимизатор её не выкинул.
Сергей Борщ
Цитата(scifi @ Feb 16 2007, 12:27) *
Или вставьте нетривиальную обработку этой самой переменной p, чтобы оптимизатор её не выкинул.
Достаточно завести глобальную переменную такого же типа как и p и присвоить p ей.
bolmoe
Цитата(scifi @ Feb 16 2007, 13:27) *
Как это memcmp не сравнивает? В чём это выражается? Может быть, при сравнении структур мешают padding байты? Пробовали пройти по шагам по дизассемблеру?
Ну а отсутствие присваивания напоминает трюки оптимизатора: он может довольно сильно покорёжить код, усложняя отладку. Попробуйте поставить уровень оптимизации на минимум. Или вставьте нетривиальную обработку этой самой переменной p, чтобы оптимизатор её не выкинул.


Оптимизация на -> Low
а в проге стоит так - if(! memcmp(buf,"бла-бла-бла",11)){...............};else {..........}
заходит в процедуру и отттуда, после первого сравнеия, вываливается, хотя в памяти видно, что символы стоят те же, что и "бла-бла-бла". Поборол тем, что посимвольно по if() отработал....
Сейчас только еще один прикол выпал, отказывается делить величины типа DWORD, причем при делении, к примеру, на 400 все ок, делю на 1500 висяк тут же, с чем связано, тоже пока не понимаю
scifi
Цитата(bolmoe @ Feb 16 2007, 14:13) *
заходит в процедуру и отттуда, после первого сравнеия, вываливается, хотя в памяти видно, что символы стоят те же, что и "бла-бла-бла". Поборол тем, что посимвольно по if() отработал....

Ничего из написанного не понимаю, поэтому ничего и посоветовать не смогу. Кстати, процессор ARM позволяет каждую инструкцию выполнять или не выполнять по условию, без ветвлений. Компилятор этим часто пользуется, и проявляется это в том, что процессор выполняет обе ветки IF, но эффект имеет только одна из них. Тоже может ввести в заблуждение при отладке.
Ну а низший уровень оптимизации - это не Low, а None.
bolmoe
Цитата(scifi @ Feb 16 2007, 17:07) *
Цитата(bolmoe @ Feb 16 2007, 14:13) *

заходит в процедуру и отттуда, после первого сравнеия, вываливается, хотя в памяти видно, что символы стоят те же, что и "бла-бла-бла". Поборол тем, что посимвольно по if() отработал....

Ничего из написанного не понимаю, поэтому ничего и посоветовать не смогу. Кстати, процессор ARM позволяет каждую инструкцию выполнять или не выполнять по условию, без ветвлений. Компилятор этим часто пользуется, и проявляется это в том, что процессор выполняет обе ветки IF, но эффект имеет только одна из них. Тоже может ввести в заблуждение при отладке.
Ну а низший уровень оптимизации - это не Low, а None.


ВСЕМ СПАСИБО! РАЗОБРАЛСЯ! НЕДАВНО В IAR, поэтому и глупые ошибки по незнанию! Размер STACK и HEAP надо просто указывать достаточные для работы программы...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.