реклама на сайте
подробности

 
 
> Передача управления на Cortex-M4F
AlexeyT
сообщение May 30 2017, 22:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-06-07
Пользователь №: 28 207



Уважаемые коллеги, помогите разобраться:
Есть процессор на базе Cortex-M4, с FPU. У него есть встроенный загрузчик, но нет ПЗУ - только ОЗУ.
Есть подключенные к нему внешняя флэш-память и программатор JTAG.
Есть тестовая прошивка - настройка тактовой частоты, СОМ-порта и пока всё, дальше бесконечный цикл while(1) {}. Раньше было больше, но при уменьшении до нынешнего варианта косяк не исчез. Принципиальный момент - NVIC в тестовой прошивке не настраивается, обработчики исключений не переопределены.

Последовательность работы:
При подаче питания процессор начинает исполнять код заводского загрузчика, анализирует линии задания режима загрузки и переходит в режим исполнения программы из внешней флэш-памяти. Она успешно исполняется, используя прерывания - одно от периферийного блока СнК (контроллер МКИО) и одно внешнее. После чего в какой-то момент надо передать управление другой программе. Имитирую передачу управления. Для этого я выполняю останов (команда "h") процессора через J-Link Commander. А вот дальше есть два варианта развития событий:
1) не_выполняя_сброса, заливаю в ОЗУ инструкций образ тестовой прошивки, пишу во VTOR новый адрес таблицы, указываю новую вершину стека (первое слово прошивки), пишу в PC адрес вектора сброса (второе слово прошивки) и запускаю (команда "g"). После чего снова останавливаю ядро и вижу, что упал в исключение NMI.
2) выполняю сброс (команда "R"), и выполняю те же действия, что и ранее, над той же тестовой прошивкой. После чего останавливаю ядро и вижу, что что ядро спокойно остановлено (NoException).

В чем может быть принципиальное отличие этих режимов?
Какие регистры SCB нужно сбросить в начале п.1, чтобы состояние стало близким к идеальному, т.е. после Reset?
Чем сброс через JTAG отличается от сброса через NVIC_SystemReset() с точки зрения системных процедур, выполняемых перед main?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexeyT
сообщение May 31 2017, 06:56
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 5-06-07
Пользователь №: 28 207



Цитата
Если нет ПЗУ, то где тогда находится загрузчик? ПЗУ не может не есть. laughing.gif

Цитата
Вангую, что в вашем процессоре есть некая ROM с загрузчиком, но нету FLASH-памяти. Так?

Есть 4 кБ ПЗУ с загрузчиком, зашитым на заводе (намертво, не Flash). Пользователю оно доступно только на чтение. Процессор стартует из него.
Для пользователя есть 128 кБ ОЗУ под инструкции и 64 кБ ОЗУ под данные. Пользовательская программа может появиться в ОЗУ двумя способами: через JTAG или в результате работы заводского загрузчика. После чего управление передается на нее способом, описанным в первом посте, т.е. без сброса.

Цитата
Неужели после подобного "вандализма" вы ожидали другого поведения проца? sm.gif

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

Цитата
А при чем тут некие магические "системные процедуры"?
Сброс - есть сброс, иначе он назывался бы иначе: например, передача управления в начало программы или типа того.

"Магические процедуры" - типа __main, которая вызывается в векторе RESET.
Собственно, и вопрос - в чем отличие?
NVIC_SystemReset() - это таки "сброс" или "Передача управления в начало программы"?

Цитата
Очевидно что нужно сбросить и всю периферию. Использовать WDT.

Периферия - блоки на шинах AHB/APB? Или все-таки регистры SCB?
Мысль с WDT проработаю, спасибо.

Сообщение отредактировал AlexeyT - May 31 2017, 06:56
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 31 2017, 09:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexeyT @ May 31 2017, 08:56) *
Есть 4 кБ ПЗУ с загрузчиком, зашитым на заводе (намертво, не Flash). Пользователю оно доступно только на чтение. Процессор стартует из него.

Вы не поверите, но почти все ARM-ы стартуют из такого ПЗУ. Даже те, где есть flash программ. laughing.gif

Цитата(AlexeyT @ May 31 2017, 08:56) *
Периферия - блоки на шинах AHB/APB? Или все-таки регистры SCB?

Всю. Что как раз и делает WDT.

Цитата(Forger @ May 31 2017, 09:23) *
Работает аналогично аппаратному сбросу

Если вы про AIRCR ядра Cortex, то это не так. В некоторых Cortex - работает, в других - сбрасывает только ядро. Что совсем не эквивалентно аппаратному ресету МК.
Так что - или другие средства (специфичные для данного МК регистры периферии), или универсально - WDT.

Цитата(Forger @ May 31 2017, 09:23) *
В ARMах же WDT все же лучше использовать как WDT, а для сброса юзать NVIC_SystemReset или напрямую регистр AIRCR (ссылка выше).

Это не так (см. выше). И во-вторых - не во всех ARM-ах есть этот регистр.

Цитата(Сергей Борщ @ May 31 2017, 09:30) *
За это время могли прийти запросы на прерывания от какой-то периферии. Когда вы запускаете выполнение, ядро бросается обработать эти запросы, но обрабочиков для них в таблице векторов уже нет

Запрет всех прерываний и исключений. Затем - очистка всех запросов от всей использованной периферии. Затем - очистка всех флагов запросов в NVIC
Go to the top of the page
 
+Quote Post
Forger
сообщение May 31 2017, 09:23
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ May 31 2017, 12:17) *
Это не так (см. выше). И во-вторых - не во всех ARM-ах есть этот регистр.

Этот регистр есть во всех Cortex-M, а тут речь про Cortex-M4, но ТС по неизвестным причинам упорно скрывает маркировку камня, поэтому дальнейшие гадания в этом направлении лишены всякого смысла sm.gif
К слову, я использую тока STM (подсел). Так вот в них во всех NVIC_SystemReset сбрасывает весь камень (ядро, шины, память, периферию).


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 19:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016