Quality RTOS & Embedded Software

 Real time embedded FreeRTOS RSS feed 
Quick Start Supported MCUs PDF Books Trace Tools Ecosystem TCP & FAT




Loading

Problem found in vListInitialise ... FYI ONLY

Posted by Ricky on March 26, 2007
Port: STR912
Compiler: IAR, Embedded Workbench 4.0 Kickstart (ARM)
Optimize: Speed, maximum

I found a small problem in vListInitialise for the ARM9 port. This appears to be a compiler bug since the source code appears to be logically correct. This is just a FYI in case someone else is having the same problem as I am.

I created a library with the FreeRTOS ARM9 port that runs in Thumb mode. During debug, I was getting warning messages stating that an unaligned memory access was being performed and that the results were unpredictable. I traced the problem down to the vListInitialise function. The original function is shown below with a notation showing the line having the problem:

void vListInitialise( xList *pxList )
{
/* The list structure contains a list item which is used to mark the
end of the list. To initialise the list the list end is inserted
as the only list entry. */
pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd );

/* The list end value is the highest possible value in the list to
ensure it remains at the end of the list. */
pxList->xListEnd.xItemValue = portMAX_DELAY;

/* The list end next and previous pointers point to itself so we know
when the list is empty. */
pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd ); <<< Problem line
pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd );

pxList->uxNumberOfItems = 0;
}

In the problem line above, the address of pxList->xListEnd wasn't being found properly. The previous line was setting register R1 to portMAX_DELAY, and the compiler was using that value in the next line as the pxList pointer, and then adding 8 to find pxList->xListEnd. portMAX_DELAY is 0xFFFFFFFF and adding 8 makes an address of 7, which was the value getting stored in pxList->xListEnd.pxNext.

I moved the "pxList->xListEnd.xItemValue = portMAX_DELAY;" line to just after the section that sets pxList->xListEnd.pxNext and pxList->xListEnd.pxPrevious and the compiler generated the correct code.

I'll be notifying IAR of this problem.

RE: Problem found in vListInitialise ... FYI ONLY

Posted by Richard on March 26, 2007
Thanks for your valuable feedback.

When you have maximum optimisation on I presume the "static clustering" option is selected. I have found static clustering to cause a problem with several IAR builds. It would be interesting to see if the problem goes away when this option is deselected, while retaining all the other optimisations.

Regards.


[ Back to the top ]    [ About FreeRTOS ]    [ Sitemap ]    [ ]




Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.

Latest News

FreeRTOS kernel V10 is available for immediate download. Now MIT licensed.


FreeRTOS Partners

ARM Connected RTOS partner for all ARM microcontroller cores

IAR Partner

Microchip Premier RTOS Partner

RTOS partner of NXP for all NXP ARM microcontrollers

STMicro RTOS partner supporting ARM7, ARM Cortex-M3, ARM Cortex-M4 and ARM Cortex-M0

Texas Instruments MCU Developer Network RTOS partner for ARM and MSP430 microcontrollers

OpenRTOS and SafeRTOS