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

 
 
> Глюки компилятора IAR?, Важно! Код прошивки по непонятным причинам не стартует в МК AVR.
DiMonstr
сообщение Jan 10 2008, 19:42
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706



Всех с прошедшими праздниками!

Присказка.
Чуть больше 6 месяцев вплотную работаю с контроллерами ATMEL и компилятором IAR. Каких только финтов не выкидывала эта связка и вот очередная проблема.Программлю я поэтапно, шаг за шагом проверяя функционально законченные блоки кода. В результате, у меня получился основной код девайса и код, который производит самотестирование периферии контроллера. По отдельности все отлично и стабильно работает. Пришло время отлаживать всё в комплексе и тут начался полтергейст, который я пытаюсь изкоренить методом прямого шаманства. В чём причина конккретно не знаю, одни догадки...
Суть проблемы.
Короче код после прошивки то запускаетя и работает, то вообще не исполняется ни одной команды. Крутил оптимизацию, распределение памяти - не помогло. Со сбросом всё в порядке, схема не причем, контроллер тоже. Остается компилятор и наверное настройки файла *.xcl
Контроллер использую Atmega8. Пишу на С. Использую стандартный lnkm8.xcl. high оптимизация проекта по размеру.
IDE:
IAR 4.20A/W32 [Evaluation] (4.20.1.3).
Компилятор:
IAR XLIB 3.29L/386 (3.29.0.12)
IAR XLINK 4.59Z (4.59.26.0)


Из своего опыта. Кодил я девайс: считыватель чип-карт, который подключается к USB. Отлаживал отдельно часть кода для работы с картой ичасть кода для обмена по USB. Поставил оптимизацию всего проекта по скорости, т.к. 10 байт с карты приходили верный, а остальные контроллер не успевал обрабатывать (кодил опять же на С). Ладно добился правильной работы оптимизацией. Как только я начал отлаживать все в комплексе - обмен с картой и обмен по USB, то начались проблемы! С картой обмен есть, с USB нет. Оптимизацию вырубаю - наоборот с USB работает, а с карты искаженные данные. Долго я шаманил над проектом... И в итоге сделал так: включил оптимизацию проекта по скорости, а перед теми функциями, которые конкретно отвечают за обмен с USB, воткнул директиву компилятора отключающую оптимизацию именно это процедуры. После этого всё работает. Это конечно ни есть хорошо, но выходя я пока так и не нашёл. Одним словом - шаманство!!!


Посоветуйте, в каком направлении мне копать! Кто сталкивался с такими проблемами?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Jan 22 2008, 00:22
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
А я сначала и объявлял переменные через структуру. Только не смог передать содержимое структуры не в массив, не напрямую в eeprom. Я вообще не знал про эту функцию:
...
А каким образом можно без неё вообще обойтись и записывать структуру непосредственно в eeprom?

Можно написать свою функцию для записи блоков в eeprom, например такую:

Код
void store_to_eeprom( int dst_addr, void *pData, int size)
{
      unsigned char *p = (unsigned char *)pData;
      while( size--)
           EEPROM_write_byte( dst_addr++, *p++);
}


и передавать структуры посредством указателей:

Код
store_to_eeprom( RTC_OFFSET, &rtcTime, sizeof( rtcTime ));

В этой функции Вы можете добалять какую-то служебную информацию, например CRC для записываемого блока или таги для поиска как у Вас было. Так можно сократить количество повторяющегося кода.

Если пользуетесь компилятором от IAR, то перед структурой можно поставить ключевое слово __eeprom и она будет располагаться в eeprom'е сразу, и пользоваться ее полями можно точно так же как если бы она лежала в RAM. Но не следует этим злоупотреблять, т.к. надо помнить, что ресурс eeprom ограничен.

Цитата(SasaVitebsk @ Jan 21 2008, 22:43) *
Цитата
результат при сравнении операторами '&' или '&&' будет одинаков

Нет не верно.
выражение внутри скобок if (Value > MinValue && Value < MaxValue) означает что если Value > MinValue И Value < MaxValue, то ... Если вы вместо && поставите &, то это будет означать, что сначала выполнятся два сравнения потом выполнится логическое & над результатами а потом результат будет сравнён с "0". Поскольку значение "true" определена как "не 0", то в общем случае результаты могут не совпадать.

Саша, в данном конкретном случае & даст такой же результат как и &&, хотя и более долгим путем smile.gif
Но в общем случае, конечно надо быть внимательным.
Иногда помогает помнить, что в теле if() "==" - это сравнение, а "=" - катастрофа smile.gif
аналогично для & и | ;>
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 23 2008, 19:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Jan 22 2008, 04:22) *
Саша, в данном конкретном случае & даст такой же результат как и &&, хотя и более долгим путем smile.gif
Но в общем случае, конечно надо быть внимательным.
Иногда помогает помнить, что в теле if() "==" - это сравнение, а "=" - катастрофа smile.gif
аналогично для & и | ;>


