Jump to content

    

Рестарт FreeRTOS

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

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
29 минут назад, doom13 сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, AlanDrakes сказал:

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

См.выше:

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

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

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

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

Зачем???

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

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

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

Share this post


Link to post
Share on other sites

Используемая платформа - 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;
}

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

Share this post


Link to post
Share on other sites
17 минут назад, doom13 сказал:

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

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

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

 

Цитата

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

2 hours ago, klen said:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now