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

 
 
> GCC: Как избежать избыточного пользования стеком в прерываниях
MaxiMuz
сообщение Apr 25 2013, 12:36
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



К примеру имеется прерывание:
Код
ISR (INT0_vect)
   {    
       uint8_t temp;
       temp=PORTB;
       OnSound (temp);
   }

avr-gcc 4.7.1. кодит его как:
Код
ISR (INT0_vect)
   {    
    23e:    1f 92           push    r1
    240:    0f 92           push    r0
    242:    0f b6           in    r0, 0x3f ; 63
    244:    0f 92           push    r0
    246:    11 24           eor    r1, r1
    248:    3f 93           push    r19
    24a:    4f 93           push    r20
    24c:    5f 93           push    r21
    24e:    6f 93           push    r22
    250:    7f 93           push    r23
    252:    8f 93           push    r24
    254:    9f 93           push    r25
    256:    af 93           push    r26
    258:    bf 93           push    r27
    25a:    ef 93           push    r30
    25c:    ff 93           push    r31
       uint8_t temp;
       temp=PORTB;
    25e:    88 b3           in    r24, 0x18 ; 24
       OnSound (temp);
    260:    e4 df           rcall    .-56   ; 0x22a <OnSound>
   }
    262:    ff 91           pop    r31
    264:    ef 91           pop    r30
    266:    bf 91           pop    r27
    268:    af 91           pop    r26
    26a:    9f 91           pop    r25
    26c:    8f 91           pop    r24
    26e:    7f 91           pop    r23
    270:    6f 91           pop    r22
    272:    5f 91           pop    r21
    274:    4f 91           pop    r20
    276:    3f 91           pop    r19
    278:    0f 90           pop    r0
    27a:    0f be           out    0x3f, r0 ; 63
    27c:    0f 90           pop    r0
    27e:    1f 90           pop    r1
    280:    18 95           reti

собственно понятно, созранение всех задействованных регистров - перестраховка на случай если расстерянный программист в процедуре внутри прерывания изменит содержимое всех регистров. Если прерывание простое можно добавить аттрибут: "__attribute__((__naked__))" и iret и нет проблем.
А как сделать так чтобы компилятор сохранял только задействованные в конретном прерывании регистры ?

Сообщение отредактировал MaxiMuz - Apr 25 2013, 12:54
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
psL
сообщение Apr 26 2013, 11:06
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



не использовать автоматических переменных в теле функции типа uint8_t temp;
не вызывать функции, передающие параметры через стек типа OnSound (temp);

т.е. примерно так:
Код
static uint8_t temp;
static void OnSound (void){
  temp;
  ...
}
ISR (INT0_vect)
{    
   temp=PORTB;
   OnSound ();
}

или использовать какую-нибудь очередь заданий, которая будет заполняться в прерывании, а обрабатываться в основной программе
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Apr 26 2013, 11:48
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(psL @ Apr 26 2013, 14:06) *
не использовать автоматических переменных в теле функции типа uint8_t temp;
не вызывать функции, передающие параметры через стек типа OnSound (temp);

т.е. примерно так:
Код
static uint8_t temp;
static void OnSound (void){
   temp;
   ...
}
ISR (INT0_vect)
{    
    temp=PORTB;
    OnSound ();
}

или использовать какую-нибудь очередь заданий, которая будет заполняться в прерывании, а обрабатываться в основной программе
компилятору пофигу какие там переменные в ф-ии используются и передаются параметры в ф-ии или нет , он либо делает ф-ию инлайн либо, либо сохранет все регистры , и фсе!
ЁЁ.. , столько времяни потратил на эти эксперементы !!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   GCC: Как избежать избыточного пользования стеком в прерываниях   Apr 25 2013, 12:36
- - Kompot   Цитата(MaxiMuz @ Apr 25 2013, 15:36) А ка...   Apr 25 2013, 12:41
- - MrYuran   В прерываниях нужно делать только самые неотложны...   Apr 25 2013, 13:44
- - neiver   Как вариант можно сделать вызываемую в перрывании ...   Apr 25 2013, 14:30
|- - MaxiMuz   Цитата(neiver @ Apr 25 2013, 17:30) Как в...   Apr 25 2013, 14:58
|- - _Артём_   Цитата(MaxiMuz @ Apr 25 2013, 17:58) дело...   Apr 25 2013, 16:52
|- - MaxiMuz   Цитата(_Артём_ @ Apr 25 2013, 19:52) Прер...   Apr 25 2013, 17:39
- - neiver   А чтотак жалко несколько "лишних" регист...   Apr 25 2013, 15:05
|- - MaxiMuz   Цитата(neiver @ Apr 25 2013, 18:05) А что...   Apr 25 2013, 15:15
- - _Pasha   Можно и просто static указывать для функций. Компи...   Apr 25 2013, 17:13
- - sigmaN   Объявлять как-то так static int static_func( int p...   Apr 26 2013, 00:12
|- - MaxiMuz   Цитата(sigmaN @ Apr 26 2013, 03:12) Объяв...   Apr 26 2013, 06:00
|- - Сергей Борщ   QUOTE (MaxiMuz @ Apr 26 2013, 09:00) Да, ...   Apr 26 2013, 06:38
|- - dxp   QUOTE (MaxiMuz @ Apr 26 2013, 13:00) И вс...   Apr 26 2013, 06:51
- - MaxiMuz   Цитатапоэтому наверное обьявлять как ee static был...   Apr 26 2013, 07:47
|- - _Артём_   Цитата(MaxiMuz @ Apr 26 2013, 10:47) - хо...   Apr 26 2013, 08:13
|- - MaxiMuz   Цитата(_Артём_ @ Apr 26 2013, 11:13) Неуб...   Apr 26 2013, 08:33
|- - ARV   Цитата(MaxiMuz @ Apr 26 2013, 12:33) а пр...   Apr 26 2013, 08:50
- - neiver   Ого! EmptyCall ни разу не empty. Это таки заде...   Apr 26 2013, 07:59
- - neiver   А. простите, что вам дает эта регистравая переменн...   Apr 26 2013, 08:43
- - _Pasha   Еще разок про static функции Вот, предположим, Вам...   Apr 26 2013, 08:57
|- - MaxiMuz   Цитата(_Pasha @ Apr 26 2013, 11:57) Еще р...   Apr 26 2013, 11:04
- - psL   Цитата(MaxiMuz @ Apr 25 2013, 16:36) А ка...   Apr 26 2013, 12:12
|- - ar__systems   Цитата(psL @ Apr 26 2013, 07:12) По идее ...   Apr 29 2013, 13:29
- - _Pasha   Слушайте, если у Вас так туго с времянкой, давным ...   Apr 26 2013, 15:08


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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 17:16
Рейтинг@Mail.ru


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