В данном случае я отвечал не на вопрос "будет ли такой же результат", а отвечал на вопрос "как я понимаю". И подтверждаю, что человек неправильно понимает. Компилятор IAR результат логической операции принимает как 0 или 1, но это не гарантируется стандартом о чём я и высказался. Согласно стандарту - 0 и отличное от нуля значение. А это отнюдь не 1. Иными словами если в одном выражении будет к примеру 1 а в другом 2, то согласно стандарту всё будет корректно но логическое & над этими операндами даст 0, а это не верный результат. Конечно это чисто теоретический случай, но понимание работы должно быть полным. Программист не должен полагаться на конкретную реализацию компилятора, а должен ориентироваться на стандарт. Тем более, что эта мелочь действительно приведёт к настоящей ошибке в другом месте. То есть человек должен понимать разницу между побитовой и логической операцией.

Сравните например:
79 if(~Flag.Sek)show(1,j);
\ 00000046 01A2 MOVW R21:R20, R5:R4
\ 00000048 01B3 MOVW R23:R22, R7:R6
\ 0000004A E001 LDI R16, 1
\ 0000004C .... RCALL show

и
79 if(!Flag.Sek)show(1,j);
\ 00000046 .... LDI R30, Flag
\ 00000048 E0F0 LDI R31, 0
\ 0000004A 8100 LD R16, Z
\ 0000004C FD00 SBRC R16, 0
\ 0000004E C004 RJMP ??main_0
\ 00000050 01A2 MOVW R21:R20, R5:R4
\ 00000052 01B3 MOVW R23:R22, R7:R6
\ 00000054 E001 LDI R16, 1
\ 00000056 .... RCALL show
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 23 2008, 22:37
Сообщение #4


Гуру
******

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



Цитата(SasaVitebsk @ Jan 23 2008, 21:45) *
Компилятор IAR результат логической операции принимает как 0 или 1, но это не гарантируется стандартом о чём я и высказался. Согласно стандарту - 0 и отличное от нуля значение. А это отнюдь не 1.
Ну это не совсем так и компилятор точно следует стандарту:
Цитата
6.5.13 Logical AND operator
3 The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.
4 Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.
Т.е. "ноль" и "не ноль" отностится не к результату, а к операндам.
Цитата
6.5.13 Logical AND operator
3 The usual arithmetic conversions are performed on the operands.
4 The result of the binary & operator is the bitwise AND of the operands (that is, each bit in the result is set if and only if each of the corresponding bits in the converted operands is set).

