Есть бутлоадер, внутри ось ucos-III. Нужно стартовать приложение, в котором та же ось.
Если бутлоадер стартует приложение до запуска оси, то всё просто и понятно:
Код
static void inline jump(uint32_t addr)
{
asm("LDR SP,[R0]");
asm("LDR R0,[R0, #+4]");
asm("BX R0");
DROP(addr);
}
{
asm("LDR SP,[R0]");
asm("LDR R0,[R0, #+4]");
asm("BX R0");
DROP(addr);
}
Однако если ось уже запущена и стартуем из-под неё, то вылезают какие-то жуткие проблемы со стеками. Вероятно причина в отдельном стеке MSP/PSP. Я смотрю состояние CONTROL и вижу, что при запущенной оси используется стек PSP, при незапущенной MSP. В принципе проблема решается, если использовать из-под запущенной оси следующий код:
Код
static void inline jump(uint32_t addr)
{
asm("LDR R1,[R0]");
asm("MSR MSP,R1");
asm("LDR R0,[R0, #+4]");
asm("BX R0");
DROP(addr);
}
{
asm("LDR R1,[R0]");
asm("MSR MSP,R1");
asm("LDR R0,[R0, #+4]");
asm("BX R0");
DROP(addr);
}
Но и в таком случае происходят странности со стеками.
Я так понимаю, что проблема в том, что ось постоянно находится в PendSV Exception и использует стек PSP и при переходе в приложение это влияет на работу пользовательского приложения. Хочется при переходе в приложение выходить из режима Exception и восстанавливать стек MSP, но как покинуть Exception, я так и не вкурил. Пробовал пихать во все места EXC_RETURN, но не помогло. Восстановление стека через CONTROL[1] помогло запускать пользовательское приложение без видимых глюков, однако при возврате в бутлоадер (есть функционал возврата в бутлоадер из приложения) опять сыплются глюки.