rtems_task acting strange
Joel Sherrill
joel.sherrill at OARcorp.com
Wed Mar 12 13:37:05 UTC 2003
Salman wrote:
>
> Hi guys,
>
> I'm observing strange behavior when executing the following osif_init
> function.
>
> It gets as far as printing "were gonna startthe task 0 !!!!" (status = 0
> -> successful task creation) and waiting for return key.
> when I press return key, it goes mental, the screen either starts
> dumping infinite garbage, or I get a page of errors with heading related
> to thread error or something (i can't fully read it, cos system reboots
> straight afterwards)
>
> any idea whats going wrong ?
If osif_init() is an initialization task and an RTEMS Classic API task,
then it is falling off the bottom and that is a fatal error. So I think
the system is giving a fatal error. Try adding an
rtems_task_delete(RTEMS_SELF)
to the bottom instead of a return.
For sure the mq task at the bottom is also falling out the bottom since
you have commented out the infinite task body loop.
> thanks
>
> Salman
>
> ----------------- the related functions ------------------
> int osif_init(osif_init_args_t args)
> {
>
> rtems_status_code status;
> rtems_id Task_id;
>
> /* debugging info*/
> printk ("osif_c #2: were here\n");
> fflush(stdout);
> getchar();
>
> UnitCount++;
> if (UnitCount > 1) {
> return(0);
> }
>
> first_timeout = NULL;
> main_driver_lock=sem_open("main_driver_lock",O_CREAT,0,1);
> if (main_driver_lock==(sem_t *) -1)
> printk("osif_init");
>
> Dma_lock=sem_open("Dma_lock",O_CREAT,0,1);
> if (Dma_lock==(sem_t *) -1)
> printk("osif_init");
>
> FlagInt_lock=sem_open("FlagInt_lock",O_CREAT,0,1);
> if (FlagInt_lock==(sem_t *) -1)
> printk("osif_init");
>
> AttIndex_lock=sem_open("AttIndex_lock",O_CREAT,0,1);
> if (AttIndex_lock==(sem_t *) -1)
> printk("osif_init");
>
> time_q_lock=sem_open("time_q_lock",O_CREAT,0,1);
> if (time_q_lock==(sem_t *) -1)
> printk("osif_init");
>
> to_lock=sem_open("tot_lock",O_CREAT,0,0);
> if (to_lock==(sem_t *) -1)
> printk("osif_init");
>
> /* two tasks start here in vxworks
> * but are sequentially implemented in linux
> * fix required
> * done
> * one is related to interrupts which we're doing sequentialy in
> sci_interrupthandler, like linux
> * the other is a task related to timeouts etc, which we implemented as
> rtems_task
> * taskSpawn("TOT_TASK",2,VX_FP_TASK,40000,(FUNCPTR)
> to_task,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
> */
>
> status = rtems_task_create(
> rtems_build_name( 'T', 'S', '0', '1'),
> 2, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES,
> RTEMS_DEFAULT_ATTRIBUTES, &Task_id);
>
> /* debugging info*/
> printf("were gonna startthe task %i !!!!",(int)status);
> getchar();
> status = rtems_task_start( Task_id, to_task, 1);
> return 0;
> }
>
> rtems_task to_task(rtems_task_argument unused)
> {
> int gto_data;
> int retval;
> struct mq_attr attr;
> /* commented out for debugging
> extern void general_timeout_handler( int data);*/
>
> attr.mq_flags = 0;
> attr.mq_maxmsg = 128;
> attr.mq_msgsize = sizeof(int);
>
> /* debugging info*/
> printk("were gonna do the mq_open thing");
> getchar();
>
> mq=mq_open("TOTDATA",O_RDWR|O_CREAT,NULL,&attr);
>
> /* debugging info*/
> printk("just did the mq_open thing");
> getchar();
> if (mq== (mqd_t ) -1)
> {
> /* debugging info*/
> printk("mq_open failed\n");
> getchar();
> rtems_task_suspend(RTEMS_SELF);
> }
> /* debugging info*/
> printk("mq_open passed\n");
> getchar();
> /* commented out for debugging
> for(;;)
> {
> retval=mq_receive(mq,>o_data,sizeof(int),0);
> if (retval== -1)
> {
> printk("mq_open failed\n");
> rtems_task_suspend(RTEMS_SELF);
> }
> general_timeout_handler(gto_data);
> }
> */
> }
--
Joel Sherrill, Ph.D. Director of Research & Development
joel at OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the users
mailing list