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

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Apr 26 2013, 11:06
|
Знающий
   
Группа: Свой
Сообщений: 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 (); } или использовать какую-нибудь очередь заданий, которая будет заполняться в прерывании, а обрабатываться в основной программе
|
|
|
|
|
Apr 26 2013, 11:48
|

Местный
  
Группа: Участник
Сообщений: 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 (); } или использовать какую-нибудь очередь заданий, которая будет заполняться в прерывании, а обрабатываться в основной программе компилятору пофигу какие там переменные в ф-ии используются и передаются параметры в ф-ии или нет , он либо делает ф-ию инлайн либо, либо сохранет все регистры , и фсе! ЁЁ.. , столько времяни потратил на эти эксперементы !!!
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|