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.