crosswork and sheduler

ing_fox wrote on Tuesday, November 20, 2007:

hello,

When I create a task, the programme bug in “portRESTORE_CONTEXT()” .
The stack is ok, but “portRESTORE_CONTEXT()” doesn’t go to my fonction (adresse:0x37e) but at the adresse 0xa5a5a5.

With the debugger, no probleme until the macro "portRESTORE_CONTEXT()".

this is my source:

main()
{
//ini du port 2 pour les led
vParTestInitialise();

//creation de la tache
xTaskCreate( LED, "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

//lancement du scheduler
vTaskStartScheduler();

}

void vParTestInitialise( void )
{
   PINSEL10 = 0;
   FIO2DIR  = 0x000000FF;
   FIO2MASK = 0x00000000;
   FIO2CLR  = 0xFF;
   SCS |= (1<<0); //fast mode for port 0 and 1
}

void LED(void *pvParameters )
{
  FIO2CLR = 0xff;
  vTaskDelay( 10 );
  FIO2SET = 0xFF;
}

And this is my RTOSconfig:

#define configUSE_PREEMPTION        1
#define configUSE_IDLE_HOOK         0
#define configUSE_TICK_HOOK         1
#define configCPU_CLOCK_HZ          ( ( unsigned portLONG ) 57600000 )    /* =12Mhz xtal multiplied by 5 using the PLL. */
#define configTICK_RATE_HZ          ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES        ( ( unsigned portBASE_TYPE ) 4 )
#define configMINIMAL_STACK_SIZE    ( ( unsigned portSHORT ) 104 )
#define configTOTAL_HEAP_SIZE        ( ( size_t ) ( 18 * 1024 ) )
#define configMAX_TASK_NAME_LEN        ( 10 )
#define configUSE_TRACE_FACILITY    1
#define configUSE_16_BIT_TICKS        0
#define configIDLE_SHOULD_YIELD        1
#define configUSE_MUTEXES            1
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES         0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

some idea?
Thank.

bkastel1 wrote on Tuesday, November 20, 2007:

Hello,

first idea is that you are missing a for(;;){} loop inside your LED task: try this

void LED(void *pvParameters )
{
    for(;:wink: {
        FIO2CLR = 0xff;
        vTaskDelay( 900 );
        FIO2SET = 0xFF;
        vTaskDelay( 10 );   //this will give you a blinking led
    }
}

cherepanov wrote on Tuesday, November 20, 2007:

The task that you create (function LDE) must to have no end. For example it must have

while (1==1)
{

    do something
}

For testing value  0xa5a5a5 is puting in the stack. That is why your task is returned to this adress.

ing_fox wrote on Tuesday, November 20, 2007:

thank

I have actually forget for(;;). (i have made many test a for the last i forget it)
I have add for(;:wink: but have the same error…
i bug and go out…

//correction source
void LED(void *pvParameters )
{
   for(;:wink:
   {
      FIO2CLR = 0xff;
      vTaskDelay( 10 );
      FIO2SET = 0xFF;
   }
}

somme other idea? or somebody have an exemple with a single function (led toggle) that work in FreeRTOS (for start with this apply and after change it)?

PS :  i work in MCB2300 with lpc2378

thank

bkastel1 wrote on Tuesday, November 20, 2007:

Hello,

i have a simple LED flash done which is done with Rowley (what IDE are you using?). Here is some of my code:

//this is in my FreeRTOSConfig

#define configUSE_PREEMPTION        1
#define configUSE_IDLE_HOOK            0
#define configUSE_TICK_HOOK            0
#define configCPU_CLOCK_HZ            ( ( unsigned portLONG ) 60000000 )    /* =12MHz * 5 with PLL.  */
#define configTICK_RATE_HZ            ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES        ( ( unsigned portBASE_TYPE ) 6 )
#define configMINIMAL_STACK_SIZE    ( ( unsigned portSHORT ) 128 )
#define configTOTAL_HEAP_SIZE        ( ( size_t ) ( 5 * 1024 ) )
#define configMAX_TASK_NAME_LEN        ( 16 )
#define configUSE_TRACE_FACILITY    0
#define configUSE_16_BIT_TICKS        0
#define configIDLE_SHOULD_YIELD        1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES         0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet        1
#define INCLUDE_uxTaskPriorityGet        1
#define INCLUDE_vTaskDelete                1
#define INCLUDE_vTaskCleanUpResources    0
#define INCLUDE_vTaskSuspend            1
#define INCLUDE_vTaskDelayUntil            1
#define INCLUDE_vTaskDelay                1

next i manually set the PLL:

static  void vClockInit( void )
{
  // Fosc = 12MHz, CCLK = 60MHz
  // M = Fosc/CCLK = 5 (M = 5 - 1)
  // P = Fcco/(2*CCLK) = 2 (P = 2 - 1)
  PLLCFG = 0x23;
  //PLLCFG = 4 | (1 << 4);
  PLLCON = 0x01;   // PLL enable
 
  PLLFEED_SEQUENCE;
 
  // wait for PLL lock to requested frequency
  while( (PLLSTAT & 0x400) == 0 );

  PLLCON = 0x03;   // connect PLL clock to processor clock
  PLLFEED_SEQUENCE;

  APBDIV = 0x01;    // peripheral clock is processor clock

  MAMCR  = 0x00;   // MAM disable
  MAMTIM = 0x03;   // MAM fetch cycles are 3 CCLKs in duration
  MAMCR  = 0x02;   // MAM enable
}

also, my LED task has priority defined as:
#define LedTASK_PRIORITY                   ( tskIDLE_PRIORITY + 1 )

Maybe this will help.

davedoors wrote on Tuesday, November 20, 2007:

Are you starting the scheduler is Supervisor mode?  Under CrossWorks you have to have SUPERVISOR_START defined.  Use the demo app as a start so you get all the configuration required.

sashiono wrote on Wednesday, November 21, 2007:

//correction source
void LED(void *pvParameters ) 

for(;:wink:
{
FIO2CLR = 0xff; 
vTaskDelay( 10 ); 
FIO2SET = 0xFF; 
}

you need to have another delay to see the blink

//corrected correction source
void LED(void *pvParameters ) 

for(;:wink:
{
FIO2CLR = 0xff; 
vTaskDelay( 10 ); 
FIO2SET = 0xFF; 
vTaskDelay( 10 ); 
}
}