Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil 4.60 СИ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
MiklPolikov
Сталкиваюсь в Keil 4.60 c какими-то непонятными эффектами при компиляции кода :

Оптимизация выключена (стоит Level -0)

Код
Inline__ void CHECK(void)
{
    char i;
    int  data[10];

   for(i=0;i<10;i++)
     data[i]=1;
}


Смотрю под отладкой стотояние data , и вижу что значения его ячеек не меняются, т.е. строчка data[i]=1; игнорируется, хотя она откомпилирована, программа на неё попадает
и там можно поставить точку останова. volatile int data [ 10 ] ; не помогает.

Если делаю int data [ 10 ] ; глобальной переменной работает как надо.


Вопрос : я чего-то не понимаю, или это какой-то аццкий глюк ?
IgorKossak
Цитата(MiklPolikov @ Jan 24 2013, 20:17) *
Если делаю int data [ 10 ] ; глобальной переменной работает как надо.

В первом случае локальный массив data не используется при выходе из функции, хоть бы он был и volatile.
romas2010
Цитата(MiklPolikov @ Jan 24 2013, 22:17) *
Сталкиваюсь в Keil 4.60 c какими-то непонятными эффектами при компиляции кода :


Вопрос : я чего-то не понимаю, или это какой-то аццкий глюк ?

Это не глюк,это особенности компилятора.Если так на досуге почитать help,то он делает следущее-формальные параметры и локальные переменные он хранит в регистрах соответственно локальной переменной сразу присваивается размер 4 байта,даже если она char.Все,что не разместилось в регистрах,размещается в стековом фрейме.В окне отладки видятся только(!!) "регистрово-размещенные" переменные....все остальное,как говориться -вкладка memory,в поле адреса задать SP и в районе этого адреса минус 30-40 байт примерно наблюдать картину..весь массив размещен в фрейме....вот как-то так вот
esaulenka
Цитата
В окне отладки видятся только(!!) "регистрово-размещенные" переменные....

Это, пардон, где такое написано?
MiklPolikov
Я заметил ещё вот что :
Адрес по которому содержится локальная переменная меняется сам собой, после возврата программы из функции .
Т.е. в функции объявлена переменная, ей присваивается значение. Потом программа уходит во вложенную функцию, возвращается из неё,
и адрес переменной сменился. А значение переменной осталось по тому адресу что был раньше.
Причём в keil 4.52(кажется) этот же код работал, ничего подобного c локальными переменными не происходило.



demiurg_spb
Цитата(MiklPolikov @ Jan 24 2013, 22:17) *
Оптимизация выключена (стоит Level -0)

Думаю что нет ни одной причины использовать такой низкий уровень оптимизации. У меня во всез проектах для keil в ДЕБАГ конфигурации установлен O1.
И не было ещё ни разу желания опускать его ниже.
Golikov A.
ЭТО ГЛЮК!!!!!
сам 2 часа втыкал.

если вы после цикла присвоите какой то переменной что-то из массива, там будет 1. И все проверки пройдет. Со всеми локальными масивами такая беда, сделайте его глобальным и все сразу заработает... Подчеркиваю это только глюк отображения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.