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

Под FreeRTOS не получается вручную изменить указатель стека MSP

Товарищи,

Проект на STM32H743,  FreeRTOS.

Ось похоже отслеживает состояние регистра MSP и из задачи не удается изменить содержимое MSP. Значение не меняется.

(До запуска оси регистр MSP из программы меняется спокойно).

Подскажите пожалуйста, что, где покрутить ?

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


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

Вот специально же разрабатывали ядро так, чтобы нельзя было лезть туда куда не просят🙂

По теме: после старта ОС переводит CPU в непривелигированный режим, поэтому просто так менять значение MSP нельзя. Как и некоторых (многих) системных регистров CPU.

Можно, конечно, сколхозить, но вам это решение не понравится)) А вообще можно, конечно, в исходнике порта FreeRTOS одну чиселку поправить, но это опять же - не хорошо.

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


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

12 hours ago, TOG said:

Подскажите пожалуйста, что, где покрутить ?

У меня даже интерес больший возникает узнать для чего Вам это нужно? Я не оспариваю необходимость менять указатель стека при запущенной ОСРВ. Вопрос именно в том: для чего?

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


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

6 hours ago, haker_fox said:

Вопрос именно в том: для чего?

Надо запустить другое приложение. Типа как бутлоадер запускает основное приложение.

PC меняется, VTOR тоже, а MSP не меняется(выше мне объяснили почему).

18 hours ago, Arlleex said:

По теме: после старта ОС переводит CPU в непривелигированный режим, поэтому просто так менять значение MSP нельзя.

Может из оси можно выйти ? Типа завершить работу, попасть снова в main и от туда уже передать управление другому приложению ?

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


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

3 minutes ago, TOG said:

Надо запустить другое приложение. Типа как бутлоадер запускает основное приложение.

Что мешает тупо вызывать main() внешнего приложение из своей задачи?

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


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

14 минут назад, TOG сказал:

PC меняется, VTOR тоже, а MSP не меняется(выше мне объяснили почему).

Чтобы "запустить другое приложение", изменить MSP скорей всего будет недостаточно. В идеале нужно предварительно вообще все регистры ядра и периферии перевести в исходное (послесбросовое) состояние. Иначе следующий ваш вопрос будет: "Почему после запуска отладчиком то приложение работает, а после запуска мои загрузчиком - нет?".

9 минут назад, tonyk_av сказал:

Что мешает тупо вызывать main() внешнего приложение из своей задачи?

Мешает то, что оно так не запустится. С большой долей вероятности.

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

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


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

8 minutes ago, jcxz said:

Чтобы "запустить другое приложение", изменить MSP скорей всего будет недостаточно. В идеале нужно предварительно вообще все регистры ядра и периферии перевести в исходное (послесбросовое) состояние.

Это я знаю. Бутлоадер делать умею. И по такому же принципу хотел запустить другое приложение. (Сброс тактирования, установка VTOR, MSP и переход на новый адрес).

Как из под контроля FreeRTOS выбраться, ? вот вопрос.

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


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

2 минуты назад, TOG сказал:

Как из под контроля FreeRTOS выбраться, ? вот вопрос.

варианты:

1. Не давать включить защиту.

2. Выключить её в соответствующем сервисе ОС (например в сервисе SVC).

3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно.

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


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

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

Может из оси можно выйти ? Типа завершить работу, попасть снова в main и от туда уже передать управление другому приложению ?

FreeRTOS, как и наверное все ОС не предназначены для того, чтобы из нее "выходить". Потому что выходить некуда - контекст полностью разрушается.

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

Напишите простейшую прослойку-начальный-запускатель, который в зависимости от некого флажка в ОЗУ будет передавать управление той или иной области памяти - разумеется, с предварительной "оценкой" возможности запуска кода оттуда по неким признакам - по контрольной сумме и т.д. Из своей задачи ставите в этот флажок номер запускаемой программы и сбрасываете CPU.

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


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

2 minutes ago, jcxz said:

2. Выключить её в соответствующем сервисе ОС (например в сервисе SVC).

3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно.

Понял. Спасибо, jcxz !

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


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

1 hour ago, jcxz said:

3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно.

Все получилось, jcxz !

Из прерывания таймера прекрасно все работает. 

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


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

35 минут назад, tonyk_av сказал:

В чём сложность? Пока не вижу.

Хотя бы в том, что перед передачей управления в main(), необходимо как минимум выполнить си-стартап. Который должен проинициализировать глобальные и статические переменные. Это не считая того, что в запускаемой программе какая-то работа может выполняться до main(). А вы её пропустите.

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


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

2 hours ago, jcxz said:

необходимо как минимум выполнить си-стартап.

Это как раз не проблема. Имена функций, выполняющих сишный стартап, зависят от компилятора и известны. Более того, код стартапа не зависит от запускаемой программы и одинаков у всех программ, собранных одним и тем же компилятором.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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