没志青年
发布于 2025-09-16 / 25 阅读
0

FreeRTOS 源码 - 基础概念

FreeRTOS 内核版本:V10.5.1,也就是官网下载的 FreeRTOSv202212.01 这个版本。

类型命名规范

前缀

说明

v

void

x

BaseType_t 或者 bool

ux

unsigned BaseType_t

pv

void *

pc

char *

e

enum 枚举类型

typedef long BaseType_t;

#define pdFALSE ((BaseType_t)0)
#define pdTRUE ((BaseType_t)1)

#define pdPASS (pdTRUE)
#define pdFAIL (pdFALSE)

很多函数的返回值都是 BaseType_t,其实就是长整型,返回 1 表示成功,返回 0 表示失败。

函数命名规范

通过前缀,可以快速了解函数的用途、位置和使用条件。

这种命名规则有助于代码的可读性和可维护性。

前缀

说明

prv

标记为文件内私有函数,不应该在模块外调用。

port

表示与硬件平台相关的移植层

config

代表配置项

task

代表任务管理功能

queue

代表队列操作

sem

代表信号量操作

tick

代表系统节拍相关函数

功能控制

FreeRTOS 使用了大量的条件编译去控制各个功能,为了应对多种硬件架构和不同的配置选项,使得 FreeRTOS 具备良好的跨平台适应性。

调试机制

mtCOVERAGE_TEST_MARKER(); ,这个是开发FreeRTOS的人用的,这是,在正式运行环境中没有实际功能。

if (xTaskRemoveFromEventList(&(pxQueue->xTasksWaitingToReceive)) != pdFALSE)
 {
   queueYIELD_IF_USING_PREEMPTION();
}
else
{
   mtCOVERAGE_TEST_MARKER();
}

在FreeRTOS.h中为空实现,因此编译不会对项目大小造成影响。

#ifndef mtCOVERAGE_TEST_MARKER
#define mtCOVERAGE_TEST_MARKER()
#endif

在阅读源码的时候,实际上可以忽视那个判断,即,只保留:

xTaskRemoveFromEventList(&(pxQueue->xTasksWaitingToReceive));
queueYIELD_IF_USING_PREEMPTION();

这样能简化代码,方便阅读源码。

MISRA C 规则声明

/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified
 * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be
 * defined for the header files above, but not in this file, in order to
 * generate the correct privileged V sunprivileged linkage and placement. */
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

MISRA C 是一种编程规范,主要用于汽车、航空、工业控制等高安全要求的嵌入式软件。

它定义了一系列规则(例如哪些宏用法不推荐,哪些头文件包含方式必须统一,哪些语法特性危险等),用来避免潜在的安全隐患。

代码经过 MISRA 静态分析工具检查时,会报出“违背规则”的警告(lint 警告就是一种常见检查方式)。