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

 
 
> Альтернативный вариант задания функции процесса
ArtDenis
сообщение Nov 10 2012, 13:36
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Приветствую.

Начал смотреть scmRTOS. Сразу начал резать глаз способ реализации функции процесса:
Код
typedef OS::process<OS::pr0, 300> TProc1;

namespace OS
{
    template <>
    OS_PROCESS void TProc1::exec()
    {
        for(;;)
        {
            ef.wait();
            PB0.Off();
        }
    }
}

Необходимость реализовывать функцию процесса внутри поля имён OS, а добавление template <> вызывает некоторое удивление wacko.gif

Подумалось, почему-бы не сделать ф-цию exec просто ф-цией своего собственного класса? На скорую руку сделал несколько изменений в исходниках scmRTOS и весь код декларации и реализации процесса превратился в:

Код
class TProc1 : public OS::process<TProc1, OS::pr0, 300>
{
public:
    static void exec()
    {
        for(;;)
        {
            ef.wait();
            PB0.Off();
        }
    }
};


Что мы в итоге имеем? 1) Класс, в котором можно инкапсулировать данные и методы процесса. Закрытые и используемые только в TProc1 данные можно объявить в секции private класса и никто к ним не получит доступ. 2) Более привычный способ реализации ф-ции.

Кто что думает на этот счёт?


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Nov 16 2012, 19:41
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ArtDenis @ Nov 16 2012, 09:41) *
AHTOXA, Указатель на нестатическую функцию член класса в с++ - это не настоящий указатель. Его структура и размер зависят от компилятора. Поэтому чтобы узнать адрес ф-ции, надо выяснить где именно в структуре этого указателя "сидит" конкретно адрес для перехода.

Я понимаю это. Потому и говорил не об указателе на функцию-член, а об её адресе. Но вот нестандартность такого решения - это действительно плохо.
Цитата(ArtDenis @ Nov 16 2012, 09:41) *
А зачем вообще нужна нестатическая функция для процесса? Всё равно каждый процесс существует в единственном экземпляре.

Чтобы обращаться к членам класса. Чтобы инициализировать их в конструкторе. Чтобы обращаться к унаследованным функциям класса, в конце концов. Короче, чтоб инкапсуляцияsm.gif

Цитата(ReAl @ Nov 16 2012, 02:19) *
Не надо адрес функции-члена...

Ладно, ладноsm.gif
Сделал вариант с виртуальным exec().
В процессе работы обратил внимание, что TKernelAgent::cur_proc() - private. Мне непонятно такое недоверие к потомкам TKernelAgent:)
Пришлось выкручиваться так:
Код
TBaseProcess* base = const_cast<TBaseProcess*>(get_proc(cur_proc_priority()));

вместо тривиального
Код
TBaseProcess* base = cur_proc();


Обратил внимание, что gcc довольно своеобразно понимает атрибут noreturn. Он перестаёт восстанавливать испорченные регистры, но всё равно сохраняет их! sm.gif
За счёт этого, кстати, вариант с виртуальным exec не проигрывает по стеку варианту с вызовом Slon.exec() из SlonProc::exec().
Хотя нет, всё равно проигрывает. Там же вызов через виртуальный транк...

В общем, вот, смотрите/критикуйте:
CODE
#ifndef VIRTUALPROCESS_H_
#define VIRTUALPROCESS_H_

#include <scmRTOS.h>

namespace OS
{

class BaseVirtualProcess : public TBaseProcess, public TKernelAgent
{
public:
INLINE_PROCESS_CTOR BaseVirtualProcess(
stack_item_t * StackPoolEnd
, TPriority pr
#if scmRTOS_DEBUG_ENABLE == 1
, stack_item_t * aStackPool
#endif
) : TBaseProcess(
StackPoolEnd
, pr
, launch_exec
#if scmRTOS_DEBUG_ENABLE == 1
, aStackPool
#endif
)
{
}
protected:
OS_PROCESS virtual void exec() { for(;;){} };
private:
OS_PROCESS static void launch_exec()
{
for(;;) // eliminate compiler warning
{
TBaseProcess* base = const_cast<TBaseProcess*>(get_proc(cur_proc_priority()));
// TBaseProcess* base = cur_proc(); // private!
BaseVirtualProcess* proc = static_cast<BaseVirtualProcess*>(base);
proc->exec();
}
}
};


template<TPriority pr, size_t stack_size>
class VirtualProcess : public BaseVirtualProcess
{
public:
INLINE_PROCESS_CTOR VirtualProcess()
: BaseVirtualProcess(&Stack[stack_size/sizeof(stack_item_t)]
, pr
#if scmRTOS_DEBUG_ENABLE == 1
, Stack
#endif
)
{
}
private:
stack_item_t Stack[stack_size/sizeof(stack_item_t)];
};

} // namespace OS


