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

 
 
> 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
Ответов
_Pasha
сообщение Apr 26 2013, 08:57
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Еще разок про static функции
Вот, предположим, Вам надо чтобы OnSound(uint8_t param) была видна всюду, и чтобы красиво вызывалась в прерывании. Есть типовый приемчик на сей случай:
Код
static void OnSound_prim(uint8_t param);
void OnSound(uint8_t param)
{
  OnSound_prim(param);
}
void OnSound_prim(uint8_t param)
{
// сюда помещаем то, что изначально находилось в OnSound()
}

и из прерывания вызываем OnSound_prim().
Профит: компилер уберет все лишние стековые операции и вообще соптимизирует все хорошо. И для вызова глобальной функции ничего эдакого лишнего не произойдет.
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
|- - MaxiMuz   Цитата(_Pasha @ Apr 26 2013, 11:57) Еще р...   Apr 26 2013, 11:04
- - psL   не использовать автоматических переменных в теле ф...   Apr 26 2013, 11:06
|- - MaxiMuz   Цитата(psL @ Apr 26 2013, 14:06) не испол...   Apr 26 2013, 11:48
- - 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 Текстовая версия Сейчас: 22nd June 2025 - 13:55
Рейтинг@Mail.ru


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