Перейти к содержанию
    

Рестарт FreeRTOS

Преветствую.

Вопрос по реализации загрузчика. Есть основная программа и загрузчик на базе FreeRTOS. Вопрос как реализовать переход из основной прошивки в загрузчик и наоборот (как правильно реализовать рестарт для системы на базе FreeRTOS).

Попробовал сделать так:

// Переход на загрузчик
portDISABLE_INTERRUPTS();
Xil_DCacheFlush();
Xil_ICacheInvalidate();
((void(*)(void))0x00000000)();

// Переход на основную программу
portDISABLE_INTERRUPTS();
Xil_DCacheFlush();
Xil_ICacheInvalidate();
((void(*)(void))0x10000000)();

Такой вариант стартует прошивку только один раз, переход на загрузчик происходит, но система улетает в ошибочное состояние.

Что ещё необходимо для рестарта FreeRTOS?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, doom13 сказал:

Что ещё необходимо для рестарта FreeRTOS?

вариант 1. Использовать WDT.

вариант 2. Через ядро:

__noreturn void ResetCore()
{
  FaultCpuDis();
  IntCpuDis();
  __DSB();
  __ISB();
  NVIC.AIRCR = 0x5FA << 16 | B2;
  while (1);
}

2-й вариант будет работать не на всех МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из основной прошивки попасть в загрузчик просто.

NVIC_SystemReset(); - Вылетает мгновенно (с дёрганьем пина /Reset изнутри). Гарантирует сброс всего. Не гарантирует сохранность данных.

Из загрузчика в прошивку - обычным образом можно. У меня реализовано поиском прошивки (из нескольких вариантов в разных адресах) и передачей управления на неё. А дальше код сам разбирается и копирует таблицу прерываний в RAM. Естественно, переход из кода в загрузчик тоже возможен. Нужно запретить все прерывания и перейти на метку _RESET в коде. Кстати, можно аналогичным образом - подтянуть значения стэка и адрес первой инструкции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, AlanDrakes сказал:

NVIC_SystemReset(); - Вылетает мгновенно (с дёрганьем пина /Reset изнутри). Гарантирует сброс всего. Не гарантирует сохранность данных.

См.выше:

В 03.09.2019 в 14:07, jcxz сказал:

будет работать не на всех МК.

1 час назад, AlanDrakes сказал:

А дальше код сам разбирается и копирует таблицу прерываний в RAM.

Зачем???

1 час назад, AlanDrakes сказал:

Естественно, переход из кода в загрузчик тоже возможен. Нужно запретить все прерывания и перейти на метку _RESET в коде. Кстати, можно аналогичным образом - подтянуть значения стэка и адрес первой инструкции.

Для перехода из основного ПО в загрузчик достаточно просто выполнить аппаратный сброс. И ничего никуда подтягивать не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используемая платформа - ZynqMP (для старта системы используется APU0).

Старт системы происходит следующим образом:

1. BootROM

2. FSBL (Выполняет инициализацию всей системы, грузит прошивку FPGA, грузит прошивку для Bootloader)

3. Bootloader (FreeRTOS)

4. Application (FreeRTOS)

Аппаратный сброс системы не совсем удачное решение. Необходимо реализовать возможность перехода из Bootloader в Application и обратно. Тут пока не могу разобраться, каким образом загнать FreeRTOS в исходное состояние.

Для перехода из загрузчика в основную программу использую:

#include <setjmp.h>
jmp_buf xJumpBuf;
bool jump_to_application_enable = false;

int main()
{
	setjmp(xJumpBuf);
	if(jump_to_application_enable)
	{
		jump_to_application_enable = false;
		((void(*)(void))0x10000000)();
	}
...

}



int goto_application_cb(char *cbuf, uint32_t size, void *param)
{
	......

	portDISABLE_INTERRUPTS();
	Xil_DCacheFlush();
	Xil_ICacheInvalidate();
	ullCriticalNesting = 1000ULL;
	vTaskEndScheduler();
	jump_to_application_enable = true;
	longjmp(xJumpBuf, 1);

	return 0;
}

и такой же переход в основном приложении на загрузчик. Появилась возможность залить прошивку приложения, перейти на её выполнение, вернуться обратно в загрузчик, перезалить прошивку ещё раз. Но при втором старте основной программы пока дохнет. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, doom13 сказал:

Аппаратный сброс системы не совсем удачное решение. Необходимо реализовать возможность перехода из Bootloader в Application и обратно. Тут пока не могу разобраться, каким образом загнать FreeRTOS в исходное состояние.

Значит перед переходом необходимо установить периферию и процессор в исходное состояние. Т.е. - такое, какое они имеют после аппаратного сброса. А это - не только запрет прерываний.

А вот что-то там делать с кешем - совершенно не нужно. Это нужно делать только перед аппаратным сбросом. Перед обычной командой перехода какой смысл сбрасывать кеш??? :wacko2:

 

Цитата

Но при втором старте основной программы пока дохнет. 

Естественно. Ведь Вы не выполняете вышеуказанных пунктов.

setjmp/longjmp тут тоже совершенно не нужны. Они для другого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

setjmp/longjmp тут тоже совершенно не нужны. Они для другого.

Таким образом пытался сохранить состояние регистров процессора до старта планировщика (нарыл тут freertos-how-to-end-and-restart-the-scheduler).

Без них сыпалось уже на первом возврате из приложения в загрузчик. Сейчас позволяет вернуться, перезалить RAM новой прошивкой, стартануть её, но дохнет на адресах перезалитой прошивки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мумукался с этой проблемкой,  пришлось еще глубже понять как оно (cortex-m + freertos) рабоиает. вроде разобраля, если нужно распишу суть и код дам. туда сюда не прыгал,  но физика одна, поэтому наверно будет работать универсально. есть еше засада,  оказалось что и не удивительно. если сброс не использовать - будем считать это костыльным решением, новая жизнь, т.е . прилагуха чувствительна к состоянию озу и переферии, оч. внимательно и ВСЕ нужно инитить после загрузчика. . такам обращом задачу прыжка нужно решать в два этапа а) состояние проца + состояние структур freertos  б) решить хвосты по инициализации в прилагухе,  .bss .data компиллер Вам поможет привести к исходному состоянию, авот что на стеках будет .... мусор от загрузчика, про переферию тоже понятно -к этому моменту она уже живет какойто прошлой жизнью.  тут как обычно нужно правильно писать код..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема пока осталась нерешённой и  актуальна  (просто в данный момент работаю над другой задачей).

2 hours ago, klen said:

авот что на стеках будет .... мусор от загрузчика

Внешний рам 4 ГБ, все приложения работают в отдельных   областях памяти, мусор остаётся от предыдущего старта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...