* [devel-ports] rtai & linux, как все должно работать?
@ 2008-09-01 13:23 gosha
0 siblings, 0 replies; only message in thread
From: gosha @ 2008-09-01 13:23 UTC (permalink / raw)
To: devel-ports
Добрый день.
Возникла необходимость написать поддержку зеленоградской процессорки (MIPS процессор) для rtai.
Но, после анализа исходных текстов rtai, нет понимания, как все должно работать и как должны дружить шедулеры rtai & linux:
- rt_task_init() - Creates a new real time task. The newly created real time task is initially in a suspend state. It can be made active by calling: rt_task_make_periodic, rt_task_make_periodic_relative_ns, rt_task_resume.
- для однопроцессорной системы (по исходным тектам rtai) rt_schedule() выполняется по прерыванию от системного таймера.
код (во всю высоту: 75 строк)
Возникла необходимость написать поддержку зеленоградской процессорки (MIPS процессор) для rtai.
Но, после анализа исходных текстов rtai, нет понимания, как все должно работать и как должны дружить шедулеры rtai & linux:
- rt_task_init() - Creates a new real time task. The newly created real time task is initially in a suspend state. It can be made active by calling: rt_task_make_periodic, rt_task_make_periodic_relative_ns, rt_task_resume.
- для однопроцессорной системы (по исходным тектам rtai) rt_schedule() выполняется по прерыванию от системного таймера.
код (во всю высоту: 75 строк)
static void rt_timer_handler(void)
{
RT_TASK *task, *new_task;
RTIME now;
int prio, delay, preempt;
TRACE_RTAI_TIMER(TRACE_RTAI_EV_TIMER_HANDLE_EXPIRY, 0, 0);
sched_rqsted = 1;
DO_TIMER_PROPER_OP();
prio = RT_SCHED_LINUX_PRIORITY;
task = new_task = &rt_linux_task;
rt_times.tick_time = oneshot_timer ? rdtsc() : rt_times.intr_time;
rt_time_h = rt_times.tick_time + (RTIME)rt_half_tick;
if (rt_times.tick_time >= rt_times.linux_time) {
rt_times.linux_time += (RTIME)rt_times.linux_tick;
rt_pend_linux_irq(TIMER_8254_IRQ);
}
wake_up_timed_tasks(0);
RR_YIELD();
TASK_TO_SCHEDULE();
RR_SETYT();
if (oneshot_timer) {
rt_times.intr_time = rt_times.linux_time > rt_times.tick_time ?
rt_times.linux_time : rt_times.tick_time + (RTIME)rt_times.linux_tick;
RR_TPREMP();
task = &rt_linux_task;
while ((task = task->tnext) != &rt_linux_task) {
if (task->priority <= prio && task->resume_time < rt_times.intr_time) {
rt_times.intr_time = task->resume_time;
preempt = 1;
break;
}
}
if ((shot_fired = preempt)) {
delay = (int)(rt_times.intr_time - (now = rdtsc())) - tuned.latency;
if (delay >= tuned.setup_time_TIMER_CPUNIT) {
delay = imuldiv(delay, TIMER_FREQ, tuned.cpu_freq);
} else {
delay = tuned.setup_time_TIMER_UNIT;
rt_times.intr_time = now + (RTIME)tuned.setup_time_TIMER_CPUNIT;
}
rt_set_timer_delay(delay);
}
} else {
rt_times.intr_time += (RTIME)rt_times.periodic_tick;
rt_set_timer_delay(0);
}
if (new_task != rt_current) {
if (rt_current == &rt_linux_task) {
rt_switch_to_real_time(0);
save_cr0_and_clts(linux_cr0);
}
if (new_task->uses_fpu) {
enable_fpu();
if (new_task != fpu_task) {
save_fpenv(fpu_task->fpu_reg);
fpu_task = new_task;
restore_fpenv(fpu_task->fpu_reg);
}
}
TRACE_RTAI_SCHED_CHANGE(rt_current->tid, new_task->tid, rt_current->state);
KEXECTIME();
rt_switch_to(new_task);
if (rt_current->signal) {
(*rt_current->signal)();
}
}
}
- соотв понятно, что из этого обработчика выполняются все прерывания linux после отработки прерываний rtai (включая прерывания linux по таймеру).
====================================================================
Но непонятно с расписанием выполнения прикладных задач linux & rtai:
- как и где в исх тексте шедулера rtai отдается управления задачам linux (которым отдал бы управление шедулер linux, если бы не было rtai).
- как я понял, должны выполняться приложения rtai постоянно, а, если им не требуется cpu, cpu временно отдается приложениям linux?
- не понятно, где/как это упраление передается приложениям linux и возвращается обратно к приложениям rtai?
Спасибо
--
С Уваженим,
gosha.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2008-09-01 13:23 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-09-01 13:23 [devel-ports] rtai & linux, как все должно работать? gosha
ALT Linux architecture porting
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel-ports/0 devel-ports/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel-ports devel-ports/ http://lore.altlinux.org/devel-ports \
devel-ports@lists.altlinux.org devel-ports@lists.altlinux.ru devel-ports@lists.altlinux.com
public-inbox-index devel-ports
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel-ports
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git