Sonsivri

Electronics => AVR, 8051 Family and ARM Area => Topic started by: 30f4011 on June 23, 2009, 03:27:12 15:27



Title: Problem with ucos-ii OSTimeDlyHMSM() function.
Post by: 30f4011 on June 23, 2009, 03:27:12 15:27
Hi friends,
              
            I am developing small application with ucos-ii v2.86 and OLIMEX STRE-912 board with IAR EW-ARM v5.30 . In code when OSTimeDlyHMSM() function is encountered the task is halted permanently and execution freezes.

           It works with small delays e.g OSTimeDlyHMSM(0, 0, 0, 5 ) but not with normal ones e.g OSTimeDlyHMSM(0, 0, 1, 30 );
OS timer tick is set to 100 ticks per second.
 
          Program works properly if OSTimeDlyHMSM() is removed.
      
           Please help me to solve this problem :-[ :-[
 
the application code is as under,

    
Code:
   
/******************************************************************************************************

uC/OS-II
Filename      : app.c
Version       : V1.00

********************************************************************************************************/

#include <includes.h>

/*
*********************************************************************************************************
*                                               LOCAL DEFINES
*********************************************************************************************************
*/



/*
*********************************************************************************************************
*                                             LOCAL DATA TYPES
*********************************************************************************************************
*/

typedef struct graphics
              {
               unsigned char x1;
               unsigned char y1;
               unsigned char x2;
               unsigned char y2;
               unsigned char color;
              }lcdgraphics;

//struct graphics lcdgraphics;

/*
*********************************************************************************************************
*                                                VARIABLES
*********************************************************************************************************
*/

OS_STK   Task_Serial_TX_STK[Task_COM_STK];
OS_STK   TASK_LCDD_STK[Task_LCD_STK];


OS_EVENT *mb;
OS_EVENT *clr;

OS_EVENT *lcdq;
void *lcdptr[4];


/*
*********************************************************************************************************
*                                            FUNCTION PROTOTYPES
*********************************************************************************************************
*/


void Task_Serial_TX( void *pdata );
void Task_LCD( void *pdata );


/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : This is the standard entry point for C code.
*
* Note(s)     : none.
*********************************************************************************************************
*/
void   main   ( void )
{

 BSP_IntDisAll();           /* Disable all interrupts until we are ready to accept them */

 BSP_Init();                /* Initialize system's BSP */






 OSInit();                  /* Initialize "uC/OS-II, The Real-Time Kernel" */

 mb   = OSMboxCreate( (void *)0 );
 clr  = OSMboxCreate( (void *)0 );
 lcdq = OSQCreate( &lcdptr[0], 4);

 OSTaskCreate( Task_Serial_TX, ( void * )0,  &Task_Serial_TX_STK[Task_COM_STK -1], Task_COM_PRIO ); // task prio = 2
 OSTaskCreate( Task_LCD, ( void *)0, &TASK_LCDD_STK[Task_LCD_STK-1], Task_LCD_PRIO ); // task prio = 1



 OSStart();                 /* Start multitasking (i.e. give control to uC/OS-II) */

}


/*********************************************************************************************************
*                                                Task_Serial_TX()
*
* Description :
*
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   :
*
* Note(s)     : none
*********************************************************************************************************/
void Task_Serial_TX ( void *pdata )
{

  unsigned char err;


  lcdgraphics rectangle;


  rectangle.color = 0;
  rectangle.x2 = 0;
  rectangle.y2 = 0;
  rectangle.x1 = 0;
  rectangle.y1 = 0;

  pdata = pdata;

  while( 1 )
  {

   rectangle.x1 += 2;
   rectangle.y1  = rectangle.x1;
   if( rectangle.x1 > 130 )
   {
     rectangle.x1 = 0 ;
     LCDClearScreen();
    if( rectangle.color++ > 10 )
      { rectangle.color = 0; }
   }

   if( rectangle.y2 > 130)
   { rectangle.y2 = 0;}

   UartSendStr( " PASSED " ); // sends data to uart

   OSQPost( lcdq, (void *)&rectangle);


  }

}


/*********************************************************************************************************
*                                                Task_LCD()
*
* Description :
*                .
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   :
*
* Note(s)     : none
*********************************************************************************************************/
void Task_LCD ( void *pdata )
{

  unsigned char err;

  int TempColor[11] =
                    { WHITE, BLACK, RED, GREEN, BLUE, CYAN, MAGENTA,
             YELLOW, BROWN, ORANGE, PINK };



  lcdgraphics *rectangle;

  pdata = pdata;

  while( 1 )
  {

     rectangle = (lcdgraphics *)OSQPend( lcdq, 0, &err );
     OSTimeDlyHMSM(0, 0, 0, 50);

     LCDSetRect(rectangle->x1, rectangle->y1,
                      rectangle->x2, rectangle->y2,
                      FILL, TempColor[ rectangle->color] );


   }

}
             
//   WARM REGARDS
// YOUR HELP WILL BE GREATLY APPRECIATED