Зачем включать прерывание так рано в планировщике 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 и исключения прерываний и их относительные приоритеты - облегчает реализацию вытесняющей многозадачной системы, не требуя явного отключения и включения прерываний вообще.

Другие вопросы по тегам