From: gosha <gosha@elins.ru> To: devel-ports@lists.altlinux.org Subject: [devel-ports] rtai & linux, как все должно работать? Date: Mon, 1 Sep 2008 13:23:53 +0000 Message-ID: <200809011323.53634.gosha@elins.ru> (raw) Добрый день. Возникла необходимость написать поддержку зеленоградской процессорки (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.
reply other threads:[~2008-09-01 13:23 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=200809011323.53634.gosha@elins.ru \ --to=gosha@elins.ru \ --cc=devel-ports@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
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