Anders Blomdell wrote: > Preetam Joshi wrote: >> ok, >> >> here is the code. >> The code essentially cerates two tasks low and high priority task. >> The low priority task has priority as 3 and high as 98 >> >> When i execute this initally everything goes smoothly as low priority >> task >> starts running with priority thread 3 , it sleeps so then the high >> priority >> thread runs with priority 98. But before the high priority thread >> finishes >> the for loop for 7 times the low priority thread prempts it and starts >> running with priority = 98. > Nope, you just don't read the state (using a global is also a bad idea). >
...and the code contains lots of "printf" which switches away from
Xenomai into Linux mode with the potential to screw up the schedule as
well. Don't use printf in RT code unless you can live with potential
priority inversion during its execution.
>>
>> This is what has baffled me?
>>
>> #include <stdio.h>
>> #include <unistd.h>
>> #include <sys/mman.h>
>> #include <native/task.h>
>> #include <native/timer.h>
>>
>> RT_TASK task1;
>> RT_TASK task2;
>> RT_TASK_INFO info;
>>
>> void low_task(void *arg)
>> {
> RT_TASK_INFO info;
>> rt_task_inquire(&task1, &info);
>> printf("Priority of low task %d\n", info.cprio);
>>
>> rt_task_sleep(3000000000);
>>
>> while(1)
>> {
> rt_task_inquire(&task1, &info);
>> printf("Priority of Low task %d\n",info.cprio);
>> }
>>
>> }
>>
>> void high_task(void *arg)
>> {
>> unsigned int i;
>> rt_task_inquire(&task2, &info);
>> printf("Priority of high task before sleep %d\n", info.cprio);
>> for(i=0;i<7;i++)
>> {
>>
>> printf("Priority of High Priotity task1 %d\n",info.cprio);
>> rt_task_sleep(1000000000);
>> }
>>
>> printf("High priority thread goin to sleep %d\n",info.cprio);
>> rt_task_sleep(3000000000);
>>
>> for(i=0;i<100;i++)
>> {
>> printf("Priority of High task2 %d\n",info.cprio);
>> }
>>
>> int main(int argc, char* argv[])
>> {
>> mlockall(MCL_CURRENT|MCL_FUTURE);
>>
>> rt_task_create(&task1, "Low Priority Task", 0, 3, 0);
>> rt_task_create(&task2, "High Priority Task", 0, 98, 0);
>>
>> rt_task_start(&task1, &low_task, NULL);
>> rt_task_start(&task2, &high_task, NULL);
>>
>> pause();
>>
>> rt_task_join(&task1);
>> rt_task_join(&task2);
>>
>> }
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On 2/15/07, Jan Kiszka <[EMAIL PROTECTED]> wrote:
>>>
>>> Preetam Joshi wrote:
>>> > Hi,
>>> >
>>> > Do u mean to say that if i have created my tasks using native xenomai
>>> API's
>>> > like rt_task_create , then inside those tasks i will have to use posix
>>> skin
>>> > calls like pthread_setschedpolicy, etc...?
>>> >
>>> > Is that so.
>>>
>>> Nope. If you picked the native skin API, all scheduler setup for a RT
>>> task should be done through that interface.
>>>
>>> >
>>> > Cant i just have context switch between the tasks themselves say low
>>> > priority and a high priority task created by rt_task_create.
>>> >
>>> > Reason being i have created two tasks using the rt_task_create API and
>>> my
>>> > high priority task is runnning and my low priority task has slept,
>>> so as
>>> > soon as my low priority task has expired its sleep time and gets ready
>>> to
>>> > run,
>>> >
>>> > The low priority task preempts my high priority task and even its
>>> priority
>>> > gets raised to that of the high priority task and starts executing.
>>> The
>>> > higgh priority task gets suspended altogether amidst its running.
>>> Simply
>>> > baffled by the behavior?
>>>
>>> If you have found a weird behaviour of Xenomai, please post some
>>> as-small-as-possible demo code that exposes the issue. We will have a
>>> look at it.
>>>
> Regards
>
> Anders
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Xenomai-help mailing list [email protected] https://mail.gna.org/listinfo/xenomai-help
