Перейти к содержанию
    

39 minutes ago, jcxz said:

Именно после этого я и перестал выключать сохранение контекста FPU.

Интересно, насколько сильно замедляется переключение контекста в ОС и вход-выход в прерывание при включенном сохранении контекста FPU? Есть у кого-нибудь цифры для сравнения? Просто обратил внимание на фразы в форумах про FreeRTOS, что сохранение контекста FPU ощутимо замедляет работу ОС и нагружает память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 процедура должна быть ещё тяжелее. У меня всё по минимуму.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...