Jump to content

    

IAR Embedded. Работа с исключениями LPC2214.

Здравствуйте.  Пытаюсь разобраться с программированием LPC2214 в среде IAR Embedded. Появилось несколько вопросов (уровень самого-самого начинающего ). 

Вопрос1: Откуда в среде IAR берется файл startup.s при компилировании, если я его просто не добавляю в проект?

Вопрос2: Если возникает исключение (exception) undefined instruction (vector 0x0000 0004), что происходит "по умолчанию" ? Я так понимаю должна стоять ловушка в файле startup.s . 

Вопрос3: На просторах интернета нашел , что команда asm("udf.w #0") вызывает это самое прерывание. Так ли это?

 

 

Share this post


Link to post
Share on other sites
6 hours ago, mrVladimir said:

Вопрос1: Откуда в среде IAR берется файл startup.s при компилировании, если я его просто не добавляю в проект?

Я всегда подключаю свой "стартап". Но среда может и свой подключить, по-умолчанию.

6 hours ago, mrVladimir said:

что происходит "по умолчанию" ? Я так понимаю должна стоять ловушка в файле startup.s . 

Что значит "по-умолчанию?". Подробности на arm.com, а вообще вам следует объявить свой обработчик этого прерыания. Но, обычно, в стартапе происходит банальное зацикливание. Другими словами МК "зависает".

 

 

Share this post


Link to post
Share on other sites
11 hours ago, mrVladimir said:

Вопрос3: На просторах интернета нашел , что команда asm("udf.w #0") вызывает это самое прерывание. Так ли это?

Хорошо бы давать ссылки на эти "просторы". Сходу нашёл только http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801g/zme1476352914494.html

Это описание а) ассемблера от кейла, не стандартного набора команд и б) со ссылкой на ARMv8.

У Вас IAR и ARMv4TDMI, т.е. "мимо" по обоим пунктам.

Хочется undefined instruction - берёте какой-нибудь массив с мусором (пара строк из "Евгения Онегина" отлично подойдёт) и передаёте туда управление. Если не на первой инструкции, так на второй-третьей обязательно грохнется.

 

А вообще, имхо, уровень "совсем-совсем начинающего"  - это взять готовый стартап и моргать лампочкой в цикле в мейне. В запуске подобных камней особых трудностей нету, стартап примитивный. Но начинать лучше с готового - есть на что опереться.

Имхо 2: если это "поиграться", купите отладку с STM'кой. И какие-то курсы-уроки на каждом углу, и само железо поудобнее (хотя тут спорно - косяков и у STM'ок полно), и в современных IDE работает "само".

 

Share this post


Link to post
Share on other sites
11 hours ago, mrVladimir said:

Здравствуйте.  Пытаюсь разобраться с программированием LPC2214 в среде IAR Embedded. Появилось несколько вопросов (уровень самого-самого начинающего ). 

Вопрос1: Откуда в среде IAR берется файл startup.s при компилировании, если я его просто не добавляю в проект?

Вопрос2: Если возникает исключение (exception) undefined instruction (vector 0x0000 0004), что происходит "по умолчанию" ? Я так понимаю должна стоять ловушка в файле startup.s . 

Вопрос3: На просторах интернета нашел , что команда asm("udf.w #0") вызывает это самое прерывание. Так ли это?

IAR сам ничего не добавляет при создании проекта.
Только если начинает проект с какой-то демки там будет ассемблерный startup
Но многие сложные проекты типа mbed или zephyr перед непосредственно компиляцией прогоняют кучу скриптов которые вам наделают всяких дополнительных компилируемых файлов и startup в том числе.   У вас похоже так и произошло. 
Опять же если это mbed, то что делать с исключениями они там сами порешали. Вариантов там уйма, в двух словах не расскажешь. 

 

Share this post


Link to post
Share on other sites
3 часа назад, AlexandrY сказал:

IAR сам ничего не добавляет при создании проекта.

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

Share this post


Link to post
Share on other sites
Just now, Сергей Борщ said:

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

И сейчас есть этот код, но это не startup файл c  объявлением всех векторов ядра. 

Share this post


Link to post
Share on other sites
9 минут назад, AlexandrY сказал:

И сейчас есть этот код, но это не startup файл c  объявлением всех векторов ядра. 

