FreeRTOS学习笔记二【源码文件介绍及命名规范】

FreeRTOS学习笔记二【源码文件介绍及命名规范】


本文介绍源码中的命名规范,下篇开始介绍FreeRTOS中的任务管理。

源码文件介绍

Free RTOS源码中包含了内核、内核配置、各个厂家的微处理器的移植、多种内存管理方案、大量的demo。
下面从使用的角度介绍源码中的文件。

  1. 核心共用代码
    Free RTOS中实现最基本的任务调度功能只需要两个文件,及task.c和list.c,task用于任务的创建、调度、删除等操作,list是一个双向链表,用于存储任务块或其他数据。除此之外,如果还需要其他功能,则包含实现相应功能的文件即可。这些文件全部位于FreeRTOS/Source文件夹下。
  • queue.c
    queue.c提供队列和信号量两个功能。但是实际使用中queue.c总是会使用。
  • timers.c
    timers.c提供软件定时功能。
  • event_groups.c
    event_groups.c提供事件组功能。同时管理多个事件,类似与简化版的select(poll)功能。
  1. 特定于项目的内核配置
    FreeRTOS的内核配置文件名为FreeRTOSConfig.h,其中包含了大量宏定义,用于配置内核。在创建一个Free RTOS工程时可以直接从demo中选取功能接近的项目中的配置文件,然后根据自己的实际需求调整,不建议从头开始编写该文件。该文件位于用户的应用程序目录。
  2. 特定于项目的移植相关
    项目相关的移植源码位于FreeRTOS/Source/portable目录下,其中又包含项目使用的编译器和处理器,例如:项目使用的编译器使用的是IAR,处理器使用的是arm cortex m3的处理器,那么移植相关的源码就位于FreeRTOS\Source\portable\IAR\ARM_CM3。
  3. 内存管理方案选择
    FreeRTOS提供了五个内存分配方案。 这五个方案名为heap_1到heap_5,分别由源文件heap_1.c到heap_5.c实现,具体后面介绍。 它们位于FreeRTOS/Source/portable/MemMang目录中。 如果已将FreeRTOS配置为使用动态内存分配,则必须在项目中构建这五个源文件中的一个,或者提供一个自己实现的分配方案。

源码中的命名规范

两个重要数据类型

FreeRTOS每个特定的移植文件中都包含portmacro.h文件,其中包含两个数据类型,TickType_t 和 BaseType_t。

  • TickType_t
    FreeRTOS中有一个节拍中断,系统从启动开始发生的节拍中断的计数称为节拍计数,它将是整个RTOS的时间度量。
    TickType_t用于保存节拍计数和指定的时间的数据类型,它可以是无符号的16bit类型,也可以是无符号32bit类型,具体取决于FreeRTOSConfig.h中configUSE_16_BIT_TICKS的设置。 如果configUSE_16_BIT_TICKS设置为1,则TickType_t定义为uint16_t。 如果configUSE_16_BIT_TICKS设置为0,则TickType_t定义为uint32_t。通常,在8位和16位处理器上使用uint16_t,以提高效率,但会限制了最大时间周期,而在32位处理器上使用uint32_t。
  • BaseType_t
    它用于数值范围有限的返回类型和布尔类型。在8位处理器上为8位类型,16位上为16位类型,32位上为32位类型。

注:不同的编译器对char类型的实现可能不同,一些是unsigned,一些是signed,所以FreeRTOS明确规定char只能用于保存ASCII字符或者指向char的指针(字符串),其他地方使用signed或unsigned,同时也不使用简单的int类型(不同编译器实现的长度不一)。

变量名

所有变量在名字前加上它类型的前缀,如:‘c’表示char,‘s’表示int16_t(short),‘l’表示int32_t(long),‘x’表示BaseType_t和任何其他非标准类型(结构体,任务句柄,队列句柄d等)。如果变量是无符号类型,则添加前缀’u’,如果变量是指针,添加前缀’p’,例如,uint8_t类型的变量添加前缀’uc’,指向char类型的指针变量则添加前缀’pc’。

函数名

函数名添加它的返回类型和它所在的文件为前缀。如

  • vTaskPrioritySet()返回一个void,并在task.c中定义。
  • xQueueReceive()返回BaseType_t类型的变量,并在queue.c中定义。
  • pvTimerGetTimerID()返回指向void的指针,并在timers.c中定义。
  • 在文件内部的局部函数添加’prv’(private)。

宏名

宏名用大写字母表示,添加小写前缀表示定义它的位置。如下表。

前缀 定义的位置
port (例:portMAX_DELAY) portable.h或portmacro.h
task (例:taskENTER_CRITICAL()) task.h
pd (例:pdTRUE) projdefs.h
config (例:configUSE_PREEMPTION) FreeRTOSConfig.h
err (例:errQUEUE_FULL) projdefs.h

注:信号量API是用宏编写的,但是它遵循的是函数名的规范。

下表是几个常用宏的值。

宏定义
pdTRUE 1
pdFALSE 0
pdPASS 1
pdFAIL 0

参考

Free RTOS官网

猜你喜欢

转载自blog.csdn.net/qq_25370227/article/details/86502513