2017-01-06 6 views
-1

Я начал исследовать FreeRTOS и рассмотрел процедуру сохранения контекста задачи. В этой подпрограмме хранятся регистры и указатель стека. Мой вопрос о стеке в разных потоках. Что делать, если есть поток, который выполняет push и pops, сгенерированные компилятором. Не удалось бы переписать стопку другого потока?Переключатель контекста микропроцессора

+0

Если нет защиты памяти вы можете делать что угодно. Если есть, то нет. Но почему, по-вашему, стек может быть перезаписан? Каждый поток, который там работает, будет иметь push и pops, сгенерированные компилятором, поэтому ...? –

+0

Но что, если есть какие-то нажатия и всплывающие окна в зависимости от конкретного состояния? Затем стек другого потока может быть перезаписан. – Gustavo

+0

По-прежнему объясните, как это произойдет. В потоках есть отдельные стеки, зачем они переписывают друг друга? И каково это конкретное условие? –

ответ

2

Каждому потоку должно быть выделено достаточное количество стека для собственного стека вызовов плюс, который необходим для хранения контекста. Объем дополнительного пространства стека, необходимого для хранения контекста, будет зависеть от цели, но в случае FreeRTOS конкретно константа configMINIMAL_STACK_SIZE будет иметь по крайней мере такой размер плюс некоторый запас.

В некоторых целях, где стек потоков используется в контекстах прерываний, вам также необходимо будет учитывать использование стека прерываниями. Если прерывания являются гнездовыми; самым худшим условием будет то, что все прерывания станут активными в приоритетном порядке до того, как они завершатся - возможно, маловероятный сценарий, но один из них следует рассмотреть.

Рекомендации по выделению стека для FreeRTOS предоставляется в FAQ на http://www.freertos.org/FAQMem.html#StackSize