Usage of configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES

gezab wrote on Tuesday, June 14, 2016:

Hi all,

I am developing a new project and therefore I set the above define to 1, in order to catch list corruptions. I also have configASSERT() defined and it broke execution when my first static semaphore was about to be created, since Queue_t and StaticQueue_t are not of the same size. In order to get rid of the error, I needed to make the following changes in FreeRTOS.h:

/*
 * In line with software engineering best practice, FreeRTOS implements a strict
 * data hiding policy, so the real structures used by FreeRTOS to maintain the
 * state of tasks, queues, semaphores, etc. are not accessible to the application
 * code.  However, if the application writer wants to statically allocate such
 * an object then the size of the object needs to be know.  Dummy structures
 * that are guaranteed to have the same size and alignment requirements of the
 * real objects are used for this purpose.  The dummy list and list item
 * structures below are used for inclusion in such a dummy structure.
 */
struct xSTATIC_LIST_ITEM
{
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
    TickType_t uxDummy0;
#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */
	TickType_t xDummy1;
	void *pvDummy2[ 4 ];
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
    TickType_t uxDummy3;
#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */
};
typedef struct xSTATIC_LIST_ITEM StaticListItem_t;

/* See the comments above the struct xSTATIC_LIST_ITEM definition. */
struct xSTATIC_MINI_LIST_ITEM
{
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
    TickType_t uxDummy0;
#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */
	TickType_t xDummy1;
	void *pvDummy2[ 2 ];
};
typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t;

/* See the comments above the struct xSTATIC_LIST_ITEM definition. */
typedef struct xSTATIC_LIST
{
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
    TickType_t uxDummy0;
#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */
	UBaseType_t uxDummy1;
	void *pvDummy2;
	StaticMiniListItem_t xDummy3;
#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )
    TickType_t uxDummy4;
#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */
} StaticList_t;

This way, even if the define in the subject is set to 1, the sizes of Queue_t and StaticQueue_t are equal and the assert is passing.

Can this be an intentional thing? Are we allowed to use the list integrity checker in our applications?

Regards,
Geza

rtel wrote on Tuesday, June 14, 2016:

Sure you can use the list integrity checker in your application if you like, but note it was not intended for use by applications, and as such is not documented - and the issue you have noticed (which we will look at - thanks for reporting) reflects that. The integrity checking code is included in our code coverage tests.

gezab wrote on Tuesday, June 14, 2016:

Thanks for your reply. I was debugging a weird phenomenon that was
corrupting my RAM, this is why I turned it on (unfortunately I do not have
data tracing equipment and the problem showed up only occasionally). It
really helped me to get closer to the problem which I already managed to
sort out, that is why I think it would make sense to have this as an
official option for applications, too.