Problem found in vListInitialise ... FYI ONLY
Posted by Ricky
on March 26, 2007
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.
Copyright (C) 2004-2010 Richard Barry. Copyright (C) 2010-2016 Real Time Engineers Ltd.
Any and all data, files, source code, html content and documentation included in the FreeRTOSTM distribution or available on this site are the exclusive property of Real Time Engineers Ltd..
See the files license.txt (included in the distribution) and this copyright notice for more information. FreeRTOSTM and FreeRTOS.orgTM are trade marks of Real Time Engineers Ltd.