tonyk_av 45 20 декабря, 2023 Опубликовано 20 декабря, 2023 · Жалоба 39 minutes ago, jcxz said: Именно после этого я и перестал выключать сохранение контекста FPU. Интересно, насколько сильно замедляется переключение контекста в ОС и вход-выход в прерывание при включенном сохранении контекста FPU? Есть у кого-нибудь цифры для сравнения? Просто обратил внимание на фразы в форумах про FreeRTOS, что сохранение контекста FPU ощутимо замедляет работу ОС и нагружает память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 20 декабря, 2023 Опубликовано 20 декабря, 2023 · Жалоба 28 минут назад, tonyk_av сказал: Интересно, насколько сильно замедляется переключение контекста в ОС и вход-выход в прерывание при включенном сохранении контекста FPU? Есть у кого-нибудь цифры для сравнения? Просто обратил внимание на фразы в форумах про FreeRTOS, что сохранение контекста FPU ощутимо замедляет работу ОС и нагружает память. Зачем гадать? Вот переключение контекста из моей собственной ОС для Cortex-M3/Cortex-M4F: THUMB IsrStartCtxSw: ADD SP, SP, #8*4 MVN LR, #2 IsrPendSV: MRS R0, PSP ;PSP is process stack pointer LDR R3, =os STMFD R0!, {R4-R11} ;Save remaining regs R4-R11 on process stack CPSID I ;Prevent interruption during context switch LDR R2, [R3, #OStcb] ;os.tcb #ifdef __ARMVFP__ TST LR, #1 << 4 STRB LR, [R2, #OSTCBexcRet] IT EQ VSTMDBEQ R0!, {S16-S31} LDR R1, =osTcbPrioTbl STR R0, [R2, #OSTCBstk] ;os.tcb->stk = SP; LDRB R2, [R3, #OSprioRdy] ;os.prioCur = os.prioRdy STRB R2, [R3, #OSprioCur] LDR R2, [R1, R2, LSL #2] STR R2, [R3, #OStcb] ;os.tcb = osTcbPrioTbl[os.prioCur] LDR R0, [R2, #OSTCBstk] ;R0 is new process SP; SP = os.tcb->stk LDRSB LR, [R2, #OSTCBexcRet] ;os.tcb->excRet TST LR, #1 << 4 IT EQ VLDMIAEQ R0!, {S16-S31} #else LDR R1, =osTcbPrioTbl STR R0, [R2, #OSTCBstk] ;os.tcb->stk = SP; LDRB R2, [R3, #OSprioRdy] ;os.prioCur = os.prioRdy STRB R2, [R3, #OSprioCur] LDR R2, [R1, R2, LSL #2] STR R2, [R3, #OStcb] ;os.tcb = osTcbPrioTbl[os.prioCur] LDR R0, [R2, #OSTCBstk] ;R0 is new process SP; SP = os.tcb->stk #endif CPSIE I LDMFD R0!, {R4-R11} ;Restore r4-11 from new process stack MSR PSP, R0 ;Load PSP with new process SP BX LR ;Exception return will restore remaining context Метка IsrPendSV - это вход обработчика прерывания PendSV, производящего переключение контекста ОС. Внутри производится сохранение регистров старой задачи: VSTMDBEQ R0!, {S16-S31} и восстановление этих же регистров новой задачи: VLDMIAEQ R0!, {S16-S31} Остальные регистры (S0...S15) сохраняются/восстанавливаются аппаратно процедурой стекинга Cortex-M в соответствии с выставленным конфигом в регистрах управления CPU (разрешено ленивое сохранение или нет) и в соответствии с флагом активности использования FPU. Сами посмотрите и сравните ветки по "истина" и "ложь" по __ARMVFP__. Такты можете посчитать. В других ОС должно быть примерно такое же переключение контекста. Думаю - у FreeRTOS процедура должна быть ещё тяжелее. У меня всё по минимуму. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться