|
Глюки компилятора IAR?, Важно! Код прошивки по непонятным причинам не стартует в МК AVR. |
|
|
|
Jan 10 2008, 19:42
|
Частый гость
 
Группа: Свой
Сообщений: 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, воткнул директиву компилятора отключающую оптимизацию именно это процедуры. После этого всё работает. Это конечно ни есть хорошо, но выходя я пока так и не нашёл. Одним словом - шаманство!!!
Посоветуйте, в каком направлении мне копать! Кто сталкивался с такими проблемами?
|
|
|
|
|
 |
Ответов
|
Jan 22 2008, 00:22
|

кекс
     
Группа: Свой
Сообщений: 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", то в общем случае результаты могут не совпадать. Саша, в данном конкретном случае & даст такой же результат как и &&, хотя и более долгим путем  Но в общем случае, конечно надо быть внимательным. Иногда помогает помнить, что в теле if() "==" - это сравнение, а "=" - катастрофа  аналогично для & и | ;>
|
|
|
|
|
Jan 23 2008, 19:45
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|