0%

FreeRTOS学习

FreeRTOS学习

​ 以下内容根据刀哥的文档,进行学习和总结。

FreeRTOS概述

  • 如图,是我们从官网下载的FreeRTOS的文件及其每个文件的讲解。
  • 移植到工程中,暂时不在这里讲,其他地方有讲,可以进行搜索。
  • 主要的文件是:
    • Demo
      • 存在着,在不同系统上的示例工程。
    • source
      • 根目录的和兴文件。

编程规范

  • TickType_t:

    • TickType_t是一个无符号整数类型,用于系统节拍(tick)的计数。

    • 在FreeRTOS中配置着一个周期性的中断:Tick Interrupt。

    • 每次发生中断,中断有一个TICK_Count计数累加。FreeRTOS 启动以来发生的系统时钟节拍的总数。

    • TICK_Count变量的类型是TickType_t类型的。

    • TickType_t可能是uint16-t或者uint32-t的。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      在32位架构中,我们一般设置为uint32-t。

      FreeRTOSConfig.h
      #define configUSE_16_BIT_TICKS 0 //系统节拍计数器变量数据类型,

      portmacro.h
      #if( configUSE_16_BIT_TICKS == 1 )
      typedef uint16_t TickType_t;
      #define portMAX_DELAY ( TickType_t ) 0xffff
      #else
      typedef uint32_t TickType_t;
      #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
    • 时间单位:每个系统节拍维持时间由configTICK_RATE_HZ这个宏来定义。

      1
      2
      3
      4
      5
      6
      7
      8

      FreeRTOSConfig.h
      #define configTICK_RATE_HZ (1000) //时钟节拍频率,也就是每秒的时钟节拍数,这里设置为1000,周期就是1ms,1秒钟中1000次节拍,1ms一次节拍

      portmacro.h
      #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
      1000表示1000ms
      1000 / configTICK_RATE_HZ:表示每个节拍维持的时间为1ms。
  • BaseType_t

    • 一个基本整数类型,通常用于布尔值或者函数的调用状态。

    • 在32位架构中,他是uint32-t类型。

      1
      2
      portmacro.h
      typedef long BaseType_t;
  • 变量名前缀:

  • 函数名前缀

  • 宏的前缀

内存管理

  • task、queue、semaphores、event group等,通常使用的是动态分配:用时分配,不用时释放。
  • 在C语言库函数中,由malloc、free函数,但是在FreeRTOS中不适用:
    • 不适合用在资源紧缺的嵌入式系统中。
    • 可能会造成内存碎片化
    • 函数实现过于复杂,占用太多代码空间。
  • 在FreeRTOS由专门的内存管理文件:
    • heap_1.c文件
      • 只分配,不释放:在代码中只实现了pvPortMalloc函数,没有实现vPortFree函数。
      • 原理:先定义一个大数组,调用pvPortMalloc时,在数组中分配空间。
    • heap_2.c文件
      • 可分配,可释放:在函数中实现了pvPortMalloc和vPortFree。
      • 采用了最佳匹配算法来分配空间。
      • 碎片化:他不会合并空闲相邻的内存,会造成严重的碎片化问题。
      • 速度:比heap1分配速度要慢,但是比C库函数malloc、free速度要快。
    • heap_3.c文件
      • 直接使用C库中malloc、free函数。
      • 不是线程安全的。标准库的 malloc()free() 通常不是为多任务环境设计的,可能存在竞态条件。因此,FreeRTOS 会在调用这些函数时禁用调度器,以确保线程安全,但这可能会影响实时性。
    • heap_4.c文件
      • 同样使用大数组分配内存。
      • 合并空闲内存:heap4使用first fit来分配内存,并且可以将相邻的空闲内存块合并。
    • heap_5.c文件
      • heap_5: 分配内存、释放内存的算法跟heap_4相同。
      • heap_5不在局限于在一个大的数组中进行内存管理。允许从多个不连续的内存区域分配内存。