Алекстандр, вы вроде и по-русски пишете, а я вас понять не могу. Я же пишу - таблица векторов и стартап-код были в библиотеке, они подтягивались оттуда по-умолчанию. Вы же мне пишете, что этот код есть, но это не таблица. А что же это?

Share this post


Link to post
Share on other sites
2 hours ago, Сергей Борщ said:

Алекстандр, вы вроде и по-русски пишете, а я вас понять не могу. Я же пишу - таблица векторов и стартап-код были в библиотеке, они подтягивались оттуда по-умолчанию. Вы же мне пишете, что этот код есть, но это не таблица. А что же это?

Так вы корректно читайте по словам.
Я ж специально слова подбираю, а вы их хотите интерпретировать в свободном стиле. 
Вот пример что там есть:

image.thumb.png.38102dba8d9f1aeed35ac3eca8988d96.png

Будем спорить о том что это - startup файл или не файл, и полная это таблица или не полная? И таблица ли это вообще, или скажем "заглушка"? 
Тут заметьте даже слова startup нет.
TC же спрашивает конкретно про файл startup.s
 

 

Share this post


Link to post
Share on other sites
1 час назад, AlexandrY сказал:

Вот пример что там есть:

там слово "таблица" есть даже в названии "__vector_table". Рискну предположить, что и таблица и вызываемая из этой таблицы "__iar_program_start" были скомпилированы из файла startup.s на компе авторов компилятора и в скомпилированный код проекта попадают из библиотеки.

Share this post


Link to post
Share on other sites
6 minutes ago, Сергей Борщ said:

там слово "таблица" есть даже в названии "__vector_table". Рискну предположить, что и таблица и вызываемая из этой таблицы "__iar_program_start" были скомпилированы из файла startup.s на компе авторов компилятора и в скомпилированный код проекта попадают из библиотеки.

Это легко проверяется в map файле - 

image.png.acb3adb0637a624942ec5314f8ad21d3.png

Как видим заглушка с адресами переходов по прерываниям ядра берется из файла vector_table_M.s

Share this post


Link to post
Share on other sites

Друзья, спасибо вам за участие. Может быть в выражении "самого-самого"(см. пост 1) второе слово лишнее. Но, судя по тому, какие здесь вопросы задают другие участники, первое-то уж точно на своем месте. Расскажу предысторию. Работая ремонтным персоналом по станкам с ЧПУ, разрабатывал кое-какие устройства на PIC16... Пару лет назад предприятие приобрело контроллеры   автоматики на старые станки, но на новой элементной базе (общим количеством около десятка штук). Этой базой оказался как раз LPC2214. Задача этих контроллеров на станке -   смена инструмента и отработка технологических команд, таких как включение эмульсии, шпинделя, выбор диапазона вращения шпинделя и т.п. Фирма-производитель на данном этапе, я думаю, не важна. Так вот, спустя более года после нормальной работы сначала один, а затем и другой ... и третий контроллеры начали вести себя неадекватно. То путают инструмент, то не проходит какая-либо из М-команд. Разобравшись со схемотехникой (набор резисторов и оптронов), решил написать свою программу для данного контроллера. Купили новый LPC2214. Запаял на место старого. Скачал IAR Embedded. Пару недель ушло на знакомство с основами и через месяц родил программу, которая была залита в контроллер с помощью Flash Magic (через UART). Проект в IAR'e создавал "с нуля". Счастью моему не было предела, когда на столе в лаборатории, имитируя станочные сигналы,  я получил работающее устройство. Принеся этот контроллер в цех на один из простаивающих станков, я радовался не долго, так как после нескольких циклов смены инструмента мой контроллер завис намертво. Понял я это по переставшему мигать светодиоду, который я связал с прерываниями таймера TMR0. Посоветовавшись еще на одном похожем форуме, понял, что зависания скорее всего происходят по трем причинам : UNDEF, PREFETCH ABORT, DATA ABORT. Отладчиком пока не обзавелся. Но даже если по одному из этих исключений (прерываний), то спрашивается - почему в лаборатории- то все нормально. И решил я проверить RC-цепи (штатные) на станке, и оказалось, что резисторы сгорели (именно на этом станке; на других с проблемными контроллерами все RC-цепи в порядке. Восстановил RC-цепи и зависания пропали. Теперь работает как часы.  А я решил углубиться в изучение данного семейства. Вот в двух словах моя история. Теперь возвращаясь к вопросам. Правильно ли  я понимаю, что:

