ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
649505
rual (28.01.2016 14:54 - 16:10, просмотров: 6042)
Знатокам АСМа STM32, проблемка: STM32F3Discovery имеем асм-код,который должен сохранять_контекст - запускать_процедуру (Handler)- восстанавливать_контекст в режиме привилегированного потока, имею глюки (выделено !!!!!) __asm void Lautcher(void) { extern Handler extern xLR PUSH {R0-R12,LR} ; // сохраним регистры и ссылку для возврата MRS R0, PSR ; // сохраним PSR в стеке !!!!!!!! ЧИТАЕТ БЕЗ установленного бита Т, поэтому насильно втыкаю его ORR R0, #bitT ; // c восстановленым битом Т PUSH {R0} LDR LR, =_handler_ret ;// адреес возврата из обработчика к восстановлению контекста LDR R0, =Handler ; // вызов обработчика LDR R1, [R0] BX R1 _handler_ret LDR R0, =xLR ; // восстановим LR прерванного процесса LDR LR, [R0] POP {R0} ; // восстановим PSR из стека MSR PSR, R0 POP {R0-R12} ; // востановим регистры и веренемся в прерванный процесс POP {PC} /// !!!!!!!!!!!!!!!!! после выполнения возвращается в основную программу, но млять опять БЕЗ Т в PSR и вываливается в HardFault_Handler !!!!! ALIGN } Последнюю инструкцию писал и так POP {R0-R12,PC} + Причем если вызвать Lautcher непосредственно BL.W #Lautcher, то всё нормально, если он запустится после возврата из обработчика SVC_Handler - косяк((( __asm void SVC_Handler(void) { extern xLR ;/// надо вствить проверку стека на переполнение !!! MRS R0, MSP ; // загрузим SP в R3 LDR R1, [R0,#5*4] ; // прочитаем LR из контекст прерванного процесса LDR R2, =xLR ; // сохраним LR контекста в памяти STR R1,[R2] LDR R1, [R0,#6*4] ; // прочитаем текущий контекст PC STR R1,[R0,#5*4] ; // заменим LR контекста на PC прерванного процесса LDR R1, =Lautcher ; // заменим PC контекста на пускатель обработчика STR R1, [R0,#6*4] BX LR ; // завершим обработку SVC ALIGN } Что не так?