TOG 0 26 марта Опубликовано 26 марта · Жалоба Товарищи, Проект на STM32H743, FreeRTOS. Ось похоже отслеживает состояние регистра MSP и из задачи не удается изменить содержимое MSP. Значение не меняется. (До запуска оси регистр MSP из программы меняется спокойно). Подскажите пожалуйста, что, где покрутить ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 26 марта Опубликовано 26 марта · Жалоба Вот специально же разрабатывали ядро так, чтобы нельзя было лезть туда куда не просят🙂 По теме: после старта ОС переводит CPU в непривелигированный режим, поэтому просто так менять значение MSP нельзя. Как и некоторых (многих) системных регистров CPU. Можно, конечно, сколхозить, но вам это решение не понравится)) А вообще можно, конечно, в исходнике порта FreeRTOS одну чиселку поправить, но это опять же - не хорошо. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 27 марта Опубликовано 27 марта · Жалоба 12 hours ago, TOG said: Подскажите пожалуйста, что, где покрутить ? У меня даже интерес больший возникает узнать для чего Вам это нужно? Я не оспариваю необходимость менять указатель стека при запущенной ОСРВ. Вопрос именно в том: для чего? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 27 марта Опубликовано 27 марта · Жалоба 6 hours ago, haker_fox said: Вопрос именно в том: для чего? Надо запустить другое приложение. Типа как бутлоадер запускает основное приложение. PC меняется, VTOR тоже, а MSP не меняется(выше мне объяснили почему). 18 hours ago, Arlleex said: По теме: после старта ОС переводит CPU в непривелигированный режим, поэтому просто так менять значение MSP нельзя. Может из оси можно выйти ? Типа завершить работу, попасть снова в main и от туда уже передать управление другому приложению ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 27 марта Опубликовано 27 марта · Жалоба 3 minutes ago, TOG said: Надо запустить другое приложение. Типа как бутлоадер запускает основное приложение. Что мешает тупо вызывать main() внешнего приложение из своей задачи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 27 марта Опубликовано 27 марта · Жалоба 14 минут назад, TOG сказал: PC меняется, VTOR тоже, а MSP не меняется(выше мне объяснили почему). Чтобы "запустить другое приложение", изменить MSP скорей всего будет недостаточно. В идеале нужно предварительно вообще все регистры ядра и периферии перевести в исходное (послесбросовое) состояние. Иначе следующий ваш вопрос будет: "Почему после запуска отладчиком то приложение работает, а после запуска мои загрузчиком - нет?". 9 минут назад, tonyk_av сказал: Что мешает тупо вызывать main() внешнего приложение из своей задачи? Мешает то, что оно так не запустится. С большой долей вероятности. Запуститься так оно может только если специально было спроектировано под такой тип запуска. А сделать такое непросто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 27 марта Опубликовано 27 марта · Жалоба 8 minutes ago, jcxz said: Чтобы "запустить другое приложение", изменить MSP скорей всего будет недостаточно. В идеале нужно предварительно вообще все регистры ядра и периферии перевести в исходное (послесбросовое) состояние. Это я знаю. Бутлоадер делать умею. И по такому же принципу хотел запустить другое приложение. (Сброс тактирования, установка VTOR, MSP и переход на новый адрес). Как из под контроля FreeRTOS выбраться, ? вот вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 27 марта Опубликовано 27 марта · Жалоба 2 минуты назад, TOG сказал: Как из под контроля FreeRTOS выбраться, ? вот вопрос. варианты: 1. Не давать включить защиту. 2. Выключить её в соответствующем сервисе ОС (например в сервисе SVC). 3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 27 марта Опубликовано 27 марта · Жалоба 29 минут назад, TOG сказал: Может из оси можно выйти ? Типа завершить работу, попасть снова в main и от туда уже передать управление другому приложению ? FreeRTOS, как и наверное все ОС не предназначены для того, чтобы из нее "выходить". Потому что выходить некуда - контекст полностью разрушается. На деле Вам нужно пересмотреть механизм передачи управления прошивке, т.к. я не вижу ни одной причины отдавать управление из-под запущенной RTOS. Напишите простейшую прослойку-начальный-запускатель, который в зависимости от некого флажка в ОЗУ будет передавать управление той или иной области памяти - разумеется, с предварительной "оценкой" возможности запуска кода оттуда по неким признакам - по контрольной сумме и т.д. Из своей задачи ставите в этот флажок номер запускаемой программы и сбрасываете CPU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 27 марта Опубликовано 27 марта · Жалоба 2 minutes ago, jcxz said: 2. Выключить её в соответствующем сервисе ОС (например в сервисе SVC). 3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно. Понял. Спасибо, jcxz ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 27 марта Опубликовано 27 марта · Жалоба 1 hour ago, jcxz said: А сделать такое непросто. В чём сложность? Пока не вижу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 27 марта Опубликовано 27 марта · Жалоба 1 hour ago, jcxz said: 3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно. Все получилось, jcxz ! Из прерывания таймера прекрасно все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 27 марта Опубликовано 27 марта · Жалоба 35 минут назад, tonyk_av сказал: В чём сложность? Пока не вижу. Хотя бы в том, что перед передачей управления в main(), необходимо как минимум выполнить си-стартап. Который должен проинициализировать глобальные и статические переменные. Это не считая того, что в запускаемой программе какая-то работа может выполняться до main(). А вы её пропустите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 27 марта Опубликовано 27 марта · Жалоба 2 hours ago, jcxz said: необходимо как минимум выполнить си-стартап. Это как раз не проблема. Имена функций, выполняющих сишный стартап, зависят от компилятора и известны. Более того, код стартапа не зависит от запускаемой программы и одинаков у всех программ, собранных одним и тем же компилятором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 27 марта Опубликовано 27 марта · Жалоба и что с того? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться