Я пишу свою собственную RTOS и реализую функцию переключения контекста, где мне приходится использовать PSP. Функция написана на встроенном ассемблере.
Я работал над другим проектом по сборке записи STM32 F4, и R13, по-видимому, был MSP.
Мне интересно, нужно ли мне для моих целей переключать R13 с MSP на PSP?
Если мы посмотрим на функцию переключения контекста FreeRTOS, она просто использует psp
, а не r13
. Однако я могу получить доступ только r13
https://github.com/kylemanna/freertos/blob/master/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c#L481
Может ли кто-нибудь поделиться информацией о том, как работает переход с MSP на PSP?
Я не понимаю, почему вам вообще «нужно» его использовать, вы можете «выбрать», всякий раз, когда я с ним возился, это было болью и того не стоило, кроме YMMV. Это, конечно, не требуется для ОСРВ.
Я полагаю, вы прочитали справочное руководство по архитектуре Armv7-m? именно здесь описано, как мне это сделать.
Как указано в ответе, указанном в комментариях, r13
не является физическим регистром, а вместо этого всегда отражает содержимое либо MSP
, либо PSP
. Вы не можете выбрать, какой из двух доступен через r13
, переключение происходит автоматически и зависит от того, находится ли процессор в режиме потока или в режиме обработчика.
По умолчанию весь код выполняется с привилегиями и весь код использует MSP, поэтому существует единый стек. Большинство ядер операционных систем изменят это, манипулируя двумя битами в регистре CONTROL
. Установка бита 0 (nPriv
) приводит к запуску кода режима потока без привилегий, а установка бита 1 (SPSEL
) выбирает PSP
в качестве активного указателя стека (этот бит читается как ноль и игнорирует записи в режиме обработчика). Обычно это делается после создания и инициализации небольшого буфера, который будет действовать как стек простаивающих задач, и записи указателя стека простаивающих задач в PSP
.
В этой конфигурации переключение контекста становится довольно простым. При условии, что переключатель контекста работает в режиме обработчика (обработчик PendSV является отличным выбором в большинстве случаев), он будет использовать MSP для собственных нужд, а это означает, что он может без особых затруднений манипулировать PSP. ЦП автоматически помещает r0-r3
, r12
, lr
, pc
и xPSR
в активный стек перед входом в режим обработчика; поэтому переключателю контекста только для целых чисел нужно только загрузить PSP в регистр с помощью MRS
, нажать r4-r11
, сохранить обновленное значение указателя стека где-то, связанное с выполняемым потоком, загрузить новый указатель стека из места, связанного со следующим потоком, в бегите, нажмите r4-r11
, используйте MSR
для обновления PSP
и вернитесь.
Спасибо за упоминание о том, какие регистры процессор автоматически помещает. Теперь я понимаю, почему код переключения контекста, который я читал, нажимает r4 - r11.
Я хотел бы спросить, что вы подразумеваете под «(этот бит читается как ноль и игнорирует записи в режиме обработчика)». То есть вы не можете записать бит SPSEL в режиме обработчика? То есть вы не можете переключиться на PSP в обработчике pendSV? спасибо за помощь
Правильно, r13
всегда зеркально MSP
в режиме обработчика, поэтому обработчики всегда используют основной стек, и это нельзя изменить. Но, конечно, если обработчику необходимо получить доступ к PSP
или изменить его, он может сделать это напрямую, используя инструкции MRS
и MSR
, как я описал. Вы могли бы прочитать общее руководство пользователя для ядра, которое вы используете — вы не говорите, что это такое, я использовал некоторые STM32F4, которые являются Cortex M3, и другие, которые являются Cortex M4F.
А вот например вот это раздел о вводе и возврате исключений в руководстве M3. M4F здесь более сложен из-за регистров с плавающей запятой.
Возможно актуально: electronics.stackexchange.com/questions/403967/…