[LITMUS^RT] Problem with Litmus-RT plugin
Evgeniy Veretennikov
evg.veretennikov at gmail.com
Wed May 28 10:56:56 CEST 2014
I solved my problem after switching to the last LITMUS version.
Thanks for help.
Best regards,
Evgeniy Veretennikov
Student of the Moscow Aviation Institute
On 27.05.2014 17:50, Evgeniy Veretennikov wrote:
> On 27.05.2014 12:23, Andrea Bastoni wrote:
>> Hi Evgeniy,
>>
>> On Tue, May 27, 2014 at 9:33 AM, Evgeniy Veretennikov
>> <evg.veretennikov at gmail.com> wrote:
>>> Hello Andrea,
>>>
>>> I'm student of the Moscow Aviation Institute, and I develop
>>> Litmus-RT plugin
>>> which schedules processes like ARINC 653 scheduler schedules partitions
>>> (ARINC 653 is aviation standard). This is simple round-robin
>>> algorithm: each
>>> process has predefined runtime inside predefined period. My plugin
>>> is based
>>> on version 2012.2 as a demo plugin in this CreateAPluginTutorial:
>>> https://wiki.litmus-rt.org/litmus/CreateAPluginTutorial
>> Can I ask you why 2012.2 and not a more updated version?
> Of course. Only reason is that demo plugin is for 2012.2, so I thought
> it would be better to have simple working example.
>>
>>> My plugin's function arinc_schedule(struct task_struct*) just chooses
>>> task_struct* of process which should run now and returns this
>>> pointer. So, I
>>> can successfully start my plugin ($ setsched ARINC), but when I
>>> start some
>>> RT-process (for example, $ rtspin 10 100 10), Ubuntu GUI freezes and
>>> virtual
>>> machine with Litmus uses 100% of all CPUs. I think, I should change
>>> process
>>> state or some queues inside arinc_schedule() function, but I don't
>>> know what
>>> exactly to do. I saw some queue-management in demo plugin, but I
>>> don't know
>>> how to use process queues, because my algorithm is just round-robin,
>>> either
>>> array, not a queue.
>> The Litmus RT infrastructure allows you to define the logic to select
>> the next task to be run, but is integrated in the linux-scheduler
>> infrastructure.
>>
>> Although it should be relatively straightforward to define your own
>> scheduling policy (either ARINC o P-EDF, or G-EDF), you should make
>> sure you also understand the linux-scheduler infrastructure where
>> Litmus is "plugged-in".
>>
>> To implement an A653 policy, I'd suggest you to start with a P-FP
>> plugin, understand its implementation, and then hack-in the
>> modification required to support your specific need. The data
>> structure you use to manage your tasks (provided that you adequately
>> protect them) are your specific plugin implementation details.
> Ok, I had already tried to understood P-FP. Unfortunately, some
> details aren't clear for me. That's my skeleton of current schedule
> function's implementation:
>
> static struct task_struct *arinc_schedule(struct task_struct *prev)
> {
> struct task_struct *next = NULL;
> spin_lock_irqsave(...);
> /* here is schedule decision: next = some next task; do nothing
> with cpu state, process state, etc. */
> sched_state_task_picked();
> spin_unlock_irqrestore(...);
> return next;
> }
>
> But I can't start RT-processes with current code (see my previous
> letter). I think, I have to change process state, I tried this after
> schedule decision:
>
> set_rt_flags(prev, RT_F_SLEEP);
> set_rt_flags(next, RT_F_RUNNING);
>
> But problem wasn't solved. Maybe I need to manipulate with rt_param
> structure? All what I need is to sleep prev task and to run next task.
>
> Thanks for the quick reply.
>
> Best regards,
> Evgeniy Veretennikov
> Student of the Moscow Aviation Institute
More information about the litmus-dev
mailing list