Второй слот прошивки переходит на первый слот во время первого запуска FreeRTOS - PullRequest
0 голосов
/ 27 мая 2018

Я создал приложение, которое имеет 2 слота прошивки в своем отображении памяти.Он работает довольно хорошо, и оба слота выполнены правильно на основе 32-битного номера секвенсора, хранящегося во FLASH.

Проблема возникает, когда я пытаюсь использовать FreeRTOS.По умолчанию прошивка скомпилирована для первого слота ... и нет проблем с запуском этого слота.Однако, когда устройство запускает прошивку, сохраненную во втором слоте, когда RTOS запускает свою первую задачу в prvPortStartFirstTask , затем переходит к vPortSVCHandler , оно переключается на задачу в первом слоте.

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


EDIT

Мой поток при переключении с загрузчика на основное приложение выглядит так:следует: 1. Проверить, какой слот прошивки следует использовать.2. Отключите IRQ.2. Скопируйте векторную таблицу в RAM.Эта часть оперативной памяти одинакова для обоих слотов.В процессе копирования я меняю смещение для каждого адреса, чтобы они были совместимы с конкретным слотом прошивки.По умолчанию адреса не имеют смещения, они удаляются на этапе посткомпиляции.3. Установите указатель стека в соответствии с первым словом в таблице векторов в ОЗУ.Эти адреса не изменяются при копировании таблицы векторов в ОЗУ.4. Установите SCB-> VTOR.5. Выполните Барьер синхронизации данных DSB ().6. Перейдите к обработчику сброса из таблицы векторов, скопированной в ОЗУ.


РЕДАКТИРОВАТЬ 2

Когда я компилирую приложение с измененным диапазоном адресов памяти FLASH во вторичный слот, оно работает правильно.Возможно ли скомпилировать код так, чтобы приложение было независимым от ПК, по крайней мере, в этом случае оно будет работать?


EDIT 3

# Generate position independent code.
-fPIC

# Access bss via the GOT.
-mno-pic-data-is-text-relative

# GOT is not PC-relative; store GOT location in a register.
-msingle-pic-base

# Store GOT location in r9.
-mpic-register=r9

Однако теперь этот слот перестал работать.

Я думаю, что моя проблема похожа на эту один .

1 Ответ

0 голосов
/ 30 мая 2018

Как правило, прошивки не создаются независимыми от позиции , поэтому я бы не поверил, что все "адреса функций являются относительными после компиляции".Вы компилируете прошивку для определенного начального местоположения (либо первого, либо второго слота прошивки).

Что касается вашего основного вопроса, вы сделали что-нибудь, чтобы переключить обработчики прерываний / вектор прерывания из одного слота прошивки в другой??Или вы переходите к обработчикам прерываний первой прошивки, когда вызываете обработчик SVC?

Как изменить вектор прерывания в разных архитектурах.Для stm32f429 вы можете посмотреть здесь

...