librelist archives

« back to archive

Porting atomthread on Arduino Uno

Porting atomthread on Arduino Uno

From:
Ashwin Vasani
Date:
2012-09-07 @ 19:45
Hi All,
       I am new to embedded and have very little experience but I'm very
enthu abt it. Few days back I bought Arduino Uno with 32KB memory and 16Mhz.
Later I found atomthread multi threading RTOS kernel on Internet. By
changing some configuration port file for avr in the kernel I am able
to run main thread (Thanks for excellent documentation).
Even I have ported some cpp files from arduino to kernel and did some
changes in Makefile to run  LED blinking
code in thread context that that too worked :-). I am using default uart
port provided by atomthread and its working.
Even I am using printf for printing on serial port but I dont knw whether
should I use printf or prinf_P but it working.

Even I am able to create multiple threads and I can see all the prints in
those thread. But I am not able to use atomTimerDelay
in threadContex. Thread is going in hang state when I call this function.
Here do I need to do some time call to so ??
Even when thread contex is over then this thread is recreated or board is
re-booted. Is something wrong with scheduler or timer ??

-- 
With Regards,
Ashwin Vasani
+91 8446611430

Re: [atomthreads] Porting atomthread on Arduino Uno

From:
Kelvin Lawson
Date:
2012-09-10 @ 23:19
Hi Ashwin,

I would confirm that the timer interrupt is occurring. The timer ISR
is in atomport.c (TIMER1_COMPA_vect).

The timer interrupt is working on the ATmegas I have tested, and
indeed some of the automated tests would fail if it were not.

Thanks,
Kelvin.


>        I am new to embedded and have very little experience but I'm very
> enthu abt it. Few days back I bought Arduino Uno with 32KB memory and 16Mhz.
> Later I found atomthread multi threading RTOS kernel on Internet. By
> changing some configuration port file for avr in the kernel I am able
> to run main thread (Thanks for excellent documentation).
> Even I have ported some cpp files from arduino to kernel and did some
> changes in Makefile to run  LED blinking
> code in thread context that that too worked :-). I am using default uart
> port provided by atomthread and its working.
> Even I am using printf for printing on serial port but I dont knw whether
> should I use printf or prinf_P but it working.
>
> Even I am able to create multiple threads and I can see all the prints in
> those thread. But I am not able to use atomTimerDelay
> in threadContex. Thread is going in hang state when I call this function.
> Here do I need to do some time call to so ??
> Even when thread contex is over then this thread is recreated or board is
> re-booted. Is something wrong with scheduler or timer ??
>
> --
> With Regards,
> Ashwin Vasani
> +91 8446611430

Re: [atomthreads] Porting atomthread on Arduino Uno

From:
Ashwin Vasani
Date:
2012-09-11 @ 03:57
On Sep 11, 2012 4:50 AM, "Kelvin Lawson" <info@atomthreads.com> wrote:
>
> Hi Ashwin,
>
> I would confirm that the timer interrupt is occurring. The timer ISR
> is in atomport.c (TIMER1_COMPA_vect).
>
> The timer interrupt is working on the ATmegas I have tested, and
> indeed some of the automated tests would fail if it were not.

Thanks for the reply. Yes timer interrupts are occurring but by default
scheduler is not called. It works by calling scheduler in timer interrupt.
Thanks
AV

> Thanks,
> Kelvin.
>
>
> >        I am new to embedded and have very little experience but I'm very
> > enthu abt it. Few days back I bought Arduino Uno with 32KB memory and
16Mhz.
> > Later I found atomthread multi threading RTOS kernel on Internet. By
> > changing some configuration port file for avr in the kernel I am able
> > to run main thread (Thanks for excellent documentation).
> > Even I have ported some cpp files from arduino to kernel and did some
> > changes in Makefile to run  LED blinking
> > code in thread context that that too worked :-). I am using default uart
> > port provided by atomthread and its working.
> > Even I am using printf for printing on serial port but I dont knw
whether
> > should I use printf or prinf_P but it working.
> >
> > Even I am able to create multiple threads and I can see all the prints
in
> > those thread. But I am not able to use atomTimerDelay
> > in threadContex. Thread is going in hang state when I call this
function.
> > Here do I need to do some time call to so ??
> > Even when thread contex is over then this thread is recreated or board
is
> > re-booted. Is something wrong with scheduler or timer ??
> >
> > --
> > With Regards,
> > Ashwin Vasani
> > +91 8446611430

Re: [atomthreads] Porting atomthread on Arduino Uno

From:
Kelvin Lawson
Date:
2012-09-11 @ 10:49
Hi Ashwin,

>> I would confirm that the timer interrupt is occurring. The timer ISR
>> is in atomport.c (TIMER1_COMPA_vect).
>
> Thanks for the reply. Yes timer interrupts are occurring but by default
> scheduler is not called. It works by calling scheduler in timer interrupt.

If you replaced the standard Atomthreads timer ISR with an alternative
one that didn't call the scheduler then that makes sense.

Thanks,
Kelvin.


>> >        I am new to embedded and have very little experience but I'm very
>> > enthu abt it. Few days back I bought Arduino Uno with 32KB memory and
>> > 16Mhz.
>> > Later I found atomthread multi threading RTOS kernel on Internet. By
>> > changing some configuration port file for avr in the kernel I am able
>> > to run main thread (Thanks for excellent documentation).
>> > Even I have ported some cpp files from arduino to kernel and did some
>> > changes in Makefile to run  LED blinking
>> > code in thread context that that too worked :-). I am using default uart
>> > port provided by atomthread and its working.
>> > Even I am using printf for printing on serial port but I dont knw
>> > whether
>> > should I use printf or prinf_P but it working.
>> >
>> > Even I am able to create multiple threads and I can see all the prints
>> > in
>> > those thread. But I am not able to use atomTimerDelay
>> > in threadContex. Thread is going in hang state when I call this
>> > function.
>> > Here do I need to do some time call to so ??
>> > Even when thread contex is over then this thread is recreated or board
>> > is
>> > re-booted. Is something wrong with scheduler or timer ??
>> >
>> > --
>> > With Regards,
>> > Ashwin Vasani
>> > +91 8446611430

Re: [atomthreads] Porting atomthread on Arduino Uno

From:
Ashwin Vasani
Date:
2012-09-12 @ 19:48
On Tue, Sep 11, 2012 at 4:19 PM, Kelvin Lawson <info@atomthreads.com> wrote:

> Hi Ashwin,
>
> >> I would confirm that the timer interrupt is occurring. The timer ISR
> >> is in atomport.c (TIMER1_COMPA_vect).
> >
> > Thanks for the reply. Yes timer interrupts are occurring but by default
> > scheduler is not called. It works by calling scheduler in timer
> interrupt.
>
> If you replaced the standard Atomthreads timer ISR with an alternative
> one that didn't call the scheduler then that makes sense.
>
Actually I havn't replaced timer. Here is diff for working  case.

diff --git a/atomthreads/kernel/atomtimer.c b/atomthreads/kernel/atomtimer.c
index 3693295..91eb053 100755
--- a/atomthreads/kernel/atomtimer.c
+++ b/atomthreads/kernel/atomtimer.c
@@ -68,7 +68,7 @@


 #include "atom.h"

 /* Data types */

@@ -299,7 +299,7 @@ void atomTimerTick (void)
     {
         /* Increment the system tick count */
         system_ticks++;
-
+       atomSched(TRUE);
         /* Check for any callbacks that are due */
         atomTimerCallbacks ();
     }



>
> Thanks,
> Kelvin.
>
>
> >> >        I am new to embedded and have very little experience but I'm
> very
> >> > enthu abt it. Few days back I bought Arduino Uno with 32KB memory and
> >> > 16Mhz.
> >> > Later I found atomthread multi threading RTOS kernel on Internet. By
> >> > changing some configuration port file for avr in the kernel I am able
> >> > to run main thread (Thanks for excellent documentation).
> >> > Even I have ported some cpp files from arduino to kernel and did some
> >> > changes in Makefile to run  LED blinking
> >> > code in thread context that that too worked :-). I am using default
> uart
> >> > port provided by atomthread and its working.
> >> > Even I am using printf for printing on serial port but I dont knw
> >> > whether
> >> > should I use printf or prinf_P but it working.
> >> >
> >> > Even I am able to create multiple threads and I can see all the prints
> >> > in
> >> > those thread. But I am not able to use atomTimerDelay
> >> > in threadContex. Thread is going in hang state when I call this
> >> > function.
> >> > Here do I need to do some time call to so ??
> >> > Even when thread contex is over then this thread is recreated or board
> >> > is
> >> > re-booted. Is something wrong with scheduler or timer ??
> >> >
> >> > --
> >> > With Regards,
> >> > Ashwin Vasani
> >> > +91 8446611430
>



