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

Keil 4.60 СИ

Сталкиваюсь в 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=1; игнорируется, хотя она откомпилирована, программа на неё попадает

и там можно поставить точку останова. volatile int data [ 10 ] ; не помогает.

 

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

 

 

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

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


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

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

В первом случае локальный массив data не используется при выходе из функции, хоть бы он был и volatile.

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


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

Сталкиваюсь в Keil 4.60 c какими-то непонятными эффектами при компиляции кода :

 

 

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

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

Изменено пользователем IgorKossak
избыточное цитирование

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


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

В окне отладки видятся только(!!) "регистрово-размещенные" переменные....

Это, пардон, где такое написано?

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


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

Я заметил ещё вот что :

Адрес по которому содержится локальная переменная меняется сам собой, после возврата программы из функции .

Т.е. в функции объявлена переменная, ей присваивается значение. Потом программа уходит во вложенную функцию, возвращается из неё,

и адрес переменной сменился. А значение переменной осталось по тому адресу что был раньше.

Причём в keil 4.52(кажется) этот же код работал, ничего подобного c локальными переменными не происходило.

 

 

 

 

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


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

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

Думаю что нет ни одной причины использовать такой низкий уровень оптимизации. У меня во всез проектах для keil в ДЕБАГ конфигурации установлен O1.

И не было ещё ни разу желания опускать его ниже.

 

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


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

ЭТО ГЛЮК!!!!!

сам 2 часа втыкал.

 

если вы после цикла присвоите какой то переменной что-то из массива, там будет 1. И все проверки пройдет. Со всеми локальными масивами такая беда, сделайте его глобальным и все сразу заработает... Подчеркиваю это только глюк отображения.

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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