Re: gcc optimization return value handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



rekisum@xxxxxx wrote:

> I already put this in the FreeRTOS forum with no result so far:
> 
> I got hit by a very strange GCC/FreeRTOS problem. 
> In a task I check the return value of a function like this: 
>  
> int ret; 
>  
> if( xQueueReceive(QueueMain, &Event, portMAX_DELAY) == pdTRUE ) 
> {
>    switch(Event.id) 
>    { 
>       case EV_KEY_MENU_OK: 
>       ret = menu_descend(); 
>       if( ret != 0 ) 
>       { . . . . . 
> .
> .
> .
>  
> Using this code the system hangs after returning from menu_descend()! 
> The program gets stuck in xQueueReceive() in an endless loop of xTaskResumeAll(). 
> There is a while loop: 
> while( ( pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xPendingReadyList ) ) ) != NULL ) 
>  
> As there is an portENTER_CRITICAL() in the beginning of that routine there 
> interrupts are disabled, the os tick is no longer called. 

Where is this while loop?  What has it to do with the the code above?

> But, when I declare ret as volatile 
> volatile int ret; 
> the program runs as expected! 
>  
> Looking at the assembler code shows: 
> Without volatile: 
>  
> bl menu_descend 
> cmp r0, #0 
> beq .L123 
>  
> With volatile: 
>  
> bl menu_descend 
> str r0, [sp, #84] 
> ldr r3, [sp, #84] 
> cmp r3, #0 
> beq .L123 
>  
> So it looks like that storing the return value on the stack 
> and using r3 for comparison against zero saves my program 
> from getting stuck. 
>  
> From here I only can guess. 
> Maybe gcc tricks itself by the assumption that there lies a return value 
> of the function on stack, but optimisation uses r0 for handover directly instead,  
> and from there on the stack pointer is one position to low? 

That seems unlikely.  In both of these the return value is in r0.

> Or has it to do with register treatment of freertos, especially register r0? 
>  
> I use freertos version 3.2 ( because thats what the project started with 
> and I'm not allowed to upgrade ;-) 
> It's a port for the STR7 ARM7 from ST. 
> gcc is arm-elf-gcc 4.2.2 
> optimization level is 2 
>  
> All that really frightens me! 
> I must use optimization, at least for size, as the code got to big. 
>  
> What goes wrong here? 

We don't know, because there's not really enough information.  The example code
you provided looks fine, both with and without volatile.

Andrew.

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux