Типы данных

Все типы данных, а также аргументы функций и названия самих функций подчиняются так называемой венгерской нотации, которая подразумевает присутствие префикса. Например, функция vTaskStartScheduler() возвращает тип void, а переменная pxCreatedTask — это указатель (p) на структуру (x). Ниже приведена сводная таблица.

ПрефиксТип данных
cСимвольный тип char
sЦелочисленный, короткий тип short
llong
ffloat
ddouble
vvoid
eПеречисление enum
xСтруктура struct или другой тип
pУказатель
uБеззнаковый

После типа идет имя модуля, в котором данная сущность определена. Таким образом, вы легко можете понять, что vTaskStartSheduler() определен в task.c.

Так как, размеры типов char, short и long платформозависимые, то использовать их в ядре не самая лучшая идея с точки зрения переносимости кода. По этой причине внутри ядра используются переопределенные типы из portmacro.h, начинающиеся с префикса port. Ниже приведен пример для МК stm32f103c8.

/* Type definitions. */
#define portCHAR          char
#define portFLOAT         float
#define portDOUBLE        double
#define portLONG          long
#define portSHORT         short
#define portSTACK_TYPE    uint32_t
#define portBASE_TYPE     long

Как можно заметить, сами макросы также имеют префикс, но он не всегда совпадает с названием файла.

// projdefs.h
#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY( -1 )
#define errQUEUE_BLOCKED( -4 )
#define errQUEUE_YIELD( -5 )
// ...
#define pdFALSE( ( BaseType_t ) 0 )
#define pdTRUE( ( BaseType_t ) 1 )

Изменено: