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

 
 
 
Reply to this topicStart new topic
> Переменная потеряла значение
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
alexander55
сообщение Nov 23 2007, 11:12
Сообщение #2


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Beginning @ Nov 23 2007, 13:53) *

А x используется дальше где-нибудь ?
Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 23 2007, 12:40
Сообщение #3


Знающий
****

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



Чёта я не понял? А куда мая предыдущая месага делась????
Х - так называемая расходная переменная, она дальше в main в сотни случаях пользуется.


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


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(alexander55 @ Nov 23 2007, 14:12) *
А x используется дальше где-нибудь ?

Я бы спросил точнее: значение переменной x, полученное в результате вызова calculate_ram_crc(), где-нибудь используется? Если нет, то компилятор имеет полное право его выкинуть.
Цитата(Beginning @ Nov 23 2007, 15:40) *
Чёта я не понял? А куда мая предыдущая месага делась????

Может быть, там были матюки? Если так, то отмодерили.
Цитата(Beginning @ Nov 23 2007, 15:40) *
Х - так называемая расходная переменная

Совет по стилю: вместо одной расходной переменной лучше применять разные, чтобы имя переменной в каждой отдельной ситуации поясняло, зачем она используется. Работа компилятора - сделать код не хуже, чем при использовании одной переменной. Ему это вполне по силам.
Цитата(Beginning @ Nov 23 2007, 15:40) *
она дальше в main в сотни случаях пользуется.

Ещё один совет по стилю: если функция раздулась до сотни строк, значит её надо разбивать на подфункции.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 23 2007, 12:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Beginning @ Nov 23 2007, 15:40) *
Х - так называемая расходная переменная, она дальше в main в сотни случаях пользуется.

Если программа выглядит примерно так:
Код
int main(void)
{
    unsigned int x;
    x = calculate_ram_crc();

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

    // 1

    for(x = 0; x < 8; x++)
    {
        ...
    }
}

то в точке 1 x может быть каким угодно.
Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 23 2007, 13:14
Сообщение #6


Знающий
****

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



Цитата
Я бы спросил точнее: значение переменной x, полученное в результате вызова calculate_ram_crc(), где-нибудь используется? Если нет, то компилятор имеет полное право его выкинуть.

Разумеется. Функция calculate_ram_crc проверяет RAM и возвращает succes или false и соответственно далее в зависимости от результата, идёт разветвление программы, конкретно в моём примере следующим образом:
while(x)
{
...
}
Цитата
Может быть, там были матюки? Если так, то отмодерили.

Да нет???? Мне кто-то ответил, что сталкивался с таким, я спросил в чём грабдли были. После обеда, пришёл и в придкушении ответа зашёл на форум, а тут не моего ни его ответов нет!
Цитата
Совет по стилю: вместо одной расходной переменной лучше применять разные, чтобы имя переменной в каждой отдельной ситуации поясняло, зачем она используется.

Смысловые переменные конечно имеют уникальные названия, но согласитесь есть очень много мест где переменная требуется максимум на пару строк, тот же самый пресловутый:
Цитата
for(x = 0; x < 8; x++)

Т.к. число регистров у ARM7 весьма ограничено то и приходится использовать переменные повторно. Впринципе, я считаю это обсалютно нормальным.
Цитата
Ещё один совет по стилю: если функция раздулась до сотни строк, значит её надо разбивать на подфункции.

Это я образно выразился. Если кусок кода начинает приобретать лёгкие черты инкапсуляции то он сразу превращается в функцию smile.gif
Ну а теперь вернусь к своим "баранам". Переменную анализирую выводом в терминал. Без оптимизации всё работает отлично. С аптимизацией нет. Пока не копаюсь в дезасемблировании поскольку, даже если найду ущербный код, то это не поможет от него избавится. smile3046.gif


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


Гуру
******

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



Цитата(Beginning @ Nov 23 2007, 15:14) *
Да нет???? Мне кто-то ответил, что сталкивался с таким, я спросил в чём грабдли были. После обеда, пришёл и в придкушении ответа зашёл на форум, а тут не моего ни его ответов нет!
Днем было какое-то странное поведение, возможно форум падал и восстановился с предыдущего бекапа.
Цитата(Beginning @ Nov 23 2007, 15:14) *
Смысловые переменные конечно имеют уникальные названия, но согласитесь есть очень много мест где переменная требуется максимум на пару строк, тот же самый пресловутый:
Код
{
    uint_fast8_t x;
    for(x = 0; x < 8; x++)
    {
        ......
    }
}
Тут четко видно, что х - временная переменная и дальше не используется. Или использовать плюсы и тогда for(uint_fast8_t x = 0; x < 8; x++) {}
Цитата(Beginning @ Nov 23 2007, 15:14) *
Т.к. число регистров у ARM7 весьма ограничено то и приходится использовать переменные повторно. Впринципе, я считаю это обсалютно нормальным.
Связь между регистрами и переменными - забота компилятора. И скорее всего связи такой нет. Переменная может "путешествовать" по регистрам по мере необходимости. Повторное использование переменной скорее мешает компилятору, чем помогает.

А по вашей проблеме - стека хватает? Ваша переменная x на время вызова промежуточных функций хранится на стеке, если вы пройдетесь отладчиком по дизассемблеру - можете увидеть кто ее портит и понять почему.


--------------------
На любой вопрос даю любой ответ
"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
IgorKossak
сообщение Nov 23 2007, 13:53
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Beginning @ Nov 23 2007, 15:14) *
А куда мая предыдущая месага делась????
...
Мне кто-то ответил, что сталкивался с таким, я спросил в чём грабдли были. После обеда, пришёл и в придкушении ответа зашёл на форум, а тут не моего ни его ответов нет!

Скрыта вместе с предыдущим бессодержательным ответом.
Сообщения, как и названия тем, должны быть хоть как-то наполнены смыслом.
Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 23 2007, 14:12
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 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
Beginning
сообщение Nov 26 2007, 15:34
Сообщение #11


Знающий
****

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



Cупер компилятор выдал следующий перл. При максимальной компиляции генерит код который сразу вываливается в UNDEF 07.gif Есть один момент, который необходимо знать. При поиске IAR4.42 не нашёл полную установочную версию, зато нашёл самораспаковывающуюся. 10 метров заархивированных 7z разорхивировалися в 160 метров!!! Проверял – вроде всё на месте, кроме helpov. Кто ни будь сталкивался с такими чудесами?


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


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Beginning @ Nov 26 2007, 18:34) *
10 метров заархивированных ... в 160 метров!!!

Извините, я в глубоко сомневаюсь. Тут какая-то лажа. biggrin.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 27 2007, 08:39
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Beginning @ Nov 26 2007, 17:34) *
Cупер компилятор выдал следующий перл....

smile.gif
Цитата
При поиске IAR4.42 не нашёл полную установочную версию, зато нашёл самораспаковывающуюся.

Это как-же нужно было "искать" что-бы на родном сайте IAR просто не взять sad.gif.

Moderator:
Придерживайтесь заявленной темы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 28 2007, 07:22
Сообщение #14


Знающий
****

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



Цитата
Это как-же нужно было "искать" что-бы на родном сайте IAR просто не взять

Мне надо было с ключиком. Проект кже давно за 30 кил разрешённых в триальной версии.
Цитата
Извините, я в глубоко сомневаюсь. Тут какая-то лажа.

А вы попробуйте сжать свой установленный IAR хотябы RAR, и с удивлением обнаружите что он сжался раз в 5! Не 10 метров конечно но ~24 у меня сжался.


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

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

 


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


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