|
Про реентерабельность, малоизвестная фича GCC |
|
|
|
Feb 15 2009, 23:51
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Только не говорите, что знали и часто пользуетесь!  В общем, тем, кому позарез нада получить сабж, оказалось все очень просто Код void somefunc (volatile int param) { volatile int local1; volatile char local2; //body local1 |= param; return; } Как объявили все volatile - компилятор все, включая входные параметры, кладет в стек-фрейм. И логика проста: без соответствующих оптимизаций функции генерятся реентерабельными. Volatile как-раз и отключает эту оптимизацию локальных переменных. В общем, в мануале ГЦЦ настолько туманно это описано, что побудило поделиться радостной новостью.
|
|
|
|
|
 |
Ответов
|
Feb 16 2009, 23:30
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Rst7 @ Feb 16 2009, 12:26)  Тут _Pasha имеет в виду не классическое понятие реетерабельности как работу функции в многопоточном приложении, а как некий костыль, позволяющий организовать многопоточность с минимумом затрат памяти. Продолжим нашу шизофрению. Как выяснилось, при размещении в стеке переменных достаточный размер переключаемого контекста AVR будет 6 байт! Это даже меньше, чем я на асме делал, протупил - получалось 8 байт. Код typedef struct
{
uint16_t pc,sp,framePTR;
} small_ctx_t; Т.е. для организации точки входа сопрограммы используется косвенный goto, указатель стека текущей сопрограммы и указатель на локальные данные, который можно получить __builtin_frame_ptr(0). Ввиду того, что жесткого реалтайма не будет, на сохранение регистров в сопрограммах можно вообще не обращать внимание, в смысле - запретить. В общем, 6 байт - это намного меньше, чем в setjmp()
|
|
|
|
|
Feb 17 2009, 07:50
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(_Pasha @ Feb 17 2009, 01:30)  Код typedef struct { uint16_t pc,sp,framePTR; } small_ctx_t; Т.е. для организации точки входа сопрограммы используется косвенный goto, указатель стека текущей сопрограммы и указатель на локальные данные, который можно получить __builtin_frame_ptr(0). Что-то в этом есть. В отличие от указателем на структуру с данным процесса-сопрограммы, это даёт возможность переключаться не только в "корневой" функции, но и в любом месте по глубине вызовов. Но это уже приведёт к потере части преимущества по стеку (да, все регистры уже не сохраняются, но для каждого сопроцесса нужно всё равно резервировать свой стек достаточной глубины). Правда, по сравнению с вытесняющмим системами, остаётся преимущество по времени синхронного переключения. А вот с асинхронным (из прерывания) - всё равно надо весь контекст сохранять, так как промежуточные вычисления на регистрах делаются, архитектура-то не стековая. Хотя для этого органичнее стековая архитектура. О которой ругаются в теме про архитектуру контроллера. На AVR такая модель не ложится, это на PDP-11 ещё можно было эмулировать - делать add 4(R3),8(R3) и только R3 да SP и сохранять (или вообще только SP для четырёх сопроцессов с базами в R0..R3, но они не смогли бы разделять между собой подпрограммы из-за разных баз), хотя, вероятно, выигрыш на переключении растерялся бы на проигрыше в эффектичности самих вычислений. Что-то я недоспал и всё не соображу. И уже бегу. Но интересно.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
_Pasha Про реентерабельность Feb 15 2009, 23:51 Rst7 Вы меня, конечно, извините, но это - "ацкий б... Feb 16 2009, 00:13 Сергей Борщ Цитата(_Pasha @ Feb 16 2009, 01:51) Как о... Feb 16 2009, 00:37 _Pasha Цитата(Сергей Борщ @ Feb 16 2009, 03:37) ... Feb 16 2009, 07:10  aesok Цитата(_Pasha @ Feb 16 2009, 10:10) Обесп... Feb 16 2009, 07:51   demiurg_spb Цитата(aesok @ Feb 16 2009, 10:51) В Атме... Feb 16 2009, 09:10   ReAl Цитата(aesok @ Feb 16 2009, 09:51) В Атме... Feb 16 2009, 09:56 Сергей Борщ Цитата(Rst7 @ Feb 16 2009, 10:26) Тут _Pa... Feb 16 2009, 08:51   _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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|