Переключение контекста с использованием встроенного манипулятора - PullRequest
0 голосов
/ 27 марта 2012

У меня есть еще один вопрос по поводу встроенной инструкции по сборке, касающейся переключения контекста.Этот код может работать, но я не уверен на 100%, поэтому я отправляю этот код профессионалам stackoverflow; -)

Я компилирую, используя gcc (без оптимизации) для arm7TDMI.В какой-то момент код должен сделать переключение контекста.

/* Software Interrupt */
/* we must save lr in case it is called from SVC mode */
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr")
// Note : code = 0x23 

Когда я проверяю скомпилированный код, я получаю такой результат:

svc 0x00000023

Человек передо мной, который кодировал это, написал «мы должны сохранить lr», но в скомпилированном коде,Я не вижу никаких следов lr, которые будут сохранены.

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

Ответы [ 2 ]

0 голосов
/ 25 августа 2016

Я думаю, что инструкция SWI должна вызываться в пользовательском режиме.если это правильно.Режим ARM переключается в режим SVC после этой инструкции.затем ядро ​​ARM выполняет операцию копирования, при которой CPSR копируется в SPSR_svc, а LR копируется в LR_svc.это следует использовать для сохранения контекста процессора пользовательского режима для возврата из режима SVC.если ваш обработчик исключений svc использует lr как вызов другой функции, регистр lr должен быть сохранен как использование стека между сменой режима.Я думаю, что человек до того, как ты написал так, чтобы поговорить об этой ситуации.

0 голосов
/ 27 марта 2012

В операторе __asm__ список lr указан как закрытый регистр.Это означает, что компилятор сохранит регистр , если ему нужно .

Поскольку вы не видите сохранения, я думаю, вы можете предположить, что компилятор не использовал этот регистр (в вашемтестовый случай, как минимум).

...