1) иар по умолчанию вообще не вставляет в мой проект никакой стартап, а берет всю информацию из какой-то из своих библиотек? 

2) для того, чтобы прописать функцию обработки прерывания типа UNDEF, PREFETCH ABORT, DATA ABORT необходимо это сделать в стартапе?

И еще, если в опциях проекта во вкладке linker я открываю файл .icf, разве этого недостаточно, чтобы указать начальный адрес векторов (vector table - > .intvect start).

Скачал Мартина Тревора. Но по исключениям там крайне мало. Сейчас попробовал открыть проект Phytec-PCM023 (это как пример в иаре) - и в составе проекта не увидел никакого стартапа. 

p.s. Извините, чего-то много получилось. 

Edited by mrVladimir

Share this post


Link to post
Share on other sites
9 минут назад, mrVladimir сказал:

2) для того, чтобы прописать функцию обработки прерывания типа UNDEF, PREFETCH ABORT, DATA ABORT необходимо это сделать в стартапе?

Нет. Можно где угодно.

9 минут назад, mrVladimir сказал:

И еще, если в опциях проекта во вкладке linker я открываю файл .icf, разве этого недостаточно, чтобы указать начальный адрес векторов (vector table - > .intvect start).

Тут ничего не понял... :wacko2:  Таблица прерываний - это просто таблица с командами перехода на начальные адреса соответствующих обработчиков прерываний. В Вашем случае.

9 минут назад, mrVladimir сказал:

Скачал Мартина Тревора. Но по исключениям там крайне мало. Сейчас попробовал открыть проект Phytec-PCM023 (это как пример в иаре) - и в составе проекта не увидел никакого стартапа.

Стартап можно поискать по .map-файлу.

Share this post


Link to post
Share on other sites

Подскажите пожалуйста какой-нибудь пример, как отловить Undefined Instruction. Ну, допустим, случилось это Undefined Instruction и я из обработчика устанавливаю какой-либо бит в каком-либо порте. Как правильно и где прописать обработчик.  С IRQ вроде разобрался, а вот с остальными... Вопросы, наверное,  совсем корявые, но ведь это для начинающих. :blush:

Share this post


Link to post
Share on other sites
41 минуту назад, mrVladimir сказал:

Подскажите пожалуйста какой-нибудь пример, как отловить Undefined Instruction. Ну, допустим, случилось это Undefined Instruction и я из обработчика устанавливаю какой-либо бит в каком-либо порте. Как правильно и где прописать обработчик.  С IRQ вроде разобрался, а вот с остальными... Вопросы, наверное,  совсем корявые, но ведь это для начинающих. :blush:

Ну прописали Вы этот обработчик, дальше то что? Что это даст? Зачем???

Share this post


Link to post
Share on other sites
1 hour ago, mrVladimir said:

Купили новый LPC2214. Запаял на место старого. Скачал IAR Embedded. Пару недель ушло на знакомство с основами и через месяц родил программу, которая была залита в контроллер с помощью Flash Magic (через UART). Проект в IAR'e создавал "с нуля".

LPC2214 слишком старый чип.
Мог бы вам посоветовать Keil. Keil в отличии от IAR вставляет в проект файлы startup.s, но Keil уже не поддерживает LPC2214.
Я бы вам рекомендовал (раз уж вы начали писать свою программу) выбрать микроконтроллер фирмы Renesas.
Вот этот например - https://www.renesas.com/us/en/products/synergy/hardware/microcontrollers/s7-series/s7g2-group/r7fs7g27g3a01cfb.html
Там скачаете бесплатный, полнофункциональный  и лицензионный IAR (но он только для Renesas) и там же будет конфигуратор который автоматом сгенерит вам все исходники включая startup c перехватом всех исключений, с логом и трассировкой этих исключений. 
Эт помимо того что микроконтроллеры Renesas обладают спецсредствами против сбоев периферии и защитой памяти от сбоев (Detection up to 2-bit errors) 
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now