Типы данных
Все типы данных, а также аргументы функций и названия самих функций подчиняются так называемой венгерской нотации, которая подразумевает присутствие префикса. Например, функция 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 )
