FreeRTOS学习记录(变量命名规则全解、文件介绍)
目录
FreeRTOS 变量命名规则详解
一、变量命名前缀规则
(一)数据类型相关前缀
(二)功能模块相关前缀
(三)宏定义
二、变量命名与文件的关系
(一)核心源文件中的变量命名
(二)配置文件FreeRTOSConfig.h中的变量命名
(三)应用程序文件中的变量命名
FreeRTOS文件介绍
FreeRTOS Plus 是 FreeRTOS 的商业扩展版本,它们有以下联系与区别:
联系
区别
FreeRTOS文件结构
FreeRTOS 变量命名规则详解
一、变量命名前缀规则
新定义的数据类型 | 实际的数据类型(C 标准类型) | 说明 |
---|---|---|
portCHAR | char | 无 |
portSHORT | short | 无 |
portLONG | long | 无 |
portTickType | unsigned short int | 用于定义系统时基计数器的值和阻塞时间的值。当 FreeRTOSConfig.h 头文件中的宏 configUSE_16_BIT_TICKS 为 1 时则为 16 位。 |
portTickType | unsigned int | 用于定义系统时基计数器的值和阻塞时间的值。FreeRTOSConfig.h 头文件中的宏 configUSE_16_BIT_TICKS 为 0 时则为 32 位。 |
portBASE_TYPE | long | 根据处理器的架构来决定是多少位的,如果是 32/16/8bit 的处理器则是 32/16/8bit 的数据类型。一般用于定义函数的返回值或者布尔类型。 |
(一)数据类型相关前缀
- x前缀:通常用于表示指针类型或句柄类型的变量 。在 FreeRTOS 中,任务句柄TaskHandle_t、队列句柄QueueHandle_t、信号量句柄SemaphoreHandle_t等相关变量,常以x开头命名。例如,xTaskHandle表示任务句柄变量,xQueueHandle表示队列句柄变量,xSemaphoreHandle表示信号量句柄变量。这是因为这些句柄本质上是指向相应控制结构的指针,使用x作为前缀便于开发者快速识别变量的指针性质,在代码阅读和编写过程中,能直观地判断变量可用于对特定资源(任务、队列、信号量)的操作。
- ul前缀:代表无符号长整型(unsigned long)数据类型。在涉及到计数、优先级等需要较大取值范围的无符号数值变量时,常使用ul作为前缀。比如,ulTaskPriority用于表示任务优先级变量,由于任务优先级可能有多个级别,使用无符号长整型可以满足较大范围的优先级设定;ulSemaphoreCount表示信号量的计数值变量,在计数信号量中,计数值可能会在较大范围内变化,无符号长整型能确保计数值的准确记录。
- us前缀:表示无符号短整型(unsigned short)数据类型。该前缀常用于取值范围相对较小的变量,如队列长度变量。以usQueueLength为例,在大多数情况下,队列长度不会达到非常大的数值,使用无符号短整型既能满足需求,又能节省内存空间。
- e前缀:用于枚举(enumeration)类型的变量。在描述任务状态、队列状态等具有固定取值集合的情况时,会使用枚举类型。例如,eTaskState表示任务状态的枚举变量,其可能取值包括任务就绪状态、运行状态、阻塞状态等;eQueueError表示队列操作过程中可能出现的错误类型的枚举变量,如队列满、队列空等错误情况。通过e前缀,开发者可以快速识别该变量为枚举类型,从而了解其取值范围和用途。
(二)功能模块相关前缀
- 任务相关前缀:与任务相关的变量,除了句柄变量以x开头外,其他变量名称中通常会包含Task相关词汇。例如,xTaskStack表示任务堆栈变量,ulTaskDelay表示任务延时时间变量。这样的命名方式能明确变量与任务功能模块的关联,方便开发者在处理任务相关代码时,快速找到和理解相关变量的作用。
- 队列相关前缀:队列相关变量名称中会包含Queue相关词汇。如xQueueSendBuffer表示用于向队列发送数据的缓冲区变量,usQueueReceiveCount表示从队列中接收数据的计数变量。通过这种命名规则,在涉及队列操作的代码区域,开发者可以迅速辨别出与队列相关的变量,提高代码的可读性和可维护性。
- 信号量相关前缀:信号量相关变量名称中一般包含Semaphore相关词汇。例如,xMutexSemaphoreOwner表示互斥信号量的所有者变量,ulBinarySemaphoreValue表示二进制信号量的值变量。这种命名方式使得在处理信号量同步与互斥功能的代码中,变量的功能一目了然。
(三)宏定义
前缀 | 宏定义的文件 |
---|---|
port(举例,portMAX_DELAY) | portable.h |
task(举例,taskENTER_CRITICAL ()) | task.h |
pd(举例,pdTRUE) | projdefs.h |
config(举例,configUSE_PREEMPTION) | FreeRTOSConfig.h |
err(举例,errQUEUE_FULL) | projdefs.h |
宏 | 实际的值 |
---|---|
pdTRUE | 1 |
pdFALSE | 0 |
pdPASS | 1 |
pdFAIL | 0 |
二、变量命名与文件的关系
(一)核心源文件中的变量命名
- tasks.c和tasks.h:在任务管理的核心文件中,定义了大量与任务相关的变量。任务句柄变量如xCreatedTaskHandle,用于记录创建后的任务句柄,方便后续对任务进行操作;任务优先级变量ulTaskPriorityConfig,用于存储任务优先级的配置值,在任务创建或优先级调整时使用。这些变量的命名严格遵循任务相关的命名规则,通过名称可以清晰地判断其在任务管理中的具体功能,使得其他开发者在阅读和修改任务相关代码时,能够快速理解变量的用途和作用机制。
- queue.c和queue.h:队列相关文件中,变量命名围绕队列功能展开。例如,xQueueStorage表示队列的存储区域变量,用于存放队列中的数据;usQueueSizeLimit表示队列大小限制变量,用于控制队列能够容纳的数据项数量。在这些文件中,变量命名规则的应用使得队列操作的逻辑更加清晰,开发者可以根据变量名称准确地找到与队列创建、数据发送、数据接收等操作相关的变量,便于代码的编写和调试。
- semphr.c和semphr.h:信号量相关文件里,变量命名体现信号量的类型和功能。如xBinarySemaphoreInstance表示二进制信号量实例变量,xCountingSemaphoreResource表示计数信号量所管理的资源相关变量。这些变量名称符合信号量相关的命名规范,在实现信号量同步和互斥功能的代码中,通过变量名可以快速了解信号量的类型和用途,有助于开发者正确使用信号量进行任务间的协调。
(二)配置文件FreeRTOSConfig.h中的变量命名
FreeRTOSConfig.h文件主要通过宏定义来配置系统参数,但其中也存在一些与变量命名规则相关的体现。例如,configMAX_PRIORITIES定义了系统支持的最大任务优先级数量,虽然它是宏定义,但在概念上与任务优先级变量相关,其命名方式(使用大写字母加下划线)与变量命名规则中参考系统宏定义表意逻辑相呼应。又如,configQUEUE_REGISTRY_SIZE定义了队列注册表的大小,与队列相关变量命名中包含Queue词汇的规则一致。这些配置宏的命名方式,使得开发者在理解和修改系统配置时,能够基于统一的命名逻辑快速把握各配置项的含义,同时也为用户自定义与系统配置相关的变量提供了命名参考。
(三)应用程序文件中的变量命名
在用户编写的应用程序文件中,同样需要遵循 FreeRTOS 的变量命名规则。例如,在一个基于 FreeRTOS 的物联网数据采集项目中,创建任务用于采集传感器数据,可命名任务句柄变量为xSensorDataCollectionTaskHandle,符合任务句柄变量的命名规则;用于存储采集数据的队列句柄变量命名为xSensorDataQueueHandle,遵循队列句柄变量的命名规范。通过在应用程序中严格应用这些命名规则,不仅能使代码风格与 FreeRTOS 系统保持一致,提高代码的规范性,还能方便团队协作开发,不同开发者在阅读和维护代码时,能够迅速理解变量的功能和用途,降低沟通成本和代码出错的概率。
FreeRTOS文件介绍
FreeRTOS Plus 是 FreeRTOS 的商业扩展版本,它们有以下联系与区别:
联系
- 内核基础相同:FreeRTOS Plus 基于 FreeRTOS 开源内核构建。FreeRTOS 是一款广泛应用的小型实时操作系统内核,提供了任务管理、队列、信号量等基础实时功能,FreeRTOS Plus 继承了这些核心功能,在其基础上进行拓展和增强。
- 代码风格与编程接口相似:两者代码风格保持一致,遵循相似的编程规范和变量命名规则等。并且 FreeRTOS Plus 的很多编程接口与 FreeRTOS 相同,开发者如果熟悉 FreeRTOS 的开发,在使用 FreeRTOS Plus 时可以快速上手,例如任务创建函数
xTaskCreate
在两者中使用方式基本相同。
区别
- 功能丰富度:FreeRTOS Plus 增加了更多高级功能。比如它可能包含了安全相关功能,适用于对安全性要求较高的应用场景,像汽车电子、医疗设备等领域;还可能有更完善的中间件支持,如网络协议栈、文件系统等,而 FreeRTOS 内核本身相对基础,仅提供核心的实时操作系统功能。
- 商业支持与授权:FreeRTOS 是开源的,遵循 MIT 许可证,开发者可以免费使用、修改和分发其代码,适用于对成本敏感且技术能力较强、能够自行解决开发中问题的团队和个人。FreeRTOS Plus 是商业化产品,由 AWS(亚马逊网络服务)提供商业支持,购买其商业授权的用户可以获得官方的技术支持、更新维护等服务,适合对技术支持有需求、有一定预算的企业用户在商业项目中使用。
FreeRTOS文件结构
FreeRTOS
├── Demo
│ └── [各种硬件平台和编译器的示例项目文件夹]
├── Source
│ ├── include #存放FreeRTOS 的头文件,像FreeRTOS.h、task.h、queue.h等核心
│ │ ├── FreeRTOS.h #头文件。
│ │ ├── task.h
│ │ ├── queue.h
│ │ ├── semphr.h
│ │ ├── timers.h
│ │ ├── event_groups.h
│ │ └── ...(其他头文件)
│ ├── portable
│ │ ├── (compiler) # 如 GCC、IAR、Keil 等
│ │ │ └── (architecture) # 如 ARM_CM4、AVR、MSP430 等
│ │ │ ├── port.c
│ │ │ └── ...(其他平台相关文件)
│ │ └── MemMang
│ │ ├── heap_1.c
│ │ ├── heap_2.c
│ │ ├── heap_3.c
│ │ ├── heap_4.c
│ │ └── heap_5.c
│ ├── list.c
│ ├── queue.c
│ ├── tasks.c
│ ├── timers.c
│ ├── event_groups.c
│ └── ...(其他源文件)
└── FreeRTOSConfig.h # 系统配置文件
文件夹名称 | 内容介绍 | 用途 |
---|---|---|
Demo | 包含针对不同硬件平台和编译器的示例项目,如ARM_CM3 、AVR 等平台示例。 | 供开发者参考学习,快速了解 FreeRTOS 在不同环境下的应用方式,辅助开发和调试自己的项目。 |
include | 存放 FreeRTOS 的头文件,像FreeRTOS.h 、task.h 、queue.h 等核心头文件。 | 定义了 FreeRTOS 的各种数据类型、函数原型、宏定义等,是应用程序引用相关功能的必要文件。 |
portable | 包含与硬件平台相关的代码,针对不同编译器(如GCC 、IAR 、Keil )和处理器架构(如ARM 、AVR )有不同子文件夹。 | 用于将 FreeRTOS 移植到特定的硬件平台上,实现底层硬件交互和系统适配。 |
source | FreeRTOS 的核心源代码文件夹,包含tasks.c 、queue.c 、semphr.c 等源文件。 | 实现了任务管理、队列、信号量、定时器等核心功能,是 FreeRTOS 的功能主体部分。 |
MemMang | 内存管理相关的源文件,如heap_1.c 、heap_2.c 、heap_3.c 、heap_4.c 、heap_5.c 。 | 提供不同的内存分配策略,开发者可根据项目需求选择合适的内存管理方案。 |
其他:
Test | 存放 FreeRTOS 相关测试代码和资源的文件夹,用于对 FreeRTOS 的功能进行测试和验证,确保其稳定性、正确性和可靠性 | - CMock :单元测试框架相关内容,用于编写和运行单元测试,如对内核及功能模块进行功能验证。- CBMC :可能包含与 C 有界模型检查器相关的配置或测试脚本,用于对 FreeRTOS 代码进行形式化验证。- 按功能模块划分的测试代码文件夹,如 Queue 、Semaphore 等文件夹,包含针对相应功能的测试用例,用于验证队列、信号量等功能的正确性。- 可能存在与特定硬件平台相关的测试代码,用于在不同硬件环境下对 FreeRTOS 进行测试。 - 测试框架相关的文件,用于组织、执行测试用例,以及生成测试报告等。 |
LICENSE 文件 | 主要的许可证文本文件,一般位于项目根目录。 | 包含 FreeRTOS 所采用的 MIT 许可证的详细条款,如允许自由使用、修改和分发软件,但需保留版权声明等内容;可能还会提及其他与许可证相关的注意事项。 | 明确软件使用、分发、修改的权限和条件,保障开源软件使用的合规性,让使用者清楚在该许可证下的权利和义务。 |
NOTICE 文件 | 可能存在的通知文件,记录第三方组件的版权和许可信息。 | 列出 FreeRTOS 中所依赖的第三方组件(如某些库或工具)的版权声明,以及使用这些组件的特殊许可要求。 | 告知使用者关于第三方组件的相关许可情况,确保在使用过程中不违反第三方的版权和许可规定。 |
源文件头部 | 每个源文件开头部分包含的版权和许可声明。 | 一般会包含版权信息(如版权所有者、版权年份等)以及使用该文件的许可声明,通常以注释形式存在。 | 强调每个源文件的版权归属和许可使用方式,方便开发者了解该文件的使用限制和条件。 |