реклама на сайте
подробности

 
 
> Переменная потеряла значение
Beginning
сообщение Nov 23 2007, 10:53
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Столкнулся со следующей проблемой. Компилятор IAR 4.42. Проект превысил 60 кил, и ни каких особых багов я не замечал. Компилил с опцией NONE(BestDebugSupport). Решил откомпилить с опцией Medium и наткнулся на непонятный баг. Из StartUp код прыгает в main там следующий код:
Main()
{
Unsigned int x;
x=calculate_ram_crc();

//Сдесь x=1, как и должно быть

initialisation();
VICIntEnable |= (1<<5);

//Сдесь x=чему угодно???!!!

Кто нибудь сталкивался с таким багом?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Beginning
сообщение Nov 23 2007, 14:12
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Цитата
Переменная может "путешествовать" по регистрам по мере необходимости.

Ну если переменная локальная, то имхо, переадресация её из одного регистра в другой является более "стрессовой" ситуацией для компилятора.
Цитата
Связь между регистрами и переменными - забота компилятора. И скорее всего связи такой нет

Ну здесь Вы лукавите (имхо). Связь между ЛОКАЛЬНЫМИ переменными и регистрами непосредственная. И если помогать в этом компилятору, то и код будет "лучше".

Сообщение отредактировал Beginning - Nov 23 2007, 14:13


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 23 2007, 14:37
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Beginning @ Nov 23 2007, 16:12) *
Ну если переменная локальная, то имхо, переадресация её из одного регистра в другой является более "стрессовой" ситуацией для компилятора.
С чего бы "стрессовой", если он сам ее и перекладывает? На высоких уровнях оптимизации такое встечается.
Цитата(Beginning @ Nov 23 2007, 16:12) *
Ну здесь Вы лукавите (имхо). Связь между ЛОКАЛЬНЫМИ переменными и регистрами непосредственная. И если помогать в этом компилятору, то и код будет "лучше".
Какая может быть связь, если переменная может быть в регистре, а если вдруг этот регистр понадобился - переменная перекочует на стек? Вы "поможете" компилятору, потом добавите еще одну локальную переменную с бОльшим временем жизни и вся ваша "помощь" пойдет коту под хвост, ибо переменные распределятся по регистрам и стеку иначе. Я предпочитаю не мешать компилятору делать его работу. Помогаю, заводя локальные блоки как показывал выше. И ему проще, и мне понятнее.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016