|
Альтернативный вариант задания функции процесса |
|
|
|
Nov 10 2012, 13:36
|
Частый гость
 
Группа: Участник
Сообщений: 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 <> вызывает некоторое удивление Подумалось, почему-бы не сделать ф-цию exec просто ф-цией своего собственного класса? На скорую руку сделал несколько изменений в исходниках scmRTOS и весь код декларации и реализации процесса превратился в: Код class TProc1 : public OS::process<TProc1, OS::pr0, 300> { public: static void exec() { for(;;) { ef.wait(); PB0.Off(); } } }; Что мы в итоге имеем? 1) Класс, в котором можно инкапсулировать данные и методы процесса. Закрытые и используемые только в TProc1 данные можно объявить в секции private класса и никто к ним не получит доступ. 2) Более привычный способ реализации ф-ции. Кто что думает на этот счёт?
--------------------
|
|
|
|
|
 |
Ответов
|
Nov 13 2012, 16:52
|

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

|
QUOTE (AHTOXA @ Nov 13 2012, 21:06)  Проверил. Предложенный вариант даёт полностью, до байта совпадающий бинарный файл прошивки. Но я его на всякий случай прогнал в железе. Работает!  Молодец! 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() { ... А этот код - это определение полной (а не объявление явной) специализации функции. Т.ч. всё в порядке, ничего компилироваться не перестанет, пусть там копиляторы хоть подтянутся, хоть отожмутся.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Nov 14 2012, 03:33
|
Частый гость
 
Группа: Участник
Сообщений: 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. Там есть спецы, знающие стандарт наизусть
--------------------
|
|
|
|
|
Nov 14 2012, 13:45
|

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

|
Цитата(ArtDenis @ Nov 14 2012, 05:33)  В общем, задал вопрос на RSDN: http://www.rsdn.ru/forum/cpp/4963144.all. Там есть спецы, знающие стандарт наизусть  Ну да. Только конкретно у gcc где-то нелады и вышло, что Код namespace OS { template<> TProc1::exec(); }
template<> TProc1::exec() { ... } он всё компилирует нормально, но выдаёт предупреждение redundant redeclaration и как предыдущее объявление тычет носом в OS_Kernel.h, в объявление неспециализированной функции в теле Код template<TPriority pr, size_t stack_size> class process : public TBaseProcess { public: INLINE_PROCESS_CTOR process();
OS_PROCESS static void exec(); // <---- вот сюда Но при этом просто Код template<> TProc1::exec() { ... } не собирает, тут ему уже того объявления недостаточно. Вот и вышло, что минимальной кровью так, определение-объявление одним махом: Код namespace OS { template<> TProc1::exec() { ... } } что тоже допускается.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 14 2012, 14:00
|
Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318

|
Цитата(ReAl @ Nov 14 2012, 19:45)  Ну да. Только конкретно у gcc где-то нелады и вышло, что Код namespace OS { template<> TProc1::exec(); }
template<> TProc1::exec() { ... } void потерялся. Поэтому и предупреждение вышло. Тот пример, что я выкладывал сообщением выше компилируется без предупреждений.
--------------------
|
|
|
|
|
Nov 14 2012, 15:01
|

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

|
Цитата(ArtDenis @ Nov 14 2012, 16:00)  void потерялся. Поэтому и предупреждение вышло. Ой, ну это я тут из головы забыл, в тексте void есть. И без него совершенно другая ругань Код namespace OS { template<> TProc1::exec(); // Строка 161 }
template<> TProc1::exec() // Строка 164 { DRIVER(PROC1,OUT); DRIVER(TIMER1_TO_PROC1,OUT); for(;;) { OFF(PROC1); Timer1_Ovf.wait(); ON(PROC1); OFF(TIMER1_TO_PROC1); } } // TProc1::exec() Код ==== Compiling ./src/main.cpp ./src/main.cpp:161:29: error: expected constructor, destructor, or type conversion before ‘;’ token ./src/main.cpp:164:25: error: ISO C++ forbids declaration of ‘exec’ with no type ./src/main.cpp:164:12: error: template-id ‘exec<>’ for ‘int OS::process<(OS::TPriority)0u, 100u>::exec()’ does not match any template declaration Цитата(ArtDenis @ Nov 14 2012, 16:00)  Тот пример, что я выкладывал сообщением выше компилируется без предупреждений. -Wredundant-decls есть? С ним и с -Wredundant-decls Код namespace OS { template<> void TProc1::exec(); // Строка 161 }
template<> void TProc1::exec() // Строка 164 { DRIVER(PROC1,OUT); DRIVER(TIMER1_TO_PROC1,OUT); for(;;) { OFF(PROC1); Timer1_Ovf.wait(); ON(PROC1); OFF(TIMER1_TO_PROC1); } } // TProc1::exec() Код ==== Compiling ./src/main.cpp ./src/main.cpp:161:33: warning: redundant redeclaration of ‘static void OS::process<pr, stack_size>::exec() [with OS::TPriority pr = (OS::TPriority)0u, unsigned int stack_size = 100u]’ in same scope ../scmRTOS/Common/OS_Kernel.h:333:36: warning: previous declaration of ‘static void OS::process<pr, stack_size>::exec() [with OS::TPriority pr = (OS::TPriority)0u, unsigned int stack_size = 100u]’
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
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     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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|