#endif /* VIRTUALPROCESS_H_ */


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ArtDenis   Альтернативный вариант задания функции процесса   Nov 10 2012, 13:36
- - AHTOXA   Цитата(ArtDenis @ Nov 10 2012, 19:36) Что...   Nov 10 2012, 15:59
- - ArtDenis   AHTOXA, по идее вообще никак не должно влиять на б...   Nov 10 2012, 16:10
|- - AHTOXA   Ну что я могу сказать... Мне очень понравилось. Эт...   Nov 10 2012, 16:31
- - dxp   QUOTE (ArtDenis @ Nov 10 2012, 20:36) Нео...   Nov 11 2012, 03:21
|- - ArtDenis   Цитата(dxp @ Nov 11 2012, 09:21) Откуда в...   Nov 11 2012, 05:00
|- - AHTOXA   Цитата(dxp @ Nov 11 2012, 09:21) Уже обсу...   Nov 11 2012, 06:07
- - dxp   QUOTE (ArtDenis @ Nov 11 2012, 12:00) А к...   Nov 11 2012, 12:02
|- - ArtDenis   Цитата(dxp @ Nov 11 2012, 18:02) Я не зна...   Nov 11 2012, 12:43
|- - dxp   QUOTE (ArtDenis @ Nov 11 2012, 19:43) Я с...   Nov 11 2012, 13:00
- - AHTOXA   Цитата(dxp @ Nov 11 2012, 19:00) Помещать...   Nov 11 2012, 16:00
|- - AHTOXA   Йоу! Я придумал, как совместить эти два вариан...   Nov 11 2012, 19:15
||- - ArtDenis   Цитата(AHTOXA @ Nov 12 2012, 01:15) Йоу...   Nov 12 2012, 02:41
||- - Сергей Борщ   QUOTE (AHTOXA @ Nov 11 2012, 21:15) Я при...   Nov 12 2012, 07:13
||- - AHTOXA   Цитата(Сергей Борщ @ Nov 12 2012, 13:13) ...   Nov 12 2012, 07:48
|||- - Сергей Борщ   QUOTE (AHTOXA @ Nov 12 2012, 09:48) Не по...   Nov 12 2012, 07:56
|||- - AHTOXA   А может мои пламенные речи уже переубедили его?   Nov 12 2012, 10:25
||- - ArtDenis   Цитата(Сергей Борщ @ Nov 12 2012, 13:13) ...   Nov 12 2012, 15:08
|- - ReAl   Цитата(ArtDenis @ Nov 11 2012, 07:00) Лич...   Nov 11 2012, 20:07
- - dxp   QUOTE (AHTOXA @ Nov 11 2012, 23:00) Вообщ...   Nov 13 2012, 06:20
|- - AHTOXA   Цитата(dxp @ Nov 13 2012, 12:20) В общем,...   Nov 13 2012, 14:06
|- - ArtDenis   Цитата(dxp @ Nov 13 2012, 12:20) Ни разу ...   Nov 13 2012, 15:59
- - ReAl   Цитата(Сергей Борщ @ Nov 12 2012, 09:13) ...   Nov 13 2012, 15:31
|- - Сергей Борщ   QUOTE (ReAl @ Nov 13 2012, 17:31) А как и...   Nov 13 2012, 16:34
- - dxp   QUOTE (AHTOXA @ Nov 13 2012, 21:06) Прове...   Nov 13 2012, 16:52
|- - AHTOXA   Ладно, раз уж у Гарри такая идиосинкразия к этому ...   Nov 13 2012, 17:04
|- - ReAl   Цитата(dxp @ Nov 13 2012, 18:52) Отождест...   Nov 13 2012, 18:44
|- - ArtDenis   Цитата(dxp @ Nov 13 2012, 22:52) Вы путае...   Nov 14 2012, 03:33
|- - ReAl   Цитата(ArtDenis @ Nov 14 2012, 05:33) В о...   Nov 14 2012, 13:45
|- - ArtDenis   Цитата(ReAl @ Nov 14 2012, 19:45) Ну да. ...   Nov 14 2012, 14:00
|- - ReAl   Цитата(ArtDenis @ Nov 14 2012, 16:00) voi...   Nov 14 2012, 15:01
|- - ArtDenis   Цитата(ReAl @ Nov 14 2012, 21:01) -Wredun...   Nov 14 2012, 15:21
- - dxp   QUOTE (AHTOXA @ Nov 14 2012, 00:04) Ладно...   Nov 14 2012, 01:17
|- - Сергей Борщ   QUOTE (dxp @ Nov 14 2012, 03:17) Почему т...   Nov 14 2012, 07:29
||- - Сергей Борщ   QUOTE (Сергей Борщ @ Nov 14 2012, 09:29) ...   Nov 14 2012, 08:46
||- - AHTOXA   Давайте я сюда добавлю ссылки на уже придуманные в...   Nov 14 2012, 09:17
||- - Сергей Борщ   QUOTE (AHTOXA @ Nov 14 2012, 11:17) вот в...   Nov 14 2012, 11:25
||- - AHTOXA   Я вот что подумал. В момент вызова TBaseProcess::i...   Nov 15 2012, 19:49
|- - AHTOXA   Цитата(dxp @ Nov 14 2012, 07:17) Э-э, мы,...   Nov 14 2012, 07:47
- - dxp   QUOTE (Сергей Борщ @ Nov 14 2012, 15:46) ...   Nov 14 2012, 11:57
|- - ReAl   Цитата(dxp @ Nov 14 2012, 13:57) Кстати, ...   Nov 14 2012, 12:51
- - ArtDenis   Всё-таки расставлю точки над i по поводу текущего ...   Nov 14 2012, 13:43
- - ReAl   Не надо адрес функции-члена... Слова C++ extension...   Nov 15 2012, 20:19
- - ArtDenis   AHTOXA, Указатель на нестатическую функцию член кл...   Nov 16 2012, 03:41
|- - AHTOXA   Я так понимаю, никто не впечатлился? Да, это оч...   Nov 17 2012, 20:10
- - Vasya777   Предлагаю другой вариант Пользовательские классы ...   Mar 20 2013, 16:59


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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 15:12
Рейтинг@Mail.ru


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