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

 
 
> Про реентерабельность, малоизвестная фича GCC
_Pasha
сообщение Feb 15 2009, 23:51
Сообщение #1


;
******

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



Только не говорите, что знали и часто пользуетесь! smile.gif

В общем, тем, кому позарез нада получить сабж, оказалось все очень просто

Код
void somefunc (volatile int param)

  volatile int local1;
  volatile char local2;
//body
local1 |= param;
return;
}


Как объявили все volatile - компилятор все, включая входные параметры, кладет в стек-фрейм.

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

В общем, в мануале ГЦЦ настолько туманно это описано, что побудило поделиться радостной новостью.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 16 2009, 00:37
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(_Pasha @ Feb 16 2009, 01:51) *
Как объявили все volatile - компилятор все, включая входные параметры, кладет в стек-фрейм.
А как стековый фрейм связан с реентерабельностью?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 16 2009, 07:10
Сообщение #3


;
******

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



Цитата(Сергей Борщ @ Feb 16 2009, 03:37) *
А как стековый фрейм связан с реентерабельностью?
Обеспечивает копию блока локальных переменных - одно из необходимых условий. 
ЗЫ: Кстати, в WinAVR красивый код коррекции стека
Код
in r0,SREG
cli
.... атомарные операции
out SPL,YL
out SREG,r0
out SPH,YH

Поскольку сам так никогда не делал - на первый взгляд показалось, что бага - прерывания разрешаются при восстановлении SREG до того как завершена коррекция стека. На самом деле все правильно, т.к. следующая после out SREG,r0 команда гарантированно выполнится и прерывание наступит только после out SPH,YH. Таким образом, прерывания разрешаются максимально раньше
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 16 2009, 07:51
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(_Pasha @ Feb 16 2009, 10:10) *
Обеспечивает копию блока локальных переменных - одно из необходимых условий. 


Вот условия реентерабельности:

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

Нет никакой разницы где храняться параметры и локальные переменные, в стеке или в регистрах.

Анатолий.

Цитата(_Pasha @ Feb 16 2009, 10:10) *
ЗЫ: Кстати, в WinAVR красивый код коррекции стека
Код
in r0,SREG
cli
.... атомарные операции
out SPL,YL
out SREG,r0
out SPH,YH


PS: Немного не в тему, в xmega, запись в регистр стека будет выглядеть намного короче;
Код
out SPL,YL
out SPH,YH


В Атмеле догадались сделать это:
Цитата
To prevent corruption when updating the Stack Pointer from software, a write to SPL will automatically
disable interrupts for up to 4 instructions or until the next I/O memory write.


Сообщение отредактировал aesok - Feb 16 2009, 07:59
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 16 2009, 09:10
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(aesok @ Feb 16 2009, 10:51) *
В Атмеле догадались сделать это:
....
Лучше поздно чем никогда. А не XMega они так не планируют доработать?
А ещё лучше бы переключаемые за 1-2 такта банки регистров забабахали штук этак 8.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Pasha   Про реентерабельность   Feb 15 2009, 23:51
- - Rst7   Вы меня, конечно, извините, но это - "ацкий б...   Feb 16 2009, 00:13
|- - ReAl   Цитата(aesok @ Feb 16 2009, 09:51) В Атме...   Feb 16 2009, 09:56
- - Rst7   ЦитатаВот условия реентерабельности: Тут _Pasha и...   Feb 16 2009, 08:26
|- - Сергей Борщ   Цитата(Rst7 @ Feb 16 2009, 10:26) Тут _Pa...   Feb 16 2009, 08:51
|- - _Pasha   Цитата(Rst7 @ Feb 16 2009, 12:26) Тут _Pa...   Feb 16 2009, 23:30
|- - ReAl   Цитата(_Pasha @ Feb 17 2009, 01:30) Кодty...   Feb 17 2009, 07:50
|- - _Pasha   Цитата(ReAl @ Feb 17 2009, 10:50) возможн...   Feb 17 2009, 08:27
|- - ReAl   Цитата(_Pasha @ Feb 17 2009, 10:27) Если ...   Feb 17 2009, 16:40
|- - ReAl   Цитата(ReAl @ Feb 17 2009, 18:40) Не увер...   Mar 15 2009, 12:52
- - _Pasha   Цитата(Rst7 @ Feb 16 2009, 03:13) Куда бе...   Feb 16 2009, 08:46
- - Rst7   Че то я уже не пойму. Судя по предыдущей теме, ник...   Feb 16 2009, 09:08
- - Rst7   Лучше бы - не ядро править, а в компиляторы вменяе...   Feb 16 2009, 10:12
|- - ReAl   Цитата(Rst7 @ Feb 16 2009, 12:12) Лучше б...   Feb 16 2009, 20:42
- - Rst7   Нет, с плюсами конечно, неплохо получается. Но хот...   Feb 16 2009, 21:52
|- - ReAl   Цитата(Rst7 @ Feb 16 2009, 23:52) Нет, с ...   Feb 16 2009, 22:11
- - _Pasha   В общем, пока ясно одно: нельзя смешивать синхронн...   Feb 17 2009, 17:05
- - _Pasha   Еще одна ТАСКАЛКА (от слова task) получилась. Не...   Sep 13 2009, 07:01
|- - ReAl   Цитата(_Pasha @ Sep 13 2009, 10:01) Еще о...   Sep 13 2009, 09:21
|- - _Pasha   Цитата(ReAl @ Sep 13 2009, 12:21) Да, sys...   Sep 13 2009, 11:55
|- - ReAl   Цитата(_Pasha @ Sep 13 2009, 14:55) Имхо,...   Sep 13 2009, 17:02
|- - _Pasha   Цитата(ReAl @ Sep 13 2009, 20:02) Ну и чт...   Sep 13 2009, 20:19
|- - ReAl   Цитата(_Pasha @ Sep 13 2009, 23:19) Допус...   Sep 14 2009, 08:58
- - _Pasha   Понял, спасибо. Но не сразу Если локальных параме...   Sep 15 2009, 05:17
- - _Pasha   Кстати, о protothread parallel.h CODE #ifndef PAR...   Sep 15 2009, 06:42
- - _Pasha   Решил скрестить прототредоподобную кооперативку и ...   Dec 25 2009, 08:47


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 05:53
Рейтинг@Mail.ru


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