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

 
 
 
Reply to this topicStart new topic
> Проблема с самозагрузчиком во freeRTOS
inventor
сообщение Oct 20 2017, 09:02
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



для своей проги сделал самозагрузчик
который пишет образ с SD карты на flash с адреса 0x08008000
загрузчик проверил - работает,
образ пишет
проблема начинаетсяесли в качестве образа
программа написанная для RTOS
после инициализации оборудования
вылетает в HardFault
я прошел отладчиком и посмотрел
что выпадает в том месте, когда я внутри программы работаю с
внутренней flash (использую ее в режиме псевдо-EEPROM)
делаю в IAR
сморю Call Stack и вижу, что эксепшен
вызвала функция PendSV_Handler
мне не совсем понятно каким образом она вызывается
я закоментировал то, где запускаются задачи
и в самой первой функции hw_init_all()
поставил бесконечный цикл моргания лампочкой
но все равно происходит ексепшен
даже если я в asm файле закоментировал вызов
переключения контекстов
она все равно сидит на B PendSV_Handler
в файле startup_stm32f4xx.s
вообще как то можно замаскировать это прерывание
пока идет работа с flash ?
и еще непонятно:
если запускаю первый раз "из среды"
то она не входит в точку останова PendSV
а после ресета входит.
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 20 2017, 11:54
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



пока сделал такую заплатку:
перемещение векторов NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
сделал перед вызовом schedler
все работает
но хотелось бы вызывать перемещение векторов
в функции hw_init_all()
и там маскировать все перывания RTOS
до тех пор пока не будут сделана инициализация всех вещей
типа flash и прочей периферии
тем более прерывания там не нужны

CODE

/*vvvvv: Установим вектор на новое место */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);


/* Запуск RTOS */
vTaskStartScheduler();
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Oct 21 2017, 15:06
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



У меня ремап векторов делает бутлоадер. Это его функциональная обязанность подготовить всё необходимое перед запуском прошивки.
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 21 2017, 18:42
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Kabdim @ Oct 21 2017, 18:06) *
У меня ремап векторов делает бутлоадер. Это его функциональная обязанность подготовить всё необходимое перед запуском прошивки.


в смысле в программе загрузчика вы перемещаете вектора?
мне кажется это сама программа должна делать,
чтобы она оставвалась независимой от него
а так получается, что у вас программа состоит из 2-х зависимых частей
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Oct 23 2017, 07:28
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Почему? Если программу загружает загрузчик - всё хорошо, если программа билдится как самостоятельная прошивка, то ей не требуется перенос векторов - всё хорошо. Данный подход не мешает применять и другие подходы. Если прошивка хочет переместить вектора - ей никто это сделать не помешает. Если мне потребуется какую-то старую прошивку адаптировать под бутлоадер я сделаю конфигурацию для линкера с нужным стартовым адресом флеша и памяти и в 99% всё заработает из коробки.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th April 2024 - 23:08
Рейтинг@Mail.ru


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