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

 
 
> Альтернативный вариант задания функции процесса
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
Ответов
dxp
сообщение Nov 13 2012, 16:52
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (AHTOXA @ Nov 13 2012, 21:06) *
Проверил.
Предложенный вариант даёт полностью, до байта совпадающий бинарный файл прошивки. Но я его на всякий случай прогнал в железе. Работает! sm.gif

Молодец!

QUOTE (ReAl @ Nov 13 2012, 22:31) *
А этого (регулировки уровня доступа) мало?

Конечно мало. Тут речь про инкапсуляцию ведут, а оная подразумевает наличие законченного целостного объекта. Но на деле никакого объекта и в помине нет, а есть сборная солянка из статических членов, засунутых в общее пространство имён. Т.е. ни абстракции, ни отделения интерфейса от реализации (т.к. и интерфейса-то никакого нет) - ничего этого нет. За что боремся?

QUOTE (ReAl @ Nov 13 2012, 22:31) *
Все процессы существуют в единственном экземпляре, поэтому статическая exec() не пугает.

Пугать-то не пугает, но и ничего этот подход не даёт.

QUOTE (ReAl @ Nov 13 2012, 22:31) *
Этот вот TSlon::exec() перестал быть функцией процесса. Потерял доступ к protected в TBaseProcess. Их там (пока) и немного, но тут уже «страдает чувство прекрасного» у меня.

А зачем ему этот доступ? Всё, что предназначено для доступа с уровня пользовательской программы, помещено в public секцию, остальное - для внутренних служебных целей. Поэтому разрешение доступа юзеру к этому представлению - это никакое не благо, а дырка в защите. Если там есть что-то, к чему надо дать доступ на уровне прикладного кода, это надо поместить в открытую секцию.

QUOTE (ReAl @ Nov 13 2012, 22:31) *
По поводу сущностей: «предоставлять функцию процесса» -- это задача базового класса процесса.

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

QUOTE (ReAl @ Nov 13 2012, 22:31) *
И если про что-то в системе я думаю «это -- процесс», то мне естественно думать «занчит, оно должно біть потомком базового класса процесса».

Это почему это? Процесс - это транспорт, который выполняет "транспортную" функцию. А уж чем его загрузишь, то он и повезёт. Отождествлять грузовик с перевозимым грузом, является, имхо, не очень удачной идеей.

QUOTE (ReAl @ Nov 13 2012, 22:31) *
Ну так вот сижу я и думаю
«так, мне нужен процесс обслуживания индикации»
«другие будут дергать этот процесс такой-то функцией, которая будет помещать запросы в очередь»
«ага, у процесса должна быть очередь»

А если этот процесс не только обслуживает индикацию, но и, например, клавиатуру опрашивает? Что мешает на одном "автобусе" катать и пионеров, и бабушек? По моему опыту, как раз-таки, нередко один процесс обслуживает более, чем одну сущность.


QUOTE (ArtDenis @ Nov 13 2012, 22:59) *
Это совершенно неверно. Согласно стандарту языка С++, специализация шаблонной функции должно быть выполнено только в том пространстве имён где был объявлен шаблон. То, что некоторые компиляторы допускают иную трактовку, является их ошибкой.
Вот выдержка из стандарта (14.7.3/1):

Вы путаете declaration (объявление) и definition (определение). Также вы путате явную (explicit) специализацию и полную (full) специализацию. Приведённый вами пункт стандарта гласит о том, что если используется явная специализация, то она должна быть объявлена в том же простанстве имён. Но где там сказано, что на должна быть определена в этом пространстве имён? У нас там нигде явной специализации не объявляется.

QUOTE (ArtDenis @ Nov 13 2012, 22:59) *
В любом случае компиляторы подтянуться к стандарту, код перестанет компилироваться и придётся писать
CODE
namespace OS
{
    template <>
    OS_PROCESS void TProc1::exec()
    {
        ...

А этот код - это определение полной (а не объявление явной) специализации функции. Т.ч. всё в порядке, ничего компилироваться не перестанет, пусть там копиляторы хоть подтянутся, хоть отожмутся.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Nov 14 2012, 03:33
Сообщение #3


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

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



Цитата(dxp @ Nov 13 2012, 22:52) *
Вы путаете declaration (объявление) и definition (определение). Также вы путате явную (explicit) специализацию и полную (full) специализацию. Приведённый вами пункт стандарта гласит о том, что если используется явная специализация, то она должна быть объявлена в том же простанстве имён. Но где там сказано, что на должна быть определена в этом пространстве имён? У нас там нигде явной специализации не объявляется.
На самом деле на этот пункт стандарта я вышел погуглив сообщение об ошибке. К сожалению, из той цитаты, что я привёл, действительно не ясно насчёт определения ф-ции.
В общем, задал вопрос на RSDN: http://www.rsdn.ru/forum/cpp/4963144.all. Там есть спецы, знающие стандарт наизусть sm.gif


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
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
|- - AHTOXA   Ладно, раз уж у Гарри такая идиосинкразия к этому ...   Nov 13 2012, 17:04
|- - ReAl   Цитата(dxp @ Nov 13 2012, 18:52) Отождест...   Nov 13 2012, 18:44
|- - 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   Цитата(ArtDenis @ Nov 16 2012, 09:41) AHT...   Nov 16 2012, 19:41
|- - AHTOXA   Я так понимаю, никто не впечатлился? Да, это оч...   Nov 17 2012, 20:10
- - Vasya777   Предлагаю другой вариант Пользовательские классы ...   Mar 20 2013, 16:59


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:17
Рейтинг@Mail.ru


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