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

 
 
> Cortex M3 bootloader MSP/PSP
andrewlekar
сообщение Jul 31 2013, 07:47
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Уже неделю бьюсь над вот такой задачей.

Есть бутлоадер, внутри ось ucos-III. Нужно стартовать приложение, в котором та же ось.
Если бутлоадер стартует приложение до запуска оси, то всё просто и понятно:
Код
static void inline jump(uint32_t 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);
}

Но и в таком случае происходят странности со стеками.
Я так понимаю, что проблема в том, что ось постоянно находится в PendSV Exception и использует стек PSP и при переходе в приложение это влияет на работу пользовательского приложения. Хочется при переходе в приложение выходить из режима Exception и восстанавливать стек MSP, но как покинуть Exception, я так и не вкурил. Пробовал пихать во все места EXC_RETURN, но не помогло. Восстановление стека через CONTROL[1] помогло запускать пользовательское приложение без видимых глюков, однако при возврате в бутлоадер (есть функционал возврата в бутлоадер из приложения) опять сыплются глюки.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
andrewlekar
сообщение Jul 31 2013, 08:15
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Ну да, сброс на каждый чих решает проблему. Хотелось обойтись более мягким способом...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 31 2013, 08:25
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (andrewlekar @ Jul 31 2013, 10:15) *
Ну да, сброс на каждый чих решает проблему.
Он полностью развязывает загрузчик и приложение. И не на каждый чих, а только на передачу управления из приложения загрузчику.
QUOTE (andrewlekar @ Jul 31 2013, 10:15) *
Хотелось обойтись более мягким способом...
Это будет дорога усыпанная граблями. На одни вы уже наступили, некоторые могут вылезти когда будет продано очень много устройств и менять что-то будет уже поздно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 09:59
Рейтинг@Mail.ru


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