Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: При восстановлении контекста SP регистр не восстанавливается
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Goofy
Прилагающаяся к FreeRTOS процедура восстановление контекста
Код
; Set the LR to the task stack.                                     
    LDR        R1, =pxCurrentTCB
    LDR        R0, [R1]
    LDR        LR, [R0]

; The critical nesting depth is the first item on the stack.     
; Load it into the ulCriticalNesting variable.                     
    LDR        R0, =ulCriticalNesting
    LDMFD    LR!, {R1}
    STR        R1, [R0]

; Get the SPSR from the stack.                                     
    LDMFD    LR!, {R0}
    MSR        SPSR_cxsf, R0

; Restore all system mode registers for the task.                 
    LDMFD    LR, {R0-R14}^
    NOP


; Restore the return address.                                     
    LDR        LR, [LR, #+60]

; And return - correcting the offset in the LR to obtain the     
; correct address.                                                 
    SUBS    PC, LR, #4


При отладке JTAGом после выполнения команды LDMFD LR, {R0-R14}^ регистр SP не восстанавливается. Управление передаётся нормально, но фактически задачи пользуют один стек cranky.gif
аналогично при сохранении контекста, не хочет писать сбойное значение SP по адресу currentTCB

процессор изначальной в супервизор, ARM режиме

что упустил в настройках?
Процедура вышла из под автора ОС. Либо стоит не верить глазам и JTAGу... Но факт что более менее ёмкая задача систему валит в data_abort
Goofy
Процессор не выходил из supervisor режима (стек для всех тасков инициализировался так). Сделано было по непониманию, когда процессор валился от taskYield, который по ещё более глубокому недопаниманию вызывался напрямую, а не с вектора SWI
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.