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

 
 
> Про реентерабельность, малоизвестная фича 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
Ответов
Rst7
сообщение Feb 16 2009, 10:12
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Лучше бы - не ядро править, а в компиляторы вменяемые способы работы с многобайтовыми переменными добавили. В смысле - чтобы оно само умело загрузку-выгрузку short/long в критическую секцию оборачивать. А то макросы-костыли класса ATOMIC_STORE_SHORT/ATOMIC_LOAD_SHORT уже достали, читабельности коду они аж никак не добавляют sad.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 16 2009, 20:42
Сообщение #3


Нечётный пользователь.
******

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



Цитата(Rst7 @ Feb 16 2009, 12:12) *
Лучше бы - не ядро править, а в компиляторы вменяемые способы работы с многобайтовыми переменными добавили. В смысле - чтобы оно само умело загрузку-выгрузку short/long в критическую секцию оборачивать. А то макросы-костыли класса ATOMIC_STORE_SHORT/ATOMIC_LOAD_SHORT уже достали, читабельности коду они аж никак не добавляют sad.gif

Одно другому не мешает. Не поленились же ещё в 8086 запретить прерывания на одну команду после записи SS. Тут тоже можно было не кучу регистров в кристалл вставлять, а запрет прерывания при обращении к младшему байту.

Что касается атомарнсти, так dxp что-то в таком духе давным давно показывал (только там не шаблон был, а просто класс для одного конкретного типа, в те времена IAR ещё шаблоны не поддерживал).
foo.cpp:
Код
#include <stdint.h>
#include <avr/interrupt.h>

class crit_sect  {
    uint8_t _sreg;
public:
    crit_sect() : _sreg(SREG) { cli(); }
    ~crit_sect() { SREG = _sreg; }
};

// не претендуя на полноту
template<typename T> class atomic {
    volatile T t;
public:
    inline operator T () {
        T temp;
        {    crit_sect cs;
            temp = t;
        }
        return temp;
    }

    inline atomic<T>& operator = (const T ti) {
        {    crit_sect cs;
            t = ti;
        }
        return *this;
    }

    inline atomic<T>& operator++() {
        {    crit_sect cs;
            ++t;
        }
        return *this;
    }
};


atomic<uint16_t> va, vb;
uint16_t c;

void foo() {
    vb = va + c;
    ++va;
}


avr-gcc -Os -mmcu=atmega88 -S foo.cpp
foo.s:
Код
// operator++ не захотел инлайнить, счёл слишком толстой функцией, ключи крутить лень
// да и не нужно, главное принцип
_ZN6atomicIjEppEv:
    movw r30,r24
    in r18,95-0x20
    cli
    ld r24,Z
    ldd r25,Z+1
    adiw r24,1
    std Z+1,r25
    st Z,r24
    out 95-0x20,r18
    movw r24,r30
    ret
/* function atomic<T>& atomic<T>::operator++() [with T = unsigned int] size 12 (11) */


_Z3foov:
    in r24,95-0x20
    cli
    lds r18,va
    lds r19,(va)+1
    out 95-0x20,r24

    lds r24,c
    lds r25,(c)+1
    add r18,r24
    adc r19,r25

    in r24,95-0x20
    cli
    sts (vb)+1,r19
    sts vb,r18
    out 95-0x20,r24

    ldi r24,lo8(va)
    ldi r25,hi8(va)
    rcall _ZN6atomicIjEppEv
    movw r30,r24

    in r18,95-0x20
    cli
    ld r24,Z
    ldd r25,Z+1
    out 95-0x20,r18

    sbiw r24,5
    brne .L6
    sts (c)+1,__zero_reg__
    sts c,__zero_reg__
.L6:
    ret


Собственно, никто ведь не заставляет писать "если на С++, то до конца". Можно использовать только то, что генерирует код не толще тех макросов, о которіх шла речь, но удобнее в использовании.

====
мдя...

1) подсунть в качестве T структуру так просто не удаётся (в варианте с исключённым operator++, естественно)

2) ну да, ну да, в обработчике прерывания доступ тоже будет обрамляться запретом/восстановлением прерываний. Но и если компелятор будет сам уметь оборачивать обращение прямо и вражений, то ему ещё придётся объяснять, что вот тут-то оборачивать и не надо.
А так - просто добавить в шаблон

Код
public:
        T noatomic_get() { return t; }
        void noatomic_assign(T i) { t = i; }
и в обработчиках пользоваться ими.

Эх, нет в жизни совершенства! (С) Лис.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _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   ЦитатаВот условия реентерабельности: Тут _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, 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 - 13:31
Рейтинг@Mail.ru


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