Поэтому первое отличие: для A=1 и B=2 A&B=0, A&&B=1.
Второе - для && операнды вычисляются слева направо и если правый операнд равен нулю, то уже сразу известно, что и результат будет равен нулю, поэтому второй операнд вычисляться не будет.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- DiMonstr   Глюки компилятора IAR?   Jan 10 2008, 19:42
- - prottoss   Цитата(DiMonstr @ Jan 11 2008, 02:42) Пос...   Jan 10 2008, 19:59
- - DiMonstr   Забыл спросить. А есть ли у компилятора такая фишк...   Jan 10 2008, 20:26
- - arttab   у вас не было подозрения что работа по usb и карто...   Jan 11 2008, 02:01
- - GDI   При борьбе со стеками очень помогает включение ген...   Jan 11 2008, 07:02
|- - DiMonstr   Цитата(GDI @ Jan 11 2008, 10:02) Этой фи...   Jan 12 2008, 14:28
|- - Dog Pawlowa   Цитата(DiMonstr @ Jan 12 2008, 18:28) И т...   Jan 12 2008, 14:48
|- - zltigo   Цитата(DiMonstr @ Jan 12 2008, 16:28) Нее...   Jan 12 2008, 14:49
|- - DiMonstr   Цитата(zltigo @ Jan 12 2008, 17:49) Есл...   Jan 12 2008, 15:00
|- - singlskv   Цитата(zltigo @ Jan 12 2008, 17:49) Повто...   Jan 12 2008, 18:21
|- - Сергей Борщ   Цитата(singlskv @ Jan 12 2008, 20:21) пре...   Jan 12 2008, 18:56
|- - DiMonstr   Цитата(singlskv @ Jan 12 2008, 21:21) Авт...   Jan 12 2008, 19:56
||- - Baser   Цитата(DiMonstr @ Jan 12 2008, 21:52) В д...   Jan 12 2008, 20:11
||- - Сергей Борщ   Цитата(DiMonstr @ Jan 12 2008, 21:56) А у...   Jan 12 2008, 20:12
||- - DiMonstr   Цитата(Сергей Борщ @ Jan 12 2008, 23:12) ...   Jan 12 2008, 20:21
|- - zltigo   Цитата(singlskv @ Jan 12 2008, 20:21) Это...   Jan 12 2008, 20:00
- - Сергей Борщ   Цитата(DiMonstr @ Jan 10 2008, 21:42) При...   Jan 11 2008, 08:11
|- - DiMonstr   Цитата(Сергей Борщ @ Jan 11 2008, 11:11) ...   Jan 12 2008, 14:03
||- - zltigo   Цитата(DiMonstr @ Jan 12 2008, 15:59) Да ...   Jan 12 2008, 14:04
|- - MrYuran   Цитата(Сергей Борщ @ Jan 11 2008, 11:11) ...   Mar 3 2008, 14:31
|- - SasaVitebsk   Цитата(MrYuran @ Mar 3 2008, 18:31) А я ч...   Mar 3 2008, 15:46
|- - Сергей Борщ   Цитата(MrYuran @ Mar 3 2008, 16:31) А я ч...   Mar 3 2008, 18:28
- - zltigo   ЦитатаЕсли говорить... Попробуйте хотя-бы прочитат...   Jan 12 2008, 15:10
|- - DiMonstr   Цитата(zltigo @ Jan 12 2008, 18:10) Код...   Jan 12 2008, 15:20
- - Dog Pawlowa   Код рабочий? Тогда какие проблемы?   Jan 12 2008, 15:52
- - AndyBig   Если контроллер не успевает выполнять все функции ...   Jan 12 2008, 22:58
- - DiMonstr   Выкладываю исходники проекта. Попробуйте прошить к...   Jan 20 2008, 15:26
|- - SasaVitebsk   Цитата(DiMonstr @ Jan 20 2008, 19:26) Что...   Jan 20 2008, 16:58
|- - DiMonstr   Цитата(SasaVitebsk @ Jan 20 2008, 19:58) ...   Jan 20 2008, 17:23
|- - aesok   Цитата(SasaVitebsk @ Jan 20 2008, 19:58) ...   Jan 20 2008, 17:34
|- - DiMonstr   Цитата(aesok @ Jan 20 2008, 20:34) Прави...   Jan 20 2008, 18:39
- - SasaVitebsk   Приведу пример для понимания происходящего допусти...   Jan 20 2008, 19:01
- - forever failure   Кто нить ещё смотрел этот проект? Впечатление в ц...   Jan 21 2008, 03:50
|- - DiMonstr   Цитата(forever failure @ Jan 21 2008, 06...   Jan 21 2008, 11:58
|- - Сергей Борщ   Цитата(DiMonstr @ Jan 21 2008, 13:58) 1) ...   Jan 21 2008, 12:19
||- - Qwertty   Цитата(Сергей Борщ @ Jan 21 2008, 15:19) ...   Jan 21 2008, 12:56
|||- - defunct   Цитата(Qwertty @ Jan 21 2008, 15:56) Я во...   Jan 21 2008, 13:04
|||- - Qwertty   Цитата(defunct @ Jan 21 2008, 16:04) type...   Jan 21 2008, 13:21
||- - DiMonstr   Цитата(Сергей Борщ @ Jan 21 2008, 15:19) ...   Jan 21 2008, 19:35
||- - SasaVitebsk   Цитата(DiMonstr @ Jan 21 2008, 23:27) Т.е...   Jan 21 2008, 19:43
|- - aesok   В функциях EEPROM_* - не должны разрешаться прерыв...   Jan 21 2008, 20:05
|- - DiMonstr   Цитата(aesok @ Jan 21 2008, 23:05) В функ...   Jan 24 2008, 17:13
|- - defunct   Цитата(DiMonstr @ Jan 24 2008, 20:13) Я г...   Jan 24 2008, 17:24
- - forever failure   /* if (Value > MinValue & Value < MaxVal...   Jan 21 2008, 12:42
- - SasaVitebsk   Если честно я тоже скачал данную прогу. Но при так...   Jan 21 2008, 12:52
|- - defunct   Цитата(Сергей Борщ @ Jan 24 2008, 01:37) ...   Jan 23 2008, 23:37
|- - Сергей Борщ   Цитата(defunct @ Jan 24 2008, 01:37) Как ...   Jan 24 2008, 15:17
- - Freeze Anti   Как я и предполагал с самого начала, вашей програм...   Jan 23 2008, 18:45
|- - DiMonstr   Цитата(Freeze Anti @ Jan 23 2008, 21:45) ...   Jan 24 2008, 16:44
- - SasaVitebsk   2 Сергей Борщ. Собственно именно это я и хотел ска...   Jan 24 2008, 12:47
- - prottoss   ЦитатаА можно ли увеличить пространство оперативки...   Jan 24 2008, 16:58
|- - DiMonstr   Цитата(prottoss @ Jan 24 2008, 19:58) Мож...   Jan 24 2008, 18:49
|- - prottoss   Цитата(DiMonstr @ Jan 25 2008, 01:49) Не ...   Jan 24 2008, 19:06
|- - DiMonstr   Цитата(prottoss @ Jan 24 2008, 22:06) Да...   Jan 24 2008, 19:34
- - SasaVitebsk   И вы невнимательно прочитали то, что сами процитир...   Jan 24 2008, 18:54
- - Freeze Anti   про типы переменных я говорил, что если у вас пере...   Jan 24 2008, 19:32
- - prottoss   ЦитатаНо я так и не врубился че значит цифра ...   Jan 24 2008, 20:17
|- - DiMonstr   Цитата(prottoss @ Jan 24 2008, 23:17) Раз...   Jan 24 2008, 21:25
|- - Сергей Борщ   Цитата(DiMonstr @ Jan 24 2008, 23:25) Всё...   Jan 25 2008, 08:45
|- - DiMonstr   Цитата(Сергей Борщ @ Jan 25 2008, 11:45) ...   Jan 25 2008, 13:31
|- - SasaVitebsk   Цитата(DiMonstr @ Jan 25 2008, 17:31) В у...   Jan 25 2008, 13:36
|- - Сергей Борщ   Цитата(DiMonstr @ Jan 25 2008, 15:31) Эта...   Jan 25 2008, 13:58
|- - DiMonstr   Цитата(Сергей Борщ @ Jan 25 2008, 16:58) ...   Jan 25 2008, 14:09
- - Сергей Борщ   Вы утверждали, что это "Эта фишка (и не тольк...   Jan 25 2008, 15:09
|- - DiMonstr   Цитата(Сергей Борщ @ Jan 25 2008, 18:09) ...   Feb 9 2008, 19:41
- - DiMonstr   А может попробовать скомпилять проект в WinAVR? Да...   Feb 9 2008, 21:24
|- - singlskv   Цитата(DiMonstr @ Feb 10 2008, 00:24) А м...   Feb 9 2008, 22:09
|- - zltigo   Цитата(singlskv @ Feb 10 2008, 01:09) Вы ...   Feb 9 2008, 23:17
|- - DiMonstr   Цитата(zltigo @ Feb 10 2008, 02:17) Я с ...   Feb 10 2008, 09:28
|- - singlskv   Цитата(zltigo @ Feb 10 2008, 02:17) Можно...   Feb 11 2008, 21:00
- - forever failure   Хинт: уберите весь (да, весь, вообще весь) код, до...   Feb 10 2008, 10:58
|- - DiMonstr   Цитата(forever failure @ Feb 10 2008, 13...   Feb 10 2008, 12:32
- - DiMonstr   Попутно ещё вопрос. Что происходит если программа ...   Feb 10 2008, 13:35
- - VladislavS   0xFFFF так же как NOP отрабатывается. Ничем забива...   Feb 10 2008, 14:56
- - DiMonstr   Как в IAR написать код, который будет выполняться ...   Feb 11 2008, 20:17
|- - zltigo   Цитата(DiMonstr @ Feb 11 2008, 23:17) Ком...   Feb 11 2008, 20:48
- - DiMonstr   Спасибо.   Feb 11 2008, 21:00
|- - bzx   Цитата(DiMonstr @ Feb 12 2008, 00:00) Спа...   Feb 11 2008, 21:20
|- - DiMonstr   Цитата(bzx @ Feb 12 2008, 00:20) Надеюсь ...   Feb 12 2008, 17:44
|- - singlskv   Цитата(DiMonstr @ Feb 12 2008, 20:44) Во-...   Feb 12 2008, 18:42
- - forever failure   Кстати, кто-нить смотрел checkjump.asm ? Особенно ...   Feb 13 2008, 06:09
|- - DiMonstr   Цитата(forever failure @ Feb 13 2008, 09...   Feb 13 2008, 20:31
|- - bzx   Цитата(DiMonstr @ Feb 13 2008, 23:31) Или...   Feb 13 2008, 21:21
- - GDI   ЦитатаЯ не понимаю почему не стоит делать проверки...   Feb 13 2008, 07:39
- - forever failure   Прогнать в симуляторе АВР студии полученный код не...   Feb 14 2008, 04:36
|- - DiMonstr   Цитата(forever failure @ Feb 14 2008, 07...   Feb 14 2008, 06:10
|- - IgorKossak   Цитата(DiMonstr @ Feb 14 2008, 08:10) Про...   Feb 14 2008, 06:34
|- - Сергей Борщ   Цитата(DiMonstr @ Feb 14 2008, 08:10) Да ...   Feb 14 2008, 08:48
- - DiMonstr   Всех приветствую!!! Я нашел причину ...   Mar 3 2008, 19:51


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

 


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


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