task

pietro77 wrote on Thursday, October 11, 2007:

what are the differences between a task definited (and declared)

static void vPCtask( void *pvParameters ) {…}

and a task definited (and declared)

static portTASK_FUNCTION( vPCtask, pvParameters ) {…} ?

What is the more correct definition (declaration)?

davedoors wrote on Thursday, October 11, 2007:

Some ports (WizC I think) want extra qualifiers on task functions.  The macros let you do this.  Also, you might want to have your task functions declared as “no return” so they don’t waste stack space saving registers on entry that are never going to get popped off the stack again.  In either of these cases you can use the macro to perform the extra qualification.  In all other cases there is no difference between the two methods.

dspaude wrote on Thursday, October 11, 2007:

My guess is that this is a convention used to generate one set of source code that can deal with different compilers. If either method you gave as an example works for your compiler then there is no difference in your situation. You can declare the functions however you would like, but if you later port your code to another system/compiler then you might need to modify the declaration (but it isn’t very likely you would need to do so). To avoid having to do that then you could declare them with the portTASK_FUNCTION().

Also, it is possible that the macro declaration could in the future add some other parameters specific to the port and in that case you would have to change all of your other non-portTASK_FUNCTION() declarations to match.

I chose to not use portTASK_FUNCTION() because the C parser of my IDE can’t correctly parse such declarations.