Зачем включать прерывание так рано в планировщике threadx на порту M4?
На порту threadx M4 реализации прерывания pendsv, который выполняет фактическое переключение контекста многопоточной поддержки threadx, он показывает все во время процедуры, прерывание все открывается без отключения, как и другие rtos, такие как ucos, rtthread и т. Д., Так что это вызвать что-то непредсказуемое во время работы?
как показано ниже, "cpsie i" был выполнен до восстановления следующего потока, готового к запуску.
строка 202 обработала прерывание, но фактическое переключение контекста еще не завершено, это не то, что делает ucos на порте m4, почему это безопасно? благодарю вас!
**202 CPSIE i** @ Enable interrupts
203 @
204 @ /* Increment the thread run count. */
205 @
206 __tx_ts_restore:
207 LDR r7, [r1, #4] @ Pickup the current thread run count
208 LDR r4, =_tx_timer_time_slice @ Build address of time-slice variable
209 LDR r5, [r1, #24] @ Pickup thread's current time-slice
210 ADD r7, r7, #1 @ Increment the thread run count
211 STR r7, [r1, #4] @ Store the new run count
212 @
213 @ /* Setup global time-slice with thread's current time-slice. */
214 @
215 STR r5, [r4] @ Setup global time-slice
216
217 #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
218 @
219 @ /* Call the thread entry function to indicate the thread is executing. */
220 @
221 PUSH {r0, r1} @ Save r0/r1
222 BL _tx_execution_thread_enter @ Call the thread execution enter function
223 POP {r0, r1} @ Recover r3
224 #endif
225 @
226 @ /* Restore the thread context and PSP. */
227 @
228 LDR r12, [r1, #8] @ Pickup thread's stack pointer
229 LDMIA r12!, {LR} @ Pickup LR
230 #ifdef TX_ENABLE_FPU_SUPPORT
231 TST LR, #0x10 @ Determine if the VFP extended frame is present
232 BNE _skip_vfp_restore @ If not, skip VFP restore
233 VLDMIA r12!, {s16-s31} @ Yes, restore additional VFP registers
234 _skip_vfp_restore:
235 #endif
236 LDMIA r12!, {r4-r11} @ Recover thread's registers
237 MSR PSP, r12 @ Setup the thread's stack pointer
238 @
239 @ /* Return to thread. */
240 @
241 BX lr @ Return to thread!
2 ответа
ThreadX предназначен для максимально быстрой работы и минимизации критических секций. Включение прерывания перед восстановлением контекста безопасно.
Подробнее:
Планировщик работает в прерывании PendSV, только прерывание с более высоким приоритетом, чем PendSV, может вытеснить планировщик. PendSV не может вытеснить себя. ThreadX не вызывает планировщик напрямую (кроме первого раза). Таким образом, для планировщика нет повторного входа. Процесс восстановления контекста может быть прерван прерыванием с более высоким приоритетом, оборудование позаботится о вложении прерываний, сохранении / восстановлении сохраненных регистров вызывающего абонента и т. Д. Когда возвращается прерывание с высоким приоритетом, процесс восстановления контекста продолжается, как будто ничего не произошло. Если прерывание с высоким приоритетом делает готовым другой поток с более высоким приоритетом, ThreadX запишет новый поток как следующий для выполнения, но не будет вызывать планировщик напрямую. Вместо этого он переводит прерывание PendSV в состояние ожидания.Еще одно переключение контекста происходит после завершения текущего процесса восстановления контекста. Поскольку другие прерывания не влияют на процесс восстановления контекста, можно безопасно разрешить прерывание во время процесса восстановления контекста. За счет более раннего разрешения прерывания другие прерывания могут обслуживаться с меньшей задержкой. В состоянии отключения прерывания лучше иметь меньше времени.
Короткий ответ заключается в том, что это безопасно, потому что после этого система может обрабатывать прерывания, не оставляя свои критические структуры данных в несогласованном состоянии.
Более конкретно, после этого момента внутренние структуры данных ThreadX находятся в согласованном состоянии, так что ISR может безопасно вызывать разрешенные службы ThreadX, тогда как до этого момента они не работают, и поэтому необходимо предотвратить запуск ISR.
Обратите внимание, что система исключений M4 - особенно SVCall, PendSV и исключения прерываний и их относительные приоритеты - облегчает реализацию вытесняющей многозадачной системы, не требуя явного отключения и включения прерываний вообще.