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

 
 
18 страниц V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> Начало работы with scmRTOS, Несколько вопросиков
dxp
сообщение Mar 31 2010, 11:37
Сообщение #121


Adept
******

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



Цитата(Сергей Борщ @ Mar 31 2010, 16:27) *
а) расход процессорного времени по процессам

В чем измерять? В тиках системного таймера?

Цитата(AHTOXA @ Mar 31 2010, 16:40) *
Канал вообще не нужен, имхо. Нужны функции для получения требуемых данных, типа
TBaseProcess.GetFreeStack(), TBaseProcess.GetTimes()... етц. А уж как их вызовет пользователь - его дело.

Да, пожалуй надо только сами внутренние средства приделать и интерфейс к ним, а там уж видно будет, как лучше. Можно хоть по отдельности юзать, хоть какой-нить класс монитора написать и подключать к любому доступному каналу.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 31 2010, 11:54
Сообщение #122


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dxp @ Mar 31 2010, 13:37) *
В чем измерять? В тиках системного таймера?
Возможно. Как вариант - что-то поточнее. Вплоть до тиков таймера, на прерывании которого висит системный таймер. Ибо частенько процесс работает меньше тика системного таймера. Пользователя чаще интересует отношение загрузки между процессами, поэтому размерность не важна.
Самый простой вариант (применялся на моей предыдущей работе в другой операционке) - в прерывании системного таймера инкрементируется счетчик в активном процессе. Раз в несколько сотен прерываний накопленные значения переносятся в результат, счетчики обнуляются. Такой подход не учитывает время, потраченное на прерывания. Для его учета надо вклиниваться в точку переключения процессов и обертку прерываний.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 31 2010, 13:41
Сообщение #123


Adept
******

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



Цитата(Сергей Борщ @ Mar 31 2010, 18:54) *
Самый простой вариант (применялся на моей предыдущей работе в другой операционке) - в прерывании системного таймера инкрементируется счетчик в активном процессе.

Если какой-то процесс работает малое количество времени, то он вообще может не пересекаться с прерыванием системного таймера, и тогда он будет вообще казаться полностью неактивным. Наверное правильнее всего делать отсечки при переключении контекста - прямо в тактах, которыми тактируется системный таймер (реализация должна быть простой - через считывание значения таймера. Хотя тут есть трудности на некоторых платформах - например, у MSP430 системным таймером удобно взять сторожевого барбоса, а из него значения взять, насколько помню, нельзя sad.gif ). Для каждой платформы тут должна быть своя функция (в порте), которая возвращает количество тактов (не тиков) частоты, тактирующей системный таймер. Иначе, имхо, смысла мало в таком сервисе.

Еще, наверное, имеет смысл ввести счетчик переключения контекста в каждом процессе - тоже интересно посмотреть, с какой частотой щелкает процесс. Иногда такое может помочь выловить нефатальные косяки в программе (например, если процесс переключается слишком часто по сравнению с тем, как должно быть по замыслу).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 31 2010, 14:47
Сообщение #124


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

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



Цитата(dxp @ Mar 31 2010, 19:41) *
Если какой-то процесс работает малое количество времени, то он вообще может не пересекаться с прерыванием системного таймера, и тогда он будет вообще казаться полностью неактивным.

Ну и пусть себе кажется неактивным, счётчик переключений контекста процесса покажет, что это не так. Тут, имхо, важно не переборщить. Размер стека нужно вычислять точно. А количество процессорного времени - всё равно получится приблизительным. Хотя, если в порте доставать тики таймера не накладно, то можно и их конечноsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
a9d
сообщение Mar 11 2011, 20:16
Сообщение #125


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



А можно как нибудь код процессов разнести по разным файлам?
У меня файл main.cpp на APM раздулся нешуточно. Уже надоедает его по полчаса листать в поисках процесса.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 11 2011, 20:36
Сообщение #126


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

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



А что мешает? sm.gif
Например, выносим процесс TProc1:
Создаём файл proc1.h:
Код
#ifndef PROC1_H_INCLUDED
#define PROC1_H_INCLUDED
#include <scmRTOS.h>

typedef OS::process<OS::pr3, 1200> TProc1;

extern TProc1 Proc1;

#endif // PROC1_H_INCLUDED


И затем proc1.cpp:
Код
#include "proc1.h"

namespace OS
{
    template <>
    OS_PROCESS void TProc1::Exec()
    {
        for (;;)
        {
            Sleep(100)
        }
    }
}
TProc1 Proc1;

Везде, где надо обращаться к Proc1 - пишем сначала
#include "proc1.h"

Или же, чтобы не запутаться в приоритетах, вынести все объявления процессов в один файл, типа procs.h:
Код
#ifndef PROCS_H_INCLUDED
#define PROCS_H_INCLUDED
#include <scmRTOS.h>

typedef OS::process<OS::pr0, 1200> TProc0;
typedef OS::process<OS::pr1, 1200> TProc1;
typedef OS::process<OS::pr2, 1200> TProc2;

