Jump to content

    

GCC: Как избежать избыточного пользования стеком в прерываниях

Recommended Posts

neiver

Ого! EmptyCall ни разу не empty. Это таки задержка тактов этак на 800. А чтоб компилятор не выкидывал переменные, надо ему точнее объяснять свои намерения, например, volatile. там всякие...

И вообще что-то у Вас, сударь, там мутновато. Отсюда и желания странные.

Share this post


Link to post
Share on other sites

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

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

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

Неубедительно всё это.

Share this post


Link to post
Share on other sites

MaxiMuz
Неубедительно всё это.

Есть регистровая переменная описанная в *.h

#ifdef __ASSEMBLER__

#  define FlgsSt r18

#else  /* !ASSEMBLER */

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

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

 

Ого! EmptyCall ни разу не empty. Это таки задержка тактов этак на 800. А чтоб компилятор не выкидывал переменные, надо ему точнее объяснять свои намерения, например, volatile. там всякие...

И вообще что-то у Вас, сударь, там мутновато. Отсюда и желания странные.

описал по новому:

void EmptyCall (void) __attribute__((__noinline__)); 
void EmptyCall (void)
{     asm("nop");}

а причем тут volatile непонимаю ?

Share this post


Link to post
Share on other sites

neiver

А. простите, что вам дает эта регистравая переменная? Экономия байта оперативки и двух тактов обращения к ней? Так EmptyCall в последней версии съест по крайней мере 7 тактов. Вот так экономия на спичках приводит к сами знаете чему.

Share this post


Link to post
Share on other sites

ARV
а причем тут volatile непонимаю ?

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

 

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

 

 

 

Share this post


Link to post
Share on other sites

_Pasha

Еще разок про 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().

Профит: компилер уберет все лишние стековые операции и вообще соптимизирует все хорошо. И для вызова глобальной функции ничего эдакого лишнего не произойдет.

Share this post


Link to post
Share on other sites

MaxiMuz
Еще разок про 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().

Профит: компилер уберет все лишние стековые операции и вообще соптимизирует все хорошо. И для вызова глобальной функции ничего эдакого лишнего не произойдет.

т.е. вызывать в прерывании из ф-ии1 ф-ию2, которую нужно обьявить static , т.е. какбы использовать подставную функцию ? - не работает !
Edited by MaxiMuz

Share this post


Link to post
Share on other sites

psL

не использовать автоматических переменных в теле функции типа uint8_t temp;

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

 

т.е. примерно так:

static uint8_t temp;
static void OnSound (void){
  temp;
  ...
}
ISR (INT0_vect)
{    
   temp=PORTB;
   OnSound ();
}

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

Share this post


Link to post
Share on other sites

MaxiMuz
не использовать автоматических переменных в теле функции типа uint8_t temp;

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

 

т.е. примерно так:

static uint8_t temp;
static void OnSound (void){
   temp;
   ...
}
ISR (INT0_vect)
{    
    temp=PORTB;
    OnSound ();
}

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

компилятору пофигу какие там переменные в ф-ии используются и передаются параметры в ф-ии или нет , он либо делает ф-ию инлайн либо, либо сохранет все регистры , и фсе!

ЁЁ.. , столько времяни потратил на эти эксперементы !!!

Share this post


Link to post
Share on other sites

psL
А как сделать так чтобы компилятор сохранял только задействованные в конретном прерывании регистры ?

По идее никак. Компилятор в принципе не может отследить контекст, в котором вызывается прерывание.

 

Share this post


Link to post
Share on other sites

slavka012
По идее никак. Компилятор в принципе не может отследить контекст, в котором вызывается прерывание.

+1. На этапе компиляции компилятор не может знать, какие регистры используются во всех функциях, вызываемых в прерывании.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.