portBASE_TYPE conflict definition with vtaskDelayUntil()

chaabanemalki wrote on Tuesday, April 15, 2014:


I migrated from freeRTOS 7.6.0 to 8.0.0

when building the same project of a PIC32Mx using XC32 1.31 and FreeRTOS 8.0.0

I get this error everytime i use vtaskDelayUntil()
…/GPS/GPS.c:488:21: warning: passing argument 1 of ‘vTaskDelayUntil’ from incompatible pointer type
…/Source/include/task.h:599:6: note: expected ‘TickType_t * const’ but argument is of type ‘long int *’

But I don’t get it with FreeRTOS 7.6.0

here is my line of code

portBASE_TYPE xLastTimeWakeTask;
vTaskDelayUntil(&xLastTimeWakeTask, 100/portTICK_RATE_MS);

the first argument (portTickType) in vtaskDelayUntil() is defined :

in 7.6.0 : typedef unsigned long portTickType;

in 8.0.0 : typedef uint32_t TickType_t; and in microchip type definition i find

typedef __ uint32_t uint32_t;
typedef unsigned int __ uint32_t;

and this makes TickType_t an unsigned int.

I changed the definition of TickType_t to long like portBASE_TYPE, would that make a mess after ?

davedoors wrote on Tuesday, April 15, 2014:

In both V7.6.0 and V8.0.0 the tick type has been unsigned. Your code snipped is declaring xLastTimeWakeTask as a signed portBASE_TYPE. This has probably always been wrong in your code but not been highlighted until you switch to v8 because in v8 it is attempting an implicit conversion to a typedef.

Try building against V7.6.0 with the -Wextra compiler option. Does it generate a warning then?

Have a look at http://www.freertos.org/upgrading-to-FreeRTOS-V8.html#typedefs

chaabanemalki wrote on Tuesday, April 15, 2014:

Thank you for the clarificaiton, I mixed between portBASE_TYPE and portTickType