ulissesBR ulissesBR - 17 days ago 4x
C Question

FreeRTOS Hungarian Notation

I'm a complete newbie in RTOS and C programming, and I'm still getting used to the C good practices yet. So I opened a project which uses FreeRTOS, and I notice that the OS files use the Hungarian Notation. I know the notation a little, but faced some new "standards" in the

file, which are:

#ifndef configASSERT
#define configASSERT( x )
#define configASSERT_DEFINED 0
#define configASSERT_DEFINED 1

And below that,

#ifndef INCLUDE_xTaskGetSchedulerState
#define INCLUDE_xTaskGetSchedulerState 0

#ifndef INCLUDE_xTaskGetCurrentTaskHandle
#define INCLUDE_xTaskGetCurrentTaskHandle 0

I've seen this x - as in xTaskGetCurrentTaskHandle - everywhere. Also, v, pd and variable names like that, like in line
of the header in question:

#define eTaskStateGet eTaskGetState
#define portTickType TickType_t
#define xTaskHandle TaskHandle_t
#define xQueueHandle QueueHandle_t
#define xSemaphoreHandle SemaphoreHandle_t
#define xQueueSetHandle QueueSetHandle_t
#define xQueueSetMemberHandle QueueSetMemberHandle_t
#define xTimeOutType TimeOut_t
#define xMemoryRegion MemoryRegion_t
#define xTaskParameters TaskParameters_t
#define xTaskStatusType TaskStatus_t
#define xTimerHandle TimerHandle_t
#define xCoRoutineHandle CoRoutineHandle_t
#define pdTASK_HOOK_CODE TaskHookFunction_t

/* Backward compatibility within the scheduler code only - these definitions
are not really required but are included for completeness. */
#define tmrTIMER_CALLBACK TimerCallbackFunction_t
#define pdTASK_CODE TaskFunction_t
#define xListItem ListItem_t
#define xList List_t

I've searched everywhere what would those "initials" stand for, but still could not figure that out.

So, if anyone could help me to understand this, or could show me a path or something, I'd be really grateful.


Looking at the man

Naming Conventions

The RTOS kernel and demo application source code use the following conventions:


  • Variables of type uint32_t are prefixed ul, where the 'u' denotes unsigned and the 'l' denotes long.

  • Variables of type uint16_t are prefixed us, where the 'u' denotes 'unsigned' and the 's' denotes short.

  • Variables of type uint8_t are prefixed uc, where the 'u' denotes 'unsigned' and the 'c' denotes char.

  • Variables of non stdint types are prefixed x. Examples include BaseType_t and TickType_t, which are portable layer defined typedefs for the natural or most efficient type for the architecture and the type used to hold the RTOS tick count respectively.

  • Unsigned variables of non stdint types have an additional prefix u. For example variables of type UBaseType_t (unsigned BaseType_t) are prefixed ux.

  • Variables of type size_t are also prefixed x.

  • Enumerated variables are prefixed e

  • Pointers have an additional prefixed p, for example a pointer to a uint16_t will have prefix pus.

  • In line with MISRA guides, unqualified standard char types are only permitted to hold ASCII characters and are prefixed c.

  • In line with MISRA guides, variables of type char * are only permitted to hold pointers to ASCII strings and are prefixed pc.

Emphasis mine


  • File scope static (private) functions are prefixed with prv.

  • API functions are prefixed with their return type, as per the convention defined for variables, with the addition of the prefix v for void.

  • API function names start with the name of the file in which they are defined. For example vTaskDelete is defined in tasks.c, and has a void return type.

Emphasis mine


  • Macros are pre-fixed with the file in which they are defined. The pre-fix is lower case. For example, configUSE_PREEMPTION is defined in FreeRTOSConfig.h.

  • Other than the pre-fix, macros are written in all upper case, and use an underscore to separate words.

Emphasis mine