DiMonstr 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Всех с прошедшими праздниками! Присказка. Чуть больше 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, воткнул директиву компилятора отключающую оптимизацию именно это процедуры. После этого всё работает. Это конечно ни есть хорошо, но выходя я пока так и не нашёл. Одним словом - шаманство!!! Посоветуйте, в каком направлении мне копать! Кто сталкивался с такими проблемами? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Посоветуйте, в каком направлении мне копать! Кто сталкивался с такими проблемами? С такими проблемами переодически сталкиваются все. ИМХО дело не в бобине. Копайте свой код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMonstr 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Забыл спросить. А есть ли у компилятора такая фишка: хочу чтобы в зависимости от значения параметра в коде программы компилятор создавал прошивку с именем файла в зависимости от значения этого параметра. Пробовал сократить количество вхождений подпрограмм. Разместил почти все подпрограммы в одной. После этого ситуация немного изменилась в лучшую сторону. Количество отказов стало меньше, но проблема-то осталась. Сначала подозрение было на распределение памяти и стека, но я отбросил эту мысль, т.к. программа вообще не запускается и подпрограммы не возвращают никаких параметров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба у вас не было подозрения что работа по usb и картой отбирают друг у друга время? когда у меня были подозрения на борьбу функций за такты мк, то я иногда использовал вывод(ы) мк для указания что он выполняет. Т.е. для Вашего случая, если вывод 0 в 1, то обработка usb, а если вывод 1 в 1, то обработка карты. и поставить щупы цифрового осциллографа на эти выводы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба При борьбе со стеками очень помогает включение генерации map-файла, там есть табличка, где указано для каждой функции потребпости в стеках и общие потребности всей программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба Пришло время отлаживать всё в комплексе и тут начался полтергейст, который я пытаюсь изкоренить методом прямого шаманства. В чём причина конккретно не знаю, одни догадки...Первое, что нужно сделать - посмотреть в листинг и убедиться, что компилятор понял вас правильно. Короче код после прошивки то запускаетя и работает, то вообще не исполняется ни одной команды. Крутил оптимизацию, распределение памяти - не помогло. Со сбросом всё в порядке, схема не причем, контроллер тоже. Остается компилятор и наверное настройки файла *.xclЭто понятно, что компилятор обвинить проще простого. У меня подобное поведение наблюдалось однажды, когда ошибочно был установлен фуз BRST. А у студента - когда подтяжка ресета вместо питания была подключена к одному из портов. Он порт настраивает на вывод - контроллер ресетится. В общем есть предложение поспорить на ящик пива, что компилятор снова не при чем, а виноваты недостаток знаний и опыта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMonstr 0 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба ...В общем есть предложение поспорить на ящик пива, что компилятор снова не при чем, а виноваты недостаток знаний и опыта. Да запросто! Так все дело-то в том, что всё работает отлично, если закомментирована часть кода. С ресетом всё правильно - 100%, с фузами тоже - 100%. А подозрения у меня на компилятор. Да по любому он!!! Сейчас уже такая закономерность: написан код - все отлажено и работает. Начинаю добавлять дополнительные функции и достигается такая граница, при которой камень ведёт себя так, как описано выше. Что скажете? Тут и само собой все ясно: скорость передачи данных по USB в 10 раз выше, чем с картой. Это не критично. Версия девайса под RS-232работает медленнее, чем USB-шная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба Да по любому он!!! :) Что скажете? 1. :) 2. Пока не сможете четко (читай грамотно) донести свою мысль до компилятора и не придется: ...сделал так: включил оптимизацию проекта по скорости дальше можете и не двигаться. Это первейшее необходимое, хотя возможно и недостаточное условие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMonstr 0 12 января, 2008 Опубликовано 12 января, 2008 (изменено) · Жалоба Этой фичей компилятора я ещё не интересовался. Посмотрю... А в целом, как правильно назначить размеры отдельным участкам карты памяти (RSTACK, CSTACK, HEAP)? Из каких соображений изходить при этом? И такой вопрос. У меня примерно 100 константных байт которые разумно разместить во флэш памяти программы, но больше 20 не получается - компилятор ругается. Посмотрел hex-файл, а мои данные размещаются в самом его начале. Что нужно сделать и где, чтобы разместить их в конце? Нееет. Без оптимизации никак низя... Протокол с картой организован побитный и каждый бит, карта передает мне каждую 1 мкс (к примеру, сколько точно не помню сейчас), а я каждый бит обрабатываю в прерывании по таймеру - это подсчет бит, проверка на старт бит, проверка четности, и ещё что-то). Так как написано на С, то без оптимизации за 1 мкс эта часть кода контроллером не успевает обрабатывается и начинается потеря бит. Правда первые 2 десятка байт принимаются верно... :wassat: Изменено 12 января, 2008 пользователем DiMonstr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба И такой вопрос. У меня примерно 100 константных байт которые разумно разместить во флэш памяти программы, но больше 20 не получается - компилятор ругается. Посмотрел hex-файл, а мои данные размещаются в самом его начале. Что нужно сделать и где, чтобы разместить их в конце? Давайте по порядку и конструктивно? 1) Как ругается компилятор на расположение констант во флэши, 2) как Вы их располагаете, 3) и зачем Вам нужно, чтобы они были в конце? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба Нееет. Без оптимизации никак низя... Повторяю - код должен быть работоспособным ПРИ ЛЮБОЙ ОПТИМИЗАЦИИ а не только без оптимизации или при оптимизации по размеру. Написанный Вами код который не работоспособен при оптимизации по скорости на самом деле НЕ РАБОТОСПОСОБЕН ВООБЩЕ - начинайте разбираться с него а не с усугубления ситуации нагромождением еще какого-то кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMonstr 0 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба Если говорить про ATMEGa8, то без оптимизации код написанный на СИ очень громоздкий и не помещается в камень. Компилятор при этом выдает кучу ошибок относительно размера стэков. Но код на самом деле не поместиться без оптимизации. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба Если говорить... Попробуйте хотя-бы прочитать о чем я написал, прежде чем говорить непонятно о чем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMonstr 0 12 января, 2008 Опубликовано 12 января, 2008 (изменено) · Жалоба Код рабочий :) Изменено 12 января, 2008 пользователем DiMonstr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба Код рабочий? Тогда какие проблемы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться