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

 
 
> 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:31
Сообщение #2


Знающий
****

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



Тем не менее, спасибо за совет. Переделал на сброс и стало гораздо проще.
Хотелось бы у знающих людей всё-таки выяснить, как ось деинициализировать до состояния в начале сброса, чтобы уже честно скакнуть на приложение. Просто любопытно. sm.gif

Да, ещё интересный момент. Я сделал бутлоадер релоцируемым в ОЗУ (при помощи линкера и какой-то матери), чтобы можно было при желании апдейтить и его самого. Однако при попытке разместить CRP секцию не вижу вообще никакого результата. Видимо дело в том, что секция CRP объявлена как readonly, а в линкере требуется всё readonly инициализировать в ОЗУ. Кто-то натыкался на такую проблему? Как можно потребовать, чтобы инициализация (IAR 6.5x) тащила в ОЗУ всё кроме секции CRP?
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 2 2013, 14:44
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(andrewlekar @ Jul 31 2013, 12:31) *
...Хотелось бы у знающих людей всё-таки выяснить, как ось деинициализировать до состояния в начале сброса, чтобы уже честно скакнуть на приложение. Просто любопытно. sm.gif...


Те жи грабли, другой вектор захода и увы - тот же финал(приблизительно в это же время как и у Вас). Суть: юзаю freertos, по задаче надо её тормознуть. торможение сделал с возвратом в точку запуска(с полным восстановлением контенкста). обошёл режимы работы тем, что выход из шедуллера на фазе прерывания. Но грабли как и у Вас - при повторном запуске происходит кривизна. Некоторое время бился, но в последствии взвесив все за и против рещил уходить через ребут, перед необходимостью рестартовать ось(она так-же является обновляемой и версионной) - такая комбинация для изделия более устойчивей.

Сообщение отредактировал kolobok0 - Aug 2 2013, 14:46
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 03:49
Рейтинг@Mail.ru


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