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

IAR AVR: Приложение не стартует

Столкнулся с такой проблемой.

IAR для AVR, ver6.60.3 Процессор AT90CAN128

Пока писал и отлаживал код "на столе", устройство от питания не отключалось, работало стабильно и все были удивительно счастливы. Но пришел момент передачи заказчику... и тут началось.  Устройство несколько раз вернули с комментарием "не запускается вообще". Стал разбираться. Оказалось, что плата может успешно стартовать, пока не разрядятся емкости на pcb и ram не очистится... это может длиться мин 10-15, поэтому сразу и не нашли.

Далее стал искать почему. После полной разрядки, дебагер попадает на метку __dedug_break, код __low_level_init вроде выполняется, но в итоге процесс до вызова main() не доходит. Те переменные и объекты вероятно не инициализируются.  Стал понемногу "отрезать" код из flash и после порога 32k всё вдруг заработало, стартует без проблем. 

Сейчас размер кода:

33 085 bytes of CODE memory (+     16 range fill )
3 368 bytes of DATA memory (+ 115 absolute )
203 bytes of XDATA memory (+ 2 056 absolute )
6 bytes of CONST memory
16 534 bytes of FARCODE memory

Подскажите, где посмотреть и что с этим делать?

Есть ли вероятность, что это баг IAR и он не правильно делает инициализацию?

 

 

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


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

6 minutes ago, Gradient said:

это может длиться мин 10-15

У вас место конденсаторов ионисторы что-ли стоят? Ну закоротите пинцетом. И вы приёмо-сдадочные испытания не проводите вообще? Хотя бы элементарный прогон, который бы сразу выявил эту проблему. Или ваше устройство сразу со стола к заказчику поехало без корпуса?

В который раз замечаю, что у вас проблемы с линкером. И в который раз вы, видимо, невнимательно читаете документацию.

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


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

2 hours ago, Gradient said:

я вам уже писал куда вам пойти... ;)

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

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


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

Помогайте плиз где то в другом месте.

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

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


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

1 minute ago, Gradient said:

я Вас лично несколько раз уже просил больше мне не "помогать".

Но вам. похоже, нравится дискутировать со мной. Иначе бы вы просто промолчали и проигнорировали меня. А я - видя потерю интереса, больше бы не писал.

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


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

Нет.. не нравится, вы только мешаете и гадите в темах.

Вы бесполезный тролль, и я не хочу чтоб вы в моей теме что-то писали и портили.

Так Вам более понятно?

Уходите...

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


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

@Gradient, я понимаю, что людей судят по себе. Но не так уж ты плох. И вовсе ты не гадишь везде, где попало.

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


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

Может я не прав, но, вроде, у нелицензионной IAR для AVR ограничение на размер кода в 32 кБ?

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


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

не знаю, как для IAR/AVR, но если порыться в каталоге с IAR можно найти исходник стартап-кода на ASM, прикомпоновать его к проекту, и в опции проекта "debug" метку начала кода для отладки сменить с "main" на этот reset_code (не помню как оно именуется, см. первую метку в инит-коде).

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


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

2 часа назад, k155la3 сказал:

но если порыться в каталоге с IAR можно найти исходник стартап-кода на ASM, прикомпоновать его к проекту

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

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


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

Да, нашел!

Файл "segment_init.с"

строка 55 /* Initialize the INITTAB pointer. */

Следует исправить:

InitTable =  __segment_begin("INITTAB");

InitTable = (SegmentInitBlockPtr_Type) __segment_begin("INITTAB");

И всё снова как новое!

 

Спасибо парни... спасли.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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