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

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


Местный
***

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



Цитата
поэтому наверное обьявлять как ee static былобы неверно.
- хотябы потому что она изначально возвращает ничего, а static д.относится к переменной (хотя могу запблуждаться)

Цитата(Сергей Борщ @ Apr 26 2013, 09:38) *
Объясните, почему? Вам не хватает тактов, но вы готовы тратить их на call этой функции и ее ret?
call выполняется только как исключение первый и последний раз ! , в рабочем цикле оно не задействовано.
А про инлайн , уже непомню писал или нет, нельзя включить т.к. в самой вызываемой ф-ии имеется еще одна ф. которую заинлайнить не получиться , т.к. она спец. вкл. чтобы компил. не выкидывал регистровую переменную,
уан момент:
Код
void EmptyCall (void)
{     uint8_t temp;
    temp=MaskEndLD;
    asm("nop");
    for (temp=0;temp<200;temp++)
    {asm("nop");
    }


Код
void OnDelay (uint16_t a)
{    
    CntLongDelay16l=a;
    bitclr(FlgsSt,EndLD);
    bitset(FlgsSt,OnLD);
    while (!(FlgsSt&MaskEndLD))
    {
        EmptyCall (); // вызов пустой функции
    }
}
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 26 2013, 08:13
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(MaxiMuz @ Apr 26 2013, 10:47) *
- хотябы потому что она изначально возвращает ничего, а static д.относится к переменной (хотя могу запблуждаться)

Вы заблуждаетесь. static функция может возвращать результат, но не будет видна из других файлов.
Цитата(MaxiMuz @ Apr 26 2013, 10:47) *
А про инлайн , уже непомню писал или нет, нельзя включить т.к. в самой вызываемой ф-ии имеется еще одна ф. которую заинлайнить не получиться , т.к. она спец. вкл. чтобы компил. не выкидывал регистровую переменную,

Неубедительно всё это.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Apr 26 2013, 08:33
Сообщение #4


Местный
***

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



Цитата(_Артём_ @ Apr 26 2013, 11:13) *
Неубедительно всё это.

Есть регистровая переменная описанная в *.h
Код
#ifdef __ASSEMBLER__

#  define FlgsSt r18

#else  /* !ASSEMBLER */

register uint8_t FlgsSt asm("r18"); // рег. Флагов

часть ее меняется в другом прерывании, как в main организовать ожидание установки бита в рег.переменной ? просто while (!(FlgsSt&MaskEndS)) { ; } не прокатывает !

Цитата(neiver @ Apr 26 2013, 10:59) *
Ого! EmptyCall ни разу не empty. Это таки задержка тактов этак на 800. А чтоб компилятор не выкидывал переменные, надо ему точнее объяснять свои намерения, например, volatile. там всякие...
И вообще что-то у Вас, сударь, там мутновато. Отсюда и желания странные.

описал по новому:
Код
void EmptyCall (void) __attribute__((__noinline__));
void EmptyCall (void)
{     asm("nop");}

а причем тут volatile непонимаю ?
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 26 2013, 08:50
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(MaxiMuz @ Apr 26 2013, 12:33) *
а причем тут volatile непонимаю ?

при том, что переменные надо правильно описывать, чтобы было меньше проблем с оптимизицией. у вас, судя по всему, переменная FlgsSt должна быть о писана в *.h-файле как volatile uint8_t register FlgsSt asm("r18"); (в ветке #else вашего определения) тогда компилятор будет знать, что это за переменная, и где она хранится, а так же благодаря volatile он не выбросит ее при оптимизации. в принципе, вместо volatile должно пройти и extern - тогда тоже не выбросит...

но вообще говоря, вызывать из обработчика прерываний не-static функции, да еще с вложенными функциями, да еще и с задержками - это уж какой-то совсем плоховатый стиль... при таком стиле в одном месте вы выровняете - в другом разладится...




--------------------
Я бы взял частями... но мне надо сразу.
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
- - 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   не использовать автоматических переменных в теле ф...   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 Текстовая версия Сейчас: 24th June 2025 - 09:30
Рейтинг@Mail.ru


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