|
|
  |
Глюки компилятора 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 10 2008, 20:26
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706

|
Забыл спросить. А есть ли у компилятора такая фишка: хочу чтобы в зависимости от значения параметра в коде программы компилятор создавал прошивку с именем файла в зависимости от значения этого параметра. Цитата(prottoss @ Jan 10 2008, 22:59)  Пробовал сократить количество вхождений подпрограмм. Разместил почти все подпрограммы в одной. После этого ситуация немного изменилась в лучшую сторону. Количество отказов стало меньше, но проблема-то осталась. Сначала подозрение было на распределение памяти и стека, но я отбросил эту мысль, т.к. программа вообще не запускается и подпрограммы не возвращают никаких параметров.
|
|
|
|
|
Jan 11 2008, 08:11
|

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

|
Цитата(DiMonstr @ Jan 10 2008, 21:42)  Пришло время отлаживать всё в комплексе и тут начался полтергейст, который я пытаюсь изкоренить методом прямого шаманства. В чём причина конккретно не знаю, одни догадки... Первое, что нужно сделать - посмотреть в листинг и убедиться, что компилятор понял вас правильно. Цитата(DiMonstr @ Jan 10 2008, 21:42)  Короче код после прошивки то запускаетя и работает, то вообще не исполняется ни одной команды. Крутил оптимизацию, распределение памяти - не помогло. Со сбросом всё в порядке, схема не причем, контроллер тоже. Остается компилятор и наверное настройки файла *.xcl Это понятно, что компилятор обвинить проще простого. У меня подобное поведение наблюдалось однажды, когда ошибочно был установлен фуз BRST. А у студента - когда подтяжка ресета вместо питания была подключена к одному из портов. Он порт настраивает на вывод - контроллер ресетится. В общем есть предложение поспорить на ящик пива, что компилятор снова не при чем, а виноваты недостаток знаний и опыта.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 12 2008, 14:03
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706

|
Цитата(Сергей Борщ @ Jan 11 2008, 11:11)  ...В общем есть предложение поспорить на ящик пива, что компилятор снова не при чем, а виноваты недостаток знаний и опыта. Да запросто! Так все дело-то в том, что всё работает отлично, если закомментирована часть кода. С ресетом всё правильно - 100%, с фузами тоже - 100%. А подозрения у меня на компилятор. Да по любому он!!! Сейчас уже такая закономерность: написан код - все отлажено и работает. Начинаю добавлять дополнительные функции и достигается такая граница, при которой камень ведёт себя так, как описано выше. Что скажете? Цитата(arttab @ Jan 11 2008, 05:01)  Тут и само собой все ясно: скорость передачи данных по USB в 10 раз выше, чем с картой. Это не критично. Версия девайса под RS-232работает медленнее, чем USB-шная.
|
|
|
|
|
Jan 12 2008, 14:04
|

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

|
Цитата(DiMonstr @ Jan 12 2008, 15:59)  Да по любому он!!!  Цитата Что скажете? 1.  2. Пока не сможете четко (читай грамотно) донести свою мысль до компилятора и не придется: Цитата ...сделал так: включил оптимизацию проекта по скорости дальше можете и не двигаться. Это первейшее необходимое, хотя возможно и недостаточное условие.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 12 2008, 14:28
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706

|
Цитата(GDI @ Jan 11 2008, 10:02)  Этой фичей компилятора я ещё не интересовался. Посмотрю... А в целом, как правильно назначить размеры отдельным участкам карты памяти (RSTACK, CSTACK, HEAP)? Из каких соображений изходить при этом? И такой вопрос. У меня примерно 100 константных байт которые разумно разместить во флэш памяти программы, но больше 20 не получается - компилятор ругается. Посмотрел hex-файл, а мои данные размещаются в самом его начале. Что нужно сделать и где, чтобы разместить их в конце? Цитата(zltigo @ Jan 12 2008, 17:04)  Нееет. Без оптимизации никак низя... Протокол с картой организован побитный и каждый бит, карта передает мне каждую 1 мкс (к примеру, сколько точно не помню сейчас), а я каждый бит обрабатываю в прерывании по таймеру - это подсчет бит, проверка на старт бит, проверка четности, и ещё что-то). Так как написано на С, то без оптимизации за 1 мкс эта часть кода контроллером не успевает обрабатывается и начинается потеря бит. Правда первые 2 десятка байт принимаются верно...
Сообщение отредактировал DiMonstr - Jan 12 2008, 14:31
|
|
|
|
|
Jan 12 2008, 14:48
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(DiMonstr @ Jan 12 2008, 18:28)  И такой вопрос. У меня примерно 100 константных байт которые разумно разместить во флэш памяти программы, но больше 20 не получается - компилятор ругается. Посмотрел hex-файл, а мои данные размещаются в самом его начале. Что нужно сделать и где, чтобы разместить их в конце? Давайте по порядку и конструктивно? 1) Как ругается компилятор на расположение констант во флэши, 2) как Вы их располагаете, 3) и зачем Вам нужно, чтобы они были в конце?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 12 2008, 15:00
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706

|
Цитата(zltigo @ Jan 12 2008, 17:49)  Если говорить про ATMEGa8, то без оптимизации код написанный на СИ очень громоздкий и не помещается в камень. Компилятор при этом выдает кучу ошибок относительно размера стэков. Но код на самом деле не поместиться без оптимизации.
|
|
|
|
|
Jan 12 2008, 15:20
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706

|
Цитата(zltigo @ Jan 12 2008, 18:10)  Код рабочий
Сообщение отредактировал DiMonstr - Jan 12 2008, 15:20
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|