Цитата(yes @ Mar 4 2008, 22:14)

есть вопрос по С++ применительно к scmRTOS:
как правильнее вызывать Sleep из некоторой иерархии сишных функций внутри проекта?
TProc1::Exec() -> foo() -> boo() -> moo()
и внутри moo() я хочу передать управление
могу написать
TProc1::Sleep(10);
или
Proc1.Sleep(3);
как правильнее? я что-то смутно помню про статические члены и т.п. но С++ не настолько мне родной язык, чтобы такие тонкости различать

Сергей Борщ правильно ответил. На эту тему есть замечание, что приходится так длинно писать из вложенных функций, поэтому в дальнейшем будет предложен более короткий вариант.
Цитата(yes @ Mar 4 2008, 22:14)

видимо я понял "танцы с бубном" для прерываний BF - при сохранении контекста [--sp] = reti; разрешаются вложенные прерывания (GLBLDIS в IPEND очищается)
поэтому нужно замаскировать все прерывания выше 14
так?
вроде бы если изменить порядок регистров в контексте
[--sp] = r0;
r0=reti;
[--sp] = r0;
то прерывания разрешаться не будут
но с другой стороны - если работает существующий механизм, то лучше не трогать

Тут, пардон, не понял, что имелось в виду. Теперешний вариант, вроде, работает исправно.
Цитата(yes @ Mar 4 2008, 22:14)

ну и еще

чего мне нехватает в сервисах scmRTOS - это секции на запрет шедулера, то есть, чтоб прерывания были разрешены (критическая секция нехорошо из-за увеличения латенси обработчика прерывания)
может это можно сделать какими-то простыми юзерскими средствами (без изменения кода scmRTOS)?
Запрет перепланировки, наверное, разумная фукнция, иногда может понадобиться. Но, боюсь, что и там без критической секции не обойдется. Кроме того, критическая секция, обычно, небольшая - соизмерима с задержками перехода к обработчику прерывания и его прологу.
Цитата(yes @ Mar 4 2008, 22:14)

и наверно, "вращения приоритетов" тоже

дедлочится у меня код изредка... вроде стандартная конструкция - работало в VDSP и eCOS
С этим труднее - эта штука дается совсем небесплатно, тут придется заводить регистрацию сервисов и делать проход по ним каждый раз при инверсии приоритетов. Это будет длинный кусок кода в критической секции (что может не понравиться любителям быстрой реакции на прерывание) и дополнительные торомза и накладные расходы. Учитывая калибр обсуждаемой системы, может статься, что сама процедура инверсии приоритетов может оказаться толще и тяжелее, чем тот код, который надо пихнуть в высокоприроритетное выполнение.
Для достижения похожей функциональности можно применить один простой прием, я им пользуюсь (собираюсь написать типа апноты, как руки дойдут), правда, все больше для background задач. Идея простая и ее можно обозвать "делегирование выполнения кода": заводим процесс с низким (если background задачи) или высоким (если foreground) приоритетом. Заводим абстрактный класс типа:
Код
class TJob
{
public:
virtual void run() = 0;
};
от него заводим нужное количество конкретных классов-заданий:
Код
class TJob1 : public TJob { ... } Job1;
class TJob2 : public TJob { ... } Job2;
class TJob3 : public TJob { ... } Job3;
...
class TJobN : public TJob { ... } JobN;
в каждом из которых виртуальная фукнция run выполняет нужный для данного задания код.
Далее, заводим очередь:
Код
OS::channel<TJob*, M> Jobs;
где М - размер очереди, мне обычно хватает от 4 до 8.

Теперь в заведенном с нужным приоритетом процессе пишем такой код:
Код
OS_PROCESS void TBackGroundProc::Exec()
{
for(;;)
{
TJob *job;
Jobs.pop(job);
job->run();
}
}
А в процессе, где надо "делегировать" выполнение, пишем:
Код
TJob *job = &Job1; // или Job2/Job3.../JobN
Jobs.push(job);
Т.е. получается, что мы как бы перепоручаем (делегируем) выполнение кода другому процессу (с другим приоритетом). Причем, этот процесс ничего "не знает" про сам код, он просто его выполняет. Приоритет процесса определяет, фоновый это процесс или наоборот срочный.
Конечно, этот прием не заменяет полностью инверсию приоритетов, но в ряде случаев вполне решает задачу - например, обращение к совместно используемому ресурсу, чтобы оно не вызвало тормозов в приоритетом процессе из-за того, что менее приоритетный процесс вытеснил еще менее приоритетный, захвативший ресурс, можно выполнить через описаный Job, делегировав работу в высокоприоритетный процесс - так гарантируется максимально возможная скорость обращения к ресурсу и освобождение процессорного времени сразу по завершении. Любые процессы (или обработчики прерывний) могут кидать в очередь задания - те будут выполняться по мере возможности (в фоне) или сразу (в приоритетном процессе).
Писанины, кстати, имхо, тоже немного. И все безопасно и автоматизировано - на этапе компиляции все ошибки будут выловлены. Ну, лично мне кажется такой прием достаточно красивым, в духе С++.

Широко использую для запуска заданий в фоне.
P.S. Вспомнил, что именно этот подход реализован в примере, который идет с портом - про OS::channel. Реально работающий пример.