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

 
 
> Помогите выгрузить ОС и перейти в Bootloader, STM32, ChibiOS
Spider
сообщение Jan 8 2015, 16:58
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Всем првиеТ!

Экспериментирую с bootloader и пока сделал так: в самое начало Flash располагаю Bootloader, а с 0x0800400 первый попавшийся пример с USART из набора ChibiOS (ессестно с измененным .ld скриптом, чтобы начиналось всё с 0x0800400). Бутлоадер проверяет не нажата ли кнопочка при подаче питания на протяжении там 500ms и если нет, то перекидывает таблицу указателей и стек "на основное приложение", ежеле нажата кнопочка, то загружается сам и делает своё грязное дело. Ну всё примитивно просто и как обычно. Теперь захотелось странного - загрузить бутлоадер из приложения. Самое простое сделать SoftReset, но надо держать кнопочку. тогда я сделал ячейку в памяти куда пишу флаг и снова переношу таблицу векторов и вызываю ResetHandler бутлоадера. Но вот беда, всё падает и зависает.
Нет, переходить то оно переходит, но вызываются какие-то прерывания, видать которые были настроены в примере. Я пошёл в ЛОБ - перечислил перед переносом таблицы прерывания все регистры переферии, где можно было бы разрешить прерывание и запретил их наверняка. Отключил SysTick. Но ВСЁ РАВНО что-то происходит и bootloader зависает в Assert вызванный из заглушки на прерывание.
Есть способ выяснить что его вызывает? Дебагер не видит какое прерывание прыгнуло в этот указатель - back trace тупо начинается сразу с Assert().
Сижу вот и описываю все вектора в пустышки, дабы понять какая именно пустышка вызывается.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Jan 9 2015, 19:53
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alexey Belyaev @ Jan 8 2015, 18:58) *
тогда я сделал ячейку в памяти куда пишу флаг и снова переношу таблицу векторов и вызываю ResetHandler бутлоадера.
Такой флажок у вас уже есть, он называется RCC_CSR_SFTRSTF и лежит в RCC->CSR. Просто делайте программный сброс и проверяйте его в загрузчике. После проверки сбрасывайте битом RCC_CSR_RMVF. После окончания загрузки сбрасывайте процессор собакой, это позволит не попасть снова в загрузку после сброса.



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Spider
сообщение Jan 10 2015, 08:03
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Цитата(Сергей Борщ @ Jan 9 2015, 22:53) *
Такой флажок у вас уже есть, он называется RCC_CSR_SFTRSTF и лежит в RCC->CSR. Просто делайте программный сброс и проверяйте его в загрузчике. После проверки сбрасывайте битом RCC_CSR_RMVF. После окончания загрузки сбрасывайте процессор собакой, это позволит не попасть снова в загрузку после сброса.

Думал об этом. Но в программу у меня хорошо получается переходить переносом прерывайний и всего такого.

Цитата(A. Fig Lee @ Jan 9 2015, 22:04) *
Как после хард ресета, все в 0. он же переходит на начальный аддресс, там обнуление глобальной памяти,
поэтому и надо __no_init для какойто ячейки, чтоб ЕЕ не обнуляли никогда

Просто интересно было, если не учитывать действия "софта" содержимое RAM после софтового сброса сохраняется...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 10 2015, 12:28
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alexey Belyaev @ Jan 10 2015, 10:03) *
Думал об этом. Но в программу у меня хорошо получается переходить переносом прерывайний и всего такого.
Пока получается. Усложните загрузчик - начнется цирк. После того, как ваша программа или загрузчик запустит кучу прерываний, что будет вызываться после подмены таблицы векторов? А если программа или загрузчик еще и ПДП запустит - будет вообще весело, когда ПДП начнет складывать данные поверх данных загрузчика/программы. Сброс гарантирует, что все последствия работы предыдущей программы будут устранены. И достигается это минимальными усилиями - одной командой сброса. Приводить периферию в исходное состояние вручную гораздо сложнее.

То есть при переходе в программу вам нужно будет переносить прерывания и все такое, но делать это желательно сразу после сброса, пока периферия находится в нетронутом состоянии.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:23
Рейтинг@Mail.ru


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