Типы данных
Все типы данных, а также аргументы функций и названия самих функций подчиняются так называемой венгерской нотации, которая подразумевает присутствие префикса. Например, функция vTaskStartScheduler()
возвращает тип void
, а переменная pxCreatedTask
— это указатель (p
) на структуру (x
). Ниже приведена сводная таблица.
Префикс | Тип данных |
---|---|
c | Символьный тип char |
s | Целочисленный, короткий тип short |
l | long |
f | float |
d | double |
v | void |
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 )