|
|
  |
Начало работы with scmRTOS, Несколько вопросиков |
|
|
|
Mar 31 2010, 11:37
|

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

|
Цитата(Сергей Борщ @ Mar 31 2010, 16:27)  а) расход процессорного времени по процессам В чем измерять? В тиках системного таймера? Цитата(AHTOXA @ Mar 31 2010, 16:40)  Канал вообще не нужен, имхо. Нужны функции для получения требуемых данных, типа TBaseProcess.GetFreeStack(), TBaseProcess.GetTimes()... етц. А уж как их вызовет пользователь - его дело. Да, пожалуй надо только сами внутренние средства приделать и интерфейс к ним, а там уж видно будет, как лучше. Можно хоть по отдельности юзать, хоть какой-нить класс монитора написать и подключать к любому доступному каналу.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 31 2010, 11:54
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 31 2010, 13:41
|

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

|
Цитата(Сергей Борщ @ Mar 31 2010, 18:54)  Самый простой вариант (применялся на моей предыдущей работе в другой операционке) - в прерывании системного таймера инкрементируется счетчик в активном процессе. Если какой-то процесс работает малое количество времени, то он вообще может не пересекаться с прерыванием системного таймера, и тогда он будет вообще казаться полностью неактивным. Наверное правильнее всего делать отсечки при переключении контекста - прямо в тактах, которыми тактируется системный таймер (реализация должна быть простой - через считывание значения таймера. Хотя тут есть трудности на некоторых платформах - например, у MSP430 системным таймером удобно взять сторожевого барбоса, а из него значения взять, насколько помню, нельзя  ). Для каждой платформы тут должна быть своя функция (в порте), которая возвращает количество тактов (не тиков) частоты, тактирующей системный таймер. Иначе, имхо, смысла мало в таком сервисе. Еще, наверное, имеет смысл ввести счетчик переключения контекста в каждом процессе - тоже интересно посмотреть, с какой частотой щелкает процесс. Иногда такое может помочь выловить нефатальные косяки в программе (например, если процесс переключается слишком часто по сравнению с тем, как должно быть по замыслу).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 31 2010, 14:47
|

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

|
Цитата(dxp @ Mar 31 2010, 19:41)  Если какой-то процесс работает малое количество времени, то он вообще может не пересекаться с прерыванием системного таймера, и тогда он будет вообще казаться полностью неактивным. Ну и пусть себе кажется неактивным, счётчик переключений контекста процесса покажет, что это не так. Тут, имхо, важно не переборщить. Размер стека нужно вычислять точно. А количество процессорного времени - всё равно получится приблизительным. Хотя, если в порте доставать тики таймера не накладно, то можно и их конечно
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 11 2011, 20:36
|

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

|
А что мешает?  Например, выносим процесс 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 Как-то так.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 12 2011, 10:48
|
Участник

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

|
Подскажите пожалуйста:
Исходные данные. Ядро CortexM3. scmRTOS_CONTEXT_SWITCH_SCHEME 1
Как передать управление другому процессу без использования SetSleep ? Получается что процесс с высоким приоритетом не отдает управление процессу с низким приоритетом.
Вставка SchedISR() в обработчик сис. таймера не помогает.
|
|
|
|
|
Mar 12 2011, 13:31
|
Участник

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

|
ну я в принципе разобрался. можно в самом низкоприоритетном процессе не отдавать управление. высокоприоритетные заберут сами. только в них надо ставить время ожидание не меньше 2 тиков. а то не перепадет низкоприоритетному ничего.
жалко что нельзя два и более процесса сделать с одинаковым приоритетом. Хотелось бы писать допустим чисто интерфейсные процессы, не думая где отдавать управление
|
|
|
|
|
Mar 18 2011, 14:59
|

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() флаг наличия сообщения сбрасывается сам? А в исходник посмотреть?  Если на момент посылки уже были ожидающие процессы, то флаг наличия и не будет установлен, ибо незачем.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|