Why isn’t portTASK_FUNCTION been used for the timerTask? The macro is used for the idleTask.
Those macros are not really used in practice. It seemed like a good idea at the time, but after the (probably hundreds) of combinations of compiler and architecture ports we found they were only actually needed on one occasions - and that was for something somewhat obscure.
I used the macro to implement the IAR extension keyword __task.
This keyword allows functions to relax the rules for preserving registers. Typically, the keyword is used on the start function for a task in an RTOS.
By default, functions save the contents of used preserved registers on the stack upon entry, and restore them at exit. Functions that are declared __task do not save all registers, and therefore require less stack space.
Because a function declared __task can corrupt registers that are needed by the calling function, you should only use __task on functions that do not return or call such a function from assembler code.
The function main can be declared __task, unless it is explicitly called from the application. In real-time applications with more than one task, the root function of each task can be declared __task.
For the implementation I add a define in projdefs.h and \portable\IAR\MSP430X\portmacro.h.
#define TASK_EXTENSION_KEYWORD __task
* Defines the prototype to which task functions must conform. Defined in this
* file to ensure the type is known before portable.h is included.
typedef TASK_EXTENSION_KEYWORD void (*TaskFunction_t)( void * );
/* Task function macros as described on the FreeRTOS.org WEB site. */
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) TASK_EXTENSION_KEYWORD void vFunction( void *pvParameters )
#define portTASK_FUNCTION( vFunction, pvParameters ) TASK_EXTENSION_KEYWORD void vFunction( void *pvParameters )