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-0002.html>
More information about the users
mailing list