реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Использование регистров в прерывании, arm cortex-m3 gcc r7
Brain13
сообщение Sep 2 2011, 07:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Доброго времени суток.

Есть такой код для Cortex-M3, компилятор CodeSourcery G++ Lite.
CODE
extern "C" void SysTick_Handler()
{
a++;
}

int main()
{
if(SysTick_Config(1000))
{
while(1)
{
}
}

while (1)
{
}
//return 0;
}

Скомпилил, ассемблерный код обработчика SysTick_Handler выглядит так:
CODE
22 {
SysTick_Handler():
080002d8: push {r7}
080002da: add r7, sp, #0

23 a++;
080002dc: ldr r3, [pc, #16] ; (0x80002f0 <SysTick_Handler()+24>)
080002de: ldr r3, [r3, #0]
080002e0: add.w r2, r3, #1
080002e4: ldr r3, [pc, #8] ; (0x80002f0 <SysTick_Handler()+24>)
080002e6: str r2, [r3, #0]
24 }
080002e8: mov sp, r7
080002ea: pop {r7}

080002ec: bx lr
080002ee: nop
080002f0: movs r4, r5
080002f2: movs r0, #0

Получается, что из-за выделенных кусков нельзя изменять r7, компилер его нигде не использует, но при выходе из прерывания, возвращает в исходное состояние.
Чтобы избавиться от этого сейчас использую вот так определенную функцию:
Код
extern "C" __attribute__((naked)) void SysTick_Handler()
{
    a++;
    asm volatile("bx lr \n\t");
}

Но не знаю насколько это правильно.
Очень интересно узнать зачем компилятор сохраняет указатель стека в регистр r7, и как это отключить?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 2 2011, 07:37
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Brain13 @ Sep 2 2011, 12:23) *
Чтобы избавиться от этого сейчас использую вот так определенную функцию:

Вся функция неоптимальна/неоптимизированна. Для начала я бы включил оптимизацию и посмотрел.

Может это в отладочных целях делается.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Brain13
сообщение Sep 2 2011, 07:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(GetSmart @ Sep 2 2011, 11:37) *
Вся функция неоптимальна/неоптимизированна. Для начала я бы включил оптимизацию и посмотрел.

Может это в отладочных целях делается.


Да, Вы правы, при установке оптимизации -O1 первый вариант функции превратился в такой код:
Код
23            a++;
          SysTick_Handler():
08000224:   ldr r3, [pc, #8]       ; (0x8000230 <SysTick_Handler()+12>)
08000226:   ldr r2, [r3, #0]
08000228:   add.w r2, r2, #1
0800022c:   str r2, [r3, #0]
25        }
0800022e:   bx lr
08000230:   movs r4, r4
08000232:   movs r0, #0

Но как же я отлаживать буду с оптимизацией?
Можно, конечно, вставить #ifdef DEBUG и т.д., но все же хотелось узнать как это отключить и без оптимизации.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 2 2011, 10:00
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Ну без какой-либо оптимизации заставить оптимизировать код тяжело :-)
Попробуйте
-fomit-frame-pointer
-momit-leaf-frame-pointer
Для x86 старается по мере возможности SP в BP не копировать и стандартные заголовки процедур (удобные в том числе для отладчика) не делать.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
svss
сообщение Sep 6 2011, 09:56
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594



Цитата(Brain13 @ Sep 2 2011, 14:23) *
Очень интересно узнать зачем компилятор сохраняет указатель стека в регистр r7, и как это отключить?

Вы действительно хотели на этом форуме узнать, зачем бесплатный компилятор сохраняет
указатель стека в регистре r7, или у Вас более жизненная задача?
Go to the top of the page
 
+Quote Post
Brain13
сообщение Sep 8 2011, 06:53
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(svss @ Sep 6 2011, 13:56) *
Вы действительно хотели на этом форуме узнать, зачем бесплатный компилятор сохраняет
указатель стека в регистре r7, или у Вас более жизненная задача?

Зачем это надо, я по-моему разобрался - для средств отладки. Насколько я понял, при разработке embeded-приложения данная фича как пятая нога, это наследство от старших моделей ARM. Если не прав - поправьте.

Главной задачей было это отключить, тк оно не давало читать/писать в "правильный" r7. Но надо знать, не будет ли отключенная фича рушить программу.
Ключи -fomit-frame-pointer -fcprop-registers помогли. Теперь программа в прерывании использует только регистры, сохраненные при его вызове.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 13:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016