Отговори на тема  [ 14 мнения ] 
Поведение на променлива с и без оптимизация 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 15, 2007 11:24 pm
Мнения: 109
Мнение Поведение на променлива с и без оптимизация
Става въпрос за лонг инт променлива в С30 - инкрементира се с единица. Наглед ясно и просто занимание обаче като изключа оптимизацията стойността на променливата започва да се променя с огромни стойности и по време което явно е случайно. Като включа оптимизатора нещата са наред но въпроса ме тормози защо се получава така. Бях чел във форума за делариране на променливи които се държат по подобен начин но не мога да открия темата. Има ли някой представа какво може да се обърква?


Чет Фев 14, 2008 11:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Дали не я омазваш някъде. Някъде да пишеш извън границите на буфер,стека да омазваш и т.н. По скоро проблемите обикновенно са от такова естетство.

Обикновенно проблема е обратен. Оптимизацията причинява странно поведение на програмата :)


Пет Фев 15, 2008 1:01 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 05, 2005 9:34 am
Мнения: 88
Мнение 
Здравейте. Като стана въпрос за оптимизацията...... вие с какви параметри я пускате ????


Пет Фев 15, 2008 11:22 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Обикновено четенето на генерирания асемблерски код помага да се ориентираш за проблема...

p.s. темата, която си чел вероятно е тази, но не знам доколко има връзка с твоя случай
http://www.mcu-bg.com/mcu_site/viewtopi ... E3&start=0


Пет Фев 15, 2008 1:20 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 15, 2007 11:24 pm
Мнения: 109
Мнение 
Променливата се инкрементира при ивенти които са на 2-3 сек и просто не би трябвало да приема изведнъж такива огромни стойности. В момента съм дал борда да го тестват и не мога да си правя експерименти но наистина е странно че с оптимизацията се държи добре а без нея се омазва. Като получа борда ще го почопля и ще постна резултати.


Пет Фев 15, 2008 8:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
така без сорс какво да кажем,
но гаранция - грешката е "твоя"

_________________
main[-1u]={1};


Пет Фев 15, 2008 8:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
mk912 написа:
Променливата се инкрементира при ивенти които са на 2-3 сек и просто не би трябвало да приема изведнъж такива огромни стойности. ...


като ти чета "разсъжденията" - и аз съм за "грешката е изцяло твоя" :)

_________________
путинофили: "иди н***й"


Пет Фев 15, 2008 8:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
volatile ? :arrow:


Пет Фев 15, 2008 11:05 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
наистина е странно че точно при оптимизация бачка а без оптимизация не. обикновенно е обратното, и тука даже ти предложиха да ползваш volatile, което в такива случаи помага, но в твоя би трябвало да навреди :)
впрочем сигурен ли си че точно СЪС оптимизация работи? и както ти каза вече някой, в такива случаи се гледа асемблерския код. наивен е този който си мисли че може да дебъгва без да знае асемблер. дори джава и .нет средите показват асемблерския псевдокод, познай от три пъти защо.


Съб Фев 16, 2008 9:55 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 15, 2007 11:24 pm
Мнения: 109
Мнение 
Наистина не се изразих коректно в последния си пост. Имах предвид че кода е доста ясен а променливата променя стойността си само при инкрементиране. Поведението беше странно и защото бях тествал таргета може би около 2 седмици без никакви проблеми от този сорт. Имах съмнения че ИСД-то почва да се побърква - бях оставил компа и ИСД-то включени няколко дена. Ще проверя задължително асемблера лошото е че не знам дали сега ако изключа оптимизацията ще се прояви.


Съб Фев 16, 2008 11:52 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Юни 29, 2007 10:59 pm
Мнения: 113
Мнение 
Ето един сценарий, при който с оптимизация работи, а без оптимизация - не и при който дори академично познание на асемблер няма да помогне особено. Не е същия компилатор или uC, но е пример при това личен.
Определил съм си стека с дълбочина например 64. Точно на адреса след тях се разполага въпросната променлива. Без оптимизация: локалните променливи се разполагат в стека, работните регистри преди всеки "call", както и адресa за връщане след излизане от подпрограма. При достатъчен брой влизания в подпрогами с локални променливи и т.н. се получава препълване на стека и запис в адреса отвъд ръба му, с което променя нежелано съдържанието на въпросната променлива. Тук вече зависи от средата дали ще изпищи или не. IAR-ци например в по-старите версии си мълчат. При това, ако ще пищи това може да стане единствено runtime или при симулиране, поради липса на друг механизъм. От друга страна с оптимизация ви е ясно - спестяване на "call" и тенденция към разполагане на кода на функцията в извикващата функция - достатъчно за да намали размера на употребявания стек.


Нед Фев 17, 2008 10:37 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 15, 2007 11:24 pm
Мнения: 109
Мнение 
Проблема се оказа че външно устройство което подава данните - въпросния евент на 2-3 сек - е спряло да работи. Аз (в лицето на мцу-то) чакам за определен символ и в следствие на това в н мерен масив се записват н*м данни. Трябваше да му направя проверка още в началото но все си намирах по-интересни задачи. Проблема доста напомня този от предишния пост. Препълването на масива скапва въпросната променлива.


Вто Фев 19, 2008 8:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Знаеш ли какво е отврат ?
Да търсиш софтуерен бъг в устройство с дефектен хардуер, на което софтът му е ОК. :wink:


Съб Фев 23, 2008 3:56 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
bateAz написа:
Знаеш ли какво е отврат ?
Да търсиш софтуерен бъг в устройство с дефектен хардуер, на което софтът му е ОК. :wink:


Мен ми се е случвало обратното. :)


Пон Фев 25, 2008 4:33 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни