problem starting a rtems task

Joel Sherrill joel.sherrill at oarcorp.com
Fri Jun 27 15:41:38 UTC 2014


On 6/27/2014 9:44 AM, Martínez, Pablo wrote:
>
>
>
> On 26 June 2014 18:54, Joel Sherrill <joel.sherrill at oarcorp.com
> <mailto:joel.sherrill at oarcorp.com>> wrote:
>
>
>     On 6/26/2014 4:48 PM, Martínez, Pablo wrote:
>>
>>
>>
>>     On 26 June 2014 18:28, Chris Johns <chrisj at rtems.org
>>     <mailto:chrisj at rtems.org>> wrote:
>>
>>         On 26/06/2014 11:54 pm, Martínez, Pablo wrote:
>>
>>
>>
>>
>>             On 26 June 2014 08:37, Chris Johns <chrisj at rtems.org
>>             <mailto:chrisj at rtems.org>
>>             <mailto:chrisj at rtems.org <mailto:chrisj at rtems.org>>> wrote:
>>
>>
>>
>>                 On 26/06/2014 12:56 am, Martínez, Pablo wrote:
>>
>>                     Hi,
>>
>>                     Im having troubles trying to use the class
>>             rtemsTask from the the
>>                     librtems++.
>>
>>                     (
>>                    
>>             https://github.com/atgreen/__RTEMS/blob/master/c/src/__librtems%2B%2B/include/rtems%__2B%2B/rtemsTask.h
>>
>>
>>                    
>>             <https://github.com/atgreen/RTEMS/blob/master/c/src/librtems%2B%2B/include/rtems%2B%2B/rtemsTask.h>
>>                     )
>>
>>                     This class is basically a wrapper for the rtems
>>             task api.
>>
>>                     I can create the task successfully (its returns
>>             0), but when I call
>>                     start() the entry point origin doesnt start
>>             despite returning 0
>>                     (this
>>                     method just write a memory position to check if
>>             the task is
>>                     working).
>>
>>
>>                     const rtems_status_code rtemsTask::start(const
>>                     rtems_task_argument arg)
>>
>>
>>                     {
>>                     if (owner)
>>
>>
>>                     {
>>                     argument = arg;
>>
>>
>>                     // pass the this pointer as the argument
>>                     set_status_code(rtems_task___start(id,
>>                     origin,
>>                     (rtems_task_argument) this));
>>
>>
>>                     }
>>                     else
>>                     set_status_code(RTEMS_NOT___OWNER_OF_RESOURCE);
>>
>>                     return last_status_code();
>>
>>
>>                     }
>>
>>                     Any help?
>>
>>
>>                 Are the priorities ok ? If not it might not be able
>>             to run.
>>
>>
>>             Im using this parameters to create the task:
>>
>>             "SELF"
>>             1  (priority)
>>             RTEMS_MINIMUM_STACK_SIZE
>>             RTEMS_NO_PREEMPT
>>             0
>>             RTEMS_NO_FLOATING_POINT
>>             RTEMS_LOCAL
>>
>>
>>             In C implementation is working fine, but the problem
>>             comes with C++.
>>
>>
>>         I would need a more complete example to know what is happening.
>>
>>
>>     Chris,
>>
>>     Im trying to use the rtems++ library as follows:
>>
>>
>>     //////////////Tempo.h
>>
>>     #ifndef TEMPO_H_
>>     #define TEMPO_H_
>>
>>     #include <rtems++/rtemsTask.h>
>>     #include <rtems++/rtemsTaskMode.h>
>>
>>     class Tempo: public rtemsTask
>>     {
>>     public:
>>         Tempo(const char* name,
>>                 const rtems_task_priority initial_priority,
>>                 const uint32_t stack_size,
>>                 const rtems_mode preemption = RTEMS_NO_PREEMPT,
>>                 const rtems_mode timeslice = RTEMS_NO_TIMESLICE,
>>                 const rtems_mode asr = RTEMS_NO_ASR,
>>                 const rtems_interrupt_level interrupt_level = 0,
>>                 const FloatingPoint floating_point = fpoff,
>>                 const Scope scope = local);
>>
>>         virtual ~Tempo();
>>         //rtems_task origin(rtems_task_argument argument);
>>
>>         const rtems_status_code start(const rtems_task_argument
>>     argument);
>>         static rtems_task origen(rtems_task_argument argument);
>>         void cuerpo(rtems_task_argument argument);
>>
>>     private:
>>
>>           // task name
>>           rtems_name name;
>>           char name_str[5];
>>
>>           // owner, true if this object owns the task
>>           // will delete the task when it destructs
>>           bool owner;
>>
>>           // the rtems id, object handle
>>           rtems_id id;
>>
>>           // the argument for the task, this class uses the actual
>>     argument
>>           // passed to RTEMS
>>           rtems_task_argument argument;
>>
>>     };
>>
>>     #endif /* TEMPO_H_ */
>>
>>
>>     //////////////Tempo.cpp
>>
>>     #include "Tempo.h"
>>
>>     Tempo::Tempo(const char* tname,
>>                          const rtems_task_priority initial_priority,
>>                          const uint32_t stack_size,
>>                          const rtems_mode preemption,
>>                          const rtems_mode timeslice,
>>                          const rtems_mode asr,
>>                          const rtems_interrupt_level interrupt_level,
>>                          const FloatingPoint floating_point,
>>                          const Scope scope)
>>       : name(rtems_build_name('S', 'E', 'L', 'F')),
>>         owner(true),
>>         id(RTEMS_SELF),
>>         argument(0)
>>     {
>>       strcpy(name_str, "SELF");
>>       create(tname,
>>              initial_priority,
>>              stack_size,
>>              preemption,
>>              timeslice,
>>              asr,
>>              interrupt_level,
>>              floating_point,
>>              scope);
>>     }
>>
>>
>>     Tempo::~Tempo()
>>     {
>>     }
>>
>>
>>     const rtems_status_code Tempo::start(const rtems_task_argument arg)
>>     {
>>
>>         argument = arg;
>>         // pass the this pointer as the argument
>>        
>>     set_status_code(rtems_task_start(id,origen,(rtems_task_argument)
>>     this));
>>
>>         printf ("   ---Tempo::start  --- \n\n");
>>
>>       return last_status_code();
>>     }
>>
>>
>>     rtems_task Tempo::origen(rtems_task_argument argument)
>>     {
>>         //just for debugging:
>>         unsigned *regout;
>>         regout= (unsigned*)0x80000d04;
>>         (*regout)=0x12345678;
>>
>>         printf ("   --- Tempo::origen  --- \n\n");
>>
>>       Tempo *task = (Tempo*) argument;
>>       task->cuerpo(task->argument);
>>
>>     }
>>
>>     void Tempo::cuerpo(rtems_task_argument )
>>     {
>>         printf ("   --- Tempo::do sth  --- \n\n");
>>     }
>>
>>
>>     ::::::::::
>>
>>     "  ---Tempo::start  --- \n\n" gets printed, but origen() is not
>>     triggered.
>>
>>
>>     Trying to solve this out, Im trying with one solution I just
>>     found (from you!)
>>     You use a thread template. I just found it so I haven't tested it
>>     yet.
>>
>>     http://comments.gmane.org/gmane.os.rtems.user/20625
>>
>
>     This is still not complete. There has to be an initialization task and
>     some RTEMS configuration (e.g. CONFIGURE_xxx followed by
>     an include of <rtems/confdefs.h>).
>
>     My first guess is that you have an Init task at priority 1 sitting
>     in a loop watching for something to happen. It won't happen
>     because it never yields the processor. 
>
>     An alternative is that the Init() task falls off the bottom of its
>     body and this is a fatal error halting the system.
>
>     If we saw the Init() and configuration that goes with this
>     it would really help. Something invokes your Tempo
>     constructor.
>
>     --joel
>
>
> #define CONFIGURE_INIT
>
> #include <rtems.h>
> #include <rtems++/rtemsTask.h>
> #include <rtems++/rtemsTaskMode.h>
> #include </opt/rtems-4.10/sparc-rtems4.10/leon3/lib/include/bsp.h> /*
> for device driver prototypes */
> #include <tmacros.h>
>
> extern "C"
> {
>   rtems_task Init(
>     rtems_task_argument argument
>     );
> }
>
>
> #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> #define CONFIGURE_MAXIMUM_TASKS            10
>
> #define CONFIGURE_MAXIMUM_TIMERS              5
> #define CONFIGURE_MAXIMUM_SEMAPHORES          5
>
> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> #define CONFIGURE_INIT_TASK_STACK_SIZE      (6 * RTEMS_MINIMUM_STACK_SIZE)
> #define CONFIGURE_EXTRA_TASK_STACKS         (13 *
> RTEMS_MINIMUM_STACK_SIZE)
> //#include
> </opt/rtems-4.10/sparc-rtems4.10/leon3/lib/include/rtems/confdefs.h>
> #include <rtems/confdefs.h>
>
> #include "Tempo.h"
>
> rtems_task Init(rtems_task_argument )
> {
>     printf ("   --- Rtems++ V 1.1   --- \n\n");
>
>     Tempo 
> t1("SELF",1,RTEMS_MINIMUM_STACK_SIZE,RTEMS_NO_PREEMPT,0,RTEMS_NO_FLOATING_POINT,RTEMS_LOCAL);
>
>     printf("Tempo::initial status: %d \n",t1.last_status_code());
>     printf("Tempo::started: %d \n",t1.start(1));
>     printf ("   --- FIN   --- \n\n");
>     exit(0);
> }
>
>
> Using grmon I can see the program exits normally.
>
Yep. exit(0) shuts down the entire program including all threads. Nothing
runs after exit(0) is called.

Try rtems_task_delete( RTEMS_SELF ) which only deletes the executing thread
and does not shut down the application.
> Pablo
>
>  
>
>
>>
>>     cheers,
>>     Pablo
>>
>>      
>>
>>         Chris
>>
>>             thank u,
>>             P
>>
>>
>>
>>                 Chris
>>
>>                     best regards,
>>
>>
>>
>>                     --
>>                     Martínez, Pablo Agustín
>>
>>
>>                     _________________________________________________
>>                     users mailing list
>>                     users at rtems.org <mailto:users at rtems.org>
>>             <mailto:users at rtems.org <mailto:users at rtems.org>>
>>                     http://lists.rtems.org/__mailman/listinfo/users
>>                     <http://lists.rtems.org/mailman/listinfo/users>
>>
>>                 _________________________________________________
>>                 users mailing list
>>                 users at rtems.org <mailto:users at rtems.org>
>>             <mailto:users at rtems.org <mailto:users at rtems.org>>
>>                 http://lists.rtems.org/__mailman/listinfo/users
>>
>>                 <http://lists.rtems.org/mailman/listinfo/users>
>>
>>
>>
>>
>>             --
>>             Martínez, Pablo Agustín
>>
>>
>>
>>
>>     -- 
>>     Martínez, Pablo Agustín
>
>     -- 
>     Joel Sherrill, Ph.D.             Director of Research & Development
>     joel.sherrill at OARcorp.com <mailto:joel.sherrill at OARcorp.com>        On-Line Applications Research
>     Ask me about RTEMS: a free RTOS  Huntsville AL 35805
>     Support Available                (256) 722-9985
>
>
>
>
> -- 
> Martínez, Pablo Agustín

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20140627/c11b1d53/attachment-0001.html>


More information about the users mailing list