-- 
With Regards,
Ashwin Vasani
+91 8446611430

Re: [atomthreads] Porting atomthread on Arduino Uno

From:
Kelvin Lawson
Date:
2012-09-12 @ 23:23
Hi Ashwin,

> Actually I havn't replaced timer. Here is diff for working  case.
>
> diff --git a/atomthreads/kernel/atomtimer.c b/atomthreads/kernel/atomtimer.c
> index 3693295..91eb053 100755
> --- a/atomthreads/kernel/atomtimer.c
> +++ b/atomthreads/kernel/atomtimer.c
> @@ -68,7 +68,7 @@
>
>
>  #include "atom.h"
>
>  /* Data types */
>
> @@ -299,7 +299,7 @@ void atomTimerTick (void)
>      {
>          /* Increment the system tick count */
>          system_ticks++;
> -
> +       atomSched(TRUE);
>          /* Check for any callbacks that are due */
>          atomTimerCallbacks ();
>      }

The scheduler is already called in atomIntExit() after the timer ISR
occurs, and it will not be safe to add the extra call there.

If you would like to send me off-list your changes to the standard AVR
port then I could review them for potential problems.

Thanks,
Kelvin.

A qustion about atomThreadSwitch

From:
elvinwds
Date:
2012-09-11 @ 11:29
Hi All:

I am a new to RTOS and  have been studying the source code of atomthreads 
for a while,  and now I have question about the atomThreadSwitch function 
in atomkernel.c. 

The source code without comments of atomThreadSwitch is :
static void atomThreadSwitch(ATOM_TCB *old_tcb, ATOM_TCB *new_tcb)
    {
           if (old_tcb != new_tcb)
        {
            /* Set the new currently-running thread pointer */
            curr_tcb = new_tcb;

        /* Call the architecture-specific context switch */
            archContextSwitch (old_tcb, new_tcb);
        }

     old_tcb->suspended = FALSE;

   }

My question is about the last line :   "old_tcb->suspended = FALSE". Only 
when the old thread been scheduled back in, the RTOS can run to here. This
means that when the RTOS runs to here , the old thread has been scheduled 
out, so the state of the old thread can not be suspended, And why have to 
set the state of suspended false here?


With Regards,
Elvin

Re: [atomthreads] A qustion about atomThreadSwitch

From:
Kelvin Lawson
Date:
2012-09-13 @ 00:17
Hi Elvin,

It might be a bit easier to understand with the comments left in:

    if (old_tcb != new_tcb)
    {
        /* Set the new currently-running thread pointer */
        curr_tcb = new_tcb;

        /* Call the architecture-specific context switch */
        archContextSwitch (old_tcb, new_tcb);
    }

    /**
     * The context switch shifted execution to a different thread. By the time
     * we get back here, we are running in old_tcb context again. Clear its
     * suspend status now that we're back.
     */
    old_tcb->suspended = FALSE;

The suspended flag is set to TRUE when a thread is being suspended,
and is set to FALSE when it runs again. This is used as housekeeping,
to keep a track of what suspension state a thread is in.

For any thread that calls into this function, the calling thread
(itself) is old_tcb and the new thread being switched in is new_tcb.
When you return from archContextSwitch() *in the context of the
original calling thread* then the running thread is back to the
original thread (old_tcb), so it needs to mark itself as not suspended
any more, by setting its flag to FALSE again.

Thanks,
Kelvin.

On 11 September 2012 12:29, elvinwds <elvinwds@gmail.com> wrote:
> Hi All:
>
> I am a new to RTOS and  have been studying the source code of atomthreads
> for a while,  and now I have question about the atomThreadSwitch function in
> atomkernel.c.
>
> The source code without comments of atomThreadSwitch is :
> static void atomThreadSwitch(ATOM_TCB *old_tcb, ATOM_TCB *new_tcb)
>     {
>            if (old_tcb != new_tcb)
>         {
>             /* Set the new currently-running thread pointer */
>             curr_tcb = new_tcb;
>
>         /* Call the architecture-specific context switch */
>             archContextSwitch (old_tcb, new_tcb);
>         }
>
>      old_tcb->suspended = FALSE;
>
>    }
>
> My question is about the last line :   "old_tcb->suspended = FALSE". Only
> when the old thread been scheduled back in, the RTOS can run to here. This
> means that when the RTOS runs to here , the old thread has been scheduled
> out, so the state of the old thread can not be suspended, And why have to
> set the state of suspended false here?
>
>
> With Regards,
> Elvin