Перейти к содержанию
    

Глюки компилятора IAR?

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

 

Присказка.

Чуть больше 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, воткнул директиву компилятора отключающую оптимизацию именно это процедуры. После этого всё работает. Это конечно ни есть хорошо, но выходя я пока так и не нашёл. Одним словом - шаманство!!!

 

 

Посоветуйте, в каком направлении мне копать! Кто сталкивался с такими проблемами?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посоветуйте, в каком направлении мне копать! Кто сталкивался с такими проблемами?
С такими проблемами переодически сталкиваются все. ИМХО дело не в бобине. Копайте свой код

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забыл спросить. А есть ли у компилятора такая фишка: хочу чтобы в зависимости от значения параметра в коде программы компилятор создавал прошивку с именем файла в зависимости от значения этого параметра.

 

 

Пробовал сократить количество вхождений подпрограмм. Разместил почти все подпрограммы в одной. После этого ситуация немного изменилась в лучшую сторону. Количество отказов стало меньше, но проблема-то осталась. Сначала подозрение было на распределение памяти и стека, но я отбросил эту мысль, т.к. программа вообще не запускается и подпрограммы не возвращают никаких параметров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у вас не было подозрения что работа по usb и картой отбирают друг у друга время? когда у меня были подозрения на борьбу функций за такты мк, то я иногда использовал вывод(ы) мк для указания что он выполняет. Т.е. для Вашего случая, если вывод 0 в 1, то обработка usb, а если вывод 1 в 1, то обработка карты. и поставить щупы цифрового осциллографа на эти выводы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пришло время отлаживать всё в комплексе и тут начался полтергейст, который я пытаюсь изкоренить методом прямого шаманства. В чём причина конккретно не знаю, одни догадки...
Первое, что нужно сделать - посмотреть в листинг и убедиться, что компилятор понял вас правильно.

Короче код после прошивки то запускаетя и работает, то вообще не исполняется ни одной команды. Крутил оптимизацию, распределение памяти - не помогло. Со сбросом всё в порядке, схема не причем, контроллер тоже. Остается компилятор и наверное настройки файла *.xcl
Это понятно, что компилятор обвинить проще простого. У меня подобное поведение наблюдалось однажды, когда ошибочно был установлен фуз BRST. А у студента - когда подтяжка ресета вместо питания была подключена к одному из портов. Он порт настраивает на вывод - контроллер ресетится.

 

В общем есть предложение поспорить на ящик пива, что компилятор снова не при чем, а виноваты недостаток знаний и опыта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...В общем есть предложение поспорить на ящик пива, что компилятор снова не при чем, а виноваты недостаток знаний и опыта.

 

Да запросто! Так все дело-то в том, что всё работает отлично, если закомментирована часть кода. С ресетом всё правильно - 100%, с фузами тоже - 100%. А подозрения у меня на компилятор. Да по любому он!!! Сейчас уже такая закономерность: написан код - все отлажено и работает. Начинаю добавлять дополнительные функции и достигается такая граница, при которой камень ведёт себя так, как описано выше.

Что скажете?

 

 

Тут и само собой все ясно: скорость передачи данных по USB в 10 раз выше, чем с картой. Это не критично. Версия девайса под RS-232работает медленнее, чем USB-шная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да по любому он!!!

:)

Что скажете?

1. :)

2. Пока не сможете четко (читай грамотно) донести свою мысль до компилятора и не придется:

...сделал так: включил оптимизацию проекта по скорости

дальше можете и не двигаться. Это первейшее необходимое, хотя возможно и недостаточное условие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этой фичей компилятора я ещё не интересовался. Посмотрю...

 

 

А в целом, как правильно назначить размеры отдельным участкам карты памяти (RSTACK, CSTACK, HEAP)? Из каких соображений изходить при этом?

 

И такой вопрос. У меня примерно 100 константных байт которые разумно разместить во флэш памяти программы, но больше 20 не получается - компилятор ругается. Посмотрел hex-файл, а мои данные размещаются в самом его начале. Что нужно сделать и где, чтобы разместить их в конце?

 

Нееет. Без оптимизации никак низя... Протокол с картой организован побитный и каждый бит, карта передает мне каждую 1 мкс (к примеру, сколько точно не помню сейчас), а я каждый бит обрабатываю в прерывании по таймеру - это подсчет бит, проверка на старт бит, проверка четности, и ещё что-то). Так как написано на С, то без оптимизации за 1 мкс эта часть кода контроллером не успевает обрабатывается и начинается потеря бит. Правда первые 2 десятка байт принимаются верно... :wassat:

Изменено пользователем DiMonstr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И такой вопрос. У меня примерно 100 константных байт которые разумно разместить во флэш памяти программы, но больше 20 не получается - компилятор ругается. Посмотрел hex-файл, а мои данные размещаются в самом его начале. Что нужно сделать и где, чтобы разместить их в конце?

Давайте по порядку и конструктивно?

1) Как ругается компилятор на расположение констант во флэши,

2) как Вы их располагаете,

3) и зачем Вам нужно, чтобы они были в конце?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нееет. Без оптимизации никак низя...

Повторяю - код должен быть работоспособным ПРИ ЛЮБОЙ ОПТИМИЗАЦИИ а не только без оптимизации или при оптимизации по размеру. Написанный Вами код который не работоспособен при оптимизации по скорости на самом деле НЕ РАБОТОСПОСОБЕН ВООБЩЕ - начинайте разбираться с него а не с усугубления ситуации нагромождением еще какого-то кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Если говорить про ATMEGa8, то без оптимизации код написанный на СИ очень громоздкий и не помещается в камень. Компилятор при этом выдает кучу ошибок относительно размера стэков. Но код на самом деле не поместиться без оптимизации. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если говорить...

Попробуйте хотя-бы прочитать о чем я написал, прежде чем говорить непонятно о чем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Код рабочий :)

Изменено пользователем DiMonstr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...