extern TProc0 Proc0;
extern TProc1 Proc1;
extern TProc2 Proc2;

#endif // PROCS_H_INCLUDED


Как-то так.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
a9d
сообщение Mar 11 2011, 21:10
Сообщение #127


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Спасибо. То, что доктор прописал.

Я пробовал разнести по разным файлам, но у меня компилятор вечно матерился.

ЗЫ: Закоментил в main.cpp namespace OS и все процессы. Вместо этого вставил инклуд #include "process/process.h".

В #include "process/process.h" описания процессов. И дальше в каждом отдельном файле код процесса.
Все компилится но компилятор никак не реагирует на ошибки в коде процесса и не включает этот код в прошивку. Т.е он собирает прошивку без процессов.

Сообщение отредактировал a9d - Mar 11 2011, 21:17
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 12 2011, 06:06
Сообщение #128


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

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



Ну, эта проблема уже не связана scmRTOS. Нужно добавить новые *.cpp файлы к проекту, то есть указать компилятору, что их надо тоже компилировать. Способ зависит от компилятора (и IDE).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
yuragv
сообщение Mar 12 2011, 10:48
Сообщение #129


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616



Подскажите пожалуйста:

Исходные данные. Ядро CortexM3.
scmRTOS_CONTEXT_SWITCH_SCHEME 1

Как передать управление другому процессу без использования SetSleep ?
Получается что процесс с высоким приоритетом не отдает управление
процессу с низким приоритетом.

Вставка SchedISR() в обработчик сис. таймера не помогает.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 12 2011, 13:14
Сообщение #130


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (yuragv @ Mar 12 2011, 12:48) *
Получается что процесс с высоким приоритетом не отдает управление
процессу с низким приоритетом.
И правильно. На то у него и более высокий приоритет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
yuragv
сообщение Mar 12 2011, 13:31
Сообщение #131


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616



ну я в принципе разобрался.
можно в самом низкоприоритетном процессе не отдавать управление.
высокоприоритетные заберут сами. только в них надо ставить время ожидание не меньше 2 тиков.
а то не перепадет низкоприоритетному ничего.

жалко что нельзя два и более процесса сделать с одинаковым приоритетом.
Хотелось бы писать допустим чисто интерфейсные процессы, не думая где отдавать управление
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 14 2011, 06:35
Сообщение #132


Adept
******

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



Цитата(yuragv @ Mar 12 2011, 19:31) *
жалко что нельзя два и более процесса сделать с одинаковым приоритетом.
Хотелось бы писать допустим чисто интерфейсные процессы, не думая где отдавать управление

При использовании вытесняющей ОС нужно программу строить как управляемую по событиям (event-driven). И интерфейсные процессы отлично ложатся под эту идеологию.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 14 2011, 11:44
Сообщение #133


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(yuragv @ Mar 12 2011, 15:31) *
... не думая где отдавать управление

В привычке думать, где отдавать управление, чувствуется опыт работы с кооперативными ОС.
Ломайте привычки, меняйте идеологию.
Go to the top of the page
 
+Quote Post
a9d
сообщение Mar 18 2011, 08:44
Сообщение #134


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



У меня состоит задача в том, чтобы по запросу возвращать самые актуальные данные. У меня два процесса один постоянно опрашивает датчики, обрабатывает показания записывает их в структуру и отсылает меседж. Второй процесс опрашивает трансивер и если пришел запрос, то проверяет is_non_empty() меседжа, и если там что-то есть, то отправляет данные.

1) Это нормально многократно перезаписывать сообщение не получая его?
2) Процесс может отправить сам себе сообщение? Иногда такое, тоже требуется.
3) Используя is_non_empty(), нужно ли потом вручную вызывать reset()?
4) При использовании wait() флаг наличия сообщения сбрасывается сам?
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 18 2011, 14:59
Сообщение #135


Adept
******

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



Цитата(a9d @ Mar 18 2011, 14:44) *
1) Это нормально многократно перезаписывать сообщение не получая его?

Можно, только прежние тела сообщения будут затёрты. Насколько это вас устраивает, я не знаю.

Цитата(a9d @ Mar 18 2011, 14:44) *
2) Процесс может отправить сам себе сообщение? Иногда такое, тоже требуется.

А зачем? Ведь тут никакой асинхронщины нет. И когда процесс отправляет сообщение, он не может его ждать. Проще и дешевле (в смысле накладных) передавать информацию локально, синхронизируя через локальный флажок.

Цитата(a9d @ Mar 18 2011, 14:44) *
3) Используя is_non_empty(), нужно ли потом вручную вызывать reset()?

Можно. Почему нельзя?

Цитата(a9d @ Mar 18 2011, 14:44) *
4) При использовании wait() флаг наличия сообщения сбрасывается сам?

А в исходник посмотреть? sm.gif
Если на момент посылки уже были ожидающие процессы, то флаг наличия и не будет установлен, ибо незачем.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

18 страниц V  « < 7 8 9 10 11 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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