0 / 0 / 0
Регистрация: 25.08.2013
Сообщений: 61
1

Регистры ARM

18.01.2014, 01:25. Показов 7530. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возник такой вопрос по регистрам ARM. Когда возникает прерывание, обработчик прерываний кидает в стек значения регистров R0-R3, R12, LR, PC, xPSR, чтобы снова его восстановить. Почему только эти? Вроде бы эти регистры сохраняются в стек, чтобы потом восстановить работу основного потока. А разве в регистрах R5-R11, SP не хранится информация о состоянии основного потока? Ведь они не восстанавливается после выполнения прерывания.

Плюс ещё один вопрос. Если внутри одной функции вызвать другую, что сохраниться в стеке? Те же регистры?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2014, 01:25
Ответы с готовыми решениями:

Регистры STM32
Добрый день, я новичёк, нужна помощь с объяснением данных записей: 1) " GPIO_MODER_MODER9_0...

регистры stm32f4
балуюсь с платой stm32f4discovery. Вроде одолел все эти подключения библиотек и настало время...

Регистры приоритета NVIC
Подскажите какие адреса у регистров NVIC_IPRx. Базовый адрес для этого регистра NVIC_BASE0 =...

Spi через регистры
пишу в truestudio использую hal * USER CODE BEGIN WHILE */ while (1) { ...

10
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
18.01.2014, 01:33 2
Цитата Сообщение от tomshyhoj
Возник такой вопрос по регистрам ARM. Когда возникает прерывание, обработчик прерываний кидает в стек значения регистров R0-R3, R12, LR, PC, xPSR, чтобы снова его восстановить. Почему только эти? Вроде бы эти регистры сохраняются в стек, чтобы потом восстановить работу основного потока. А разве в регистрах R5-R11, SP не хранится информация о состоянии основного потока? Ведь они не восстанавливается после выполнения прерывания.
Сохранение регистров требует время, поэтому в целях оптимизации сохраняются только те регистры, которые будут использованы в обработчике.
Если вы будете вызывать из обработчика функцию, которая может использовать и другие регистры, он должен будет сохранить всё.
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
18.01.2014, 01:43 3
Цитата Сообщение от tomshyhoj
Плюс ещё один вопрос. Если внутри одной функции вызвать другую, что сохраниться в стеке? Те же регистры?
Это зависит от компилятора, но вообще есть и стандартные правила вызова функций - ARM EABI. Они описывают как передаются параметры и возвратные значения функции (какие регистры, в каком случае используется стёк, и т.д.) для обеспечения бинарной совместимости.
0
0 / 0 / 0
Регистрация: 25.08.2013
Сообщений: 61
18.01.2014, 01:52 4
Цитата Сообщение от яверт
Цитата Сообщение от tomshyhoj
Возник такой вопрос по регистрам ARM. Когда возникает прерывание, обработчик прерываний кидает в стек значения регистров R0-R3, R12, LR, PC, xPSR, чтобы снова его восстановить. Почему только эти? Вроде бы эти регистры сохраняются в стек, чтобы потом восстановить работу основного потока. А разве в регистрах R5-R11, SP не хранится информация о состоянии основного потока? Ведь они не восстанавливается после выполнения прерывания.
Сохранение регистров требует время, поэтому в целях оптимизации сохраняются только те регистры, которые будут использованы в обработчике.
Если вы будете вызывать из обработчика функцию, которая может использовать и другие регистры, он должен будет сохранить всё.

Получается, что функция обработчика прерываний, в отличии функций основного потока, не должна использовать R5-R11, SP?
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
18.01.2014, 02:12 5
Цитата Сообщение от tomshyhoj
Получается, что функция обработчика прерываний, в отличии функций основного потока, не должна использовать R5-R11, SP?
Она может использовать все регистры, а может и не использовать, во втором случае не все регистры будут предварительно сохранены.

Да, а про какой ARM мы говорим? В ARM7 TDMI например есть банки регистров, они переключаются в зависимости от режима.
http://infocenter.arm.com/help/index.js ... 07s01.html
0
0 / 0 / 0
Регистрация: 25.08.2013
Сообщений: 61
18.01.2014, 02:43 6
Цитата Сообщение от яверт
Цитата Сообщение от tomshyhoj
Получается, что функция обработчика прерываний, в отличии функций основного потока, не должна использовать R5-R11, SP?
Она может использовать все регистры, а может и не использовать, во втором случае не все регистры будут предварительно сохранены.

Да, а про какой ARM мы говорим? В ARM7 TDMI например есть банки регистров, они переключаются в зависимости от режима.
http://infocenter.arm.com/help/index.js ... 07s01.html

Я про cortex m4.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
18.01.2014, 13:35 7
tomshyhoj, если Ваша программа на ассемблере, то в обработчике сохраняйте только те регистры, которые будут изменяться в коде обработчика. А в функции - только те, которые будут изменяться в коде функции. Достаточно соблюдать это требование. Никаких жёстко навязанных номеров регистров нет.

Если же пишете на Си - тогда какая Вам разница, какие регистры задействует компилятор в том или ином кусочке программы? Он сам выберет наиболее подходящие (в том числе "прислушается" к конвенции о передаче параметров/значений) и их сохранит. Бывает, что один и тот же Си код перекомпилируется с использованием уже других регистров. Это внутреннее дело компилятора. Если у Вас чистый Си и не используются ассемблерные вставки, то не забивайте себе голову номерами регистров.
0
0 / 0 / 0
Регистрация: 25.08.2013
Сообщений: 61
20.01.2014, 22:53 8
Цитата Сообщение от OtyxPM
tomshyhoj, если Ваша программа на ассемблере, то в обработчике сохраняйте только те регистры, которые будут изменяться в коде обработчика. А в функции - только те, которые будут изменяться в коде функции. Достаточно соблюдать это требование. Никаких жёстко навязанных номеров регистров нет.

Если же пишете на Си - тогда какая Вам разница, какие регистры задействует компилятор в том или ином кусочке программы? Он сам выберет наиболее подходящие (в том числе "прислушается" к конвенции о передаче параметров/значений) и их сохранит. Бывает, что один и тот же Си код перекомпилируется с использованием уже других регистров. Это внутреннее дело компилятора. Если у Вас чистый Си и не используются ассемблерные вставки, то не забивайте себе голову номерами регистров.
В том-то и дело, что надо написать функцию, которая будет писаться на ассемблере, и вызываться из си. И тут вот возникает такой вопрос - что произойдёт, когда эта функция будет вызвана? Что сохраниться в стеке вызовов? Восстановятся ли эти значения после bx lr? Или мне самому надо это делать вручную?
0
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
21.01.2014, 01:02 9
cortex m3 аппаратно сохранял 2 и 3 регистры точно (ещё какие-то, не помню).
Я писал прерывания на асме так (GCC only!!!):
__attribute__((naked) void Inerrupt_Hendler(void)
{
volatile asm " что-то там с регистрами 2 и 3";
volatile asm "BX LR"; // Не забываем писать выход из функции
}
пишу сонный и на память.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
21.01.2014, 12:32 10
Цитата Сообщение от tomshyhoj
В том-то и дело, что надо написать функцию, которая будет писаться на ассемблере, и вызываться из си. И тут вот возникает такой вопрос - что произойдёт, когда эта функция будет вызвана? Что сохраниться в стеке вызовов? Восстановятся ли эти значения после bx lr? Или мне самому надо это делать вручную?
Про всё это написано в документе - соглашении о передаче параметров и возвращаемых значений между Си и Асм! У каждого Си-компилятора есть такой документ. И Вам уже говорили:
Цитата Сообщение от яверт
Это зависит от компилятора, но вообще есть и стандартные правила вызова функций - ARM EABI. Они описывают как передаются параметры и возвратные значения функции (какие регистры, в каком случае используется стёк, и т.д.) для обеспечения бинарной совместимости.
Ещё вот в этой теме было об использовании регистров в связке Си-Асм.
0
0 / 0 / 0
Регистрация: 25.08.2013
Сообщений: 61
21.01.2014, 18:25 11
Цитата Сообщение от OtyxPM
Цитата Сообщение от tomshyhoj
В том-то и дело, что надо написать функцию, которая будет писаться на ассемблере, и вызываться из си. И тут вот возникает такой вопрос - что произойдёт, когда эта функция будет вызвана? Что сохраниться в стеке вызовов? Восстановятся ли эти значения после bx lr? Или мне самому надо это делать вручную?
Про всё это написано в документе - соглашении о передаче параметров и возвращаемых значений между Си и Асм! У каждого Си-компилятора есть такой документ. И Вам уже говорили:
Цитата Сообщение от яверт
Это зависит от компилятора, но вообще есть и стандартные правила вызова функций - ARM EABI. Они описывают как передаются параметры и возвратные значения функции (какие регистры, в каком случае используется стёк, и т.д.) для обеспечения бинарной совместимости.
Ещё вот в этой теме было об использовании регистров в связке Си-Асм.

Спасибо за ответ.
0
21.01.2014, 18:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2014, 18:25
Помогаю со студенческими работами здесь

STM32FDiscovery USB регистры
Добрый день. Столкнулся с такой ситуацией... При работе в Keil программируя контроллер на...

STM32F1 RTC и BKP регистры
Привет всем. Помогите с настройкой RTC. После инициализации и запуска часов не сохраняются...

Запуск ацп через регистры
Несколько дней пытаюсь включить АЦП и заставить его передавать данные на ЦАП без ПДП. мк...

регистры в STM "Как это работает?"
Всем привет. Нахожусь на стадии изучения этого камня параллельно языка C, возникают вопросы на...

stm32f429 rtc не обновляет теневые регистры
Здравствуйте, форумчане! возникла проблема при работе с RTC. пытаюсь устанавливать дату. если я...

STM8 + MPU-6050 = Не читаются регистры
Доброго всем дня. Пробую запустить вышеуказанную связку. При записи в регистры везде Ack, а...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru