找回密码
 立即注册
首页 业界区 安全 FreeRTOS

FreeRTOS

汝雨竹 昨天 12:32
初识FreeRTOS

什么是FreeRTOS

RTOS (实时操作系统)并不是指某一特定的操作系统,而是指一类操作系统,例如, µC/OS,FreeRTOS, RTX, RT-Thread 等这些都是 RTOS 类的操作系统。 因此,从 FreeRTOS 的名字中就能看出, FreeROTS 是一款免费的实时操作系统。
操作系统是允许多个任务“同时运行” 的,  然而实际上, 一个 CPU 核心在某一时刻只能运行一个任务,而操作系统中任务调度器的责任就是决定在某一时刻 CPU 究竟要运行哪一个任务,任务调度器使得 CPU 在各个任务之间来回切换并处理任务, 由于切换处理任务的速度非常快,因此就给人造成了一种同一时刻有多个任务同时运行
的错觉。
FreeRTOS 是众多 RTOS 类操作系统中的一种, FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然了, FreeRTOS 也不仅仅局限于在微控制器中使用。 就单从文件数量上来看 FreeRTOS 要比 µC/OS 少得多。
为什么选择FreeRTOS


  • 免费
  • 简单
  • 使用广泛
  • 资料齐全
  • 可移植性强
FreeRTOS的特点

1.png

FreeRTOS移植

使用CubeMX快速移植


  • 在 SYS 选项里,将 Debug 设为 Serial Wire ,并且将 Timebase Source 设为 TIM2 (其它定时器也行)。为何要如此配置?下文解说。

  • 将 RCC 里的 HSE 设置为 Crystal/Ceramic Resonator
    3.png

  • 时钟按下图配置
    4.png

  • 选择 FREERTOS 选项,并将 Interface 改为 CMSIS_V1 。V1 和 V2 有啥区别?下文解释。
    5.png

  • 配置项目信息,并导出代码。
    6.png

    一些常见问题

    • Timebase Source 为什么不能设置为 SysTick ?裸机的时钟源默认是 SysTick,但是开启FreeRTOS 后,FreeRTOS会占用 SysTick (用来生成1ms 定时,用于任务调度),所以需要为其他总线提供另外的时钟源。
    • FreeRTOS 版本问题
      V2 的内核版本更高,功能更多,在大多数情况下 V1 版本的内核完全够用。
    • FreeRTOS 各配置选项卡的解释
    • Events:事件相关的创建
      7.png

      Task and Queues: 任务与队列的创建
      Timers and Semaphores: 定时器和信号量的创建
      Mutexes: 互斥量的创建
      FreeRTOS Heap Usage: 用于查看堆使用情况
      config parameters: 内核参数设置,用户根据自己的实际应用来裁剪定制 FreeRTOS 内核 Include parameters: FreeRTOS 部分函数的使能
      User Constants: 相关宏的定义,可以自建一些常量在工程中使用
      Advanced settings:高级设置

FreeRTOS系统配置

FreeRTOSConfig.h 文件

FreeRTOS 使用 FreeRTOSConfig.h 文件进行配置和裁剪。 FreeRTOSConfig.h 文件中有几十个配置项,这使得用户能够很好地配置和裁剪 FreeRTOS。
FreeRTOSConfig.h 文件中的配置项可分为三大类:“config”配置项、“INCLUDE”配置项和其他配置项。
[code]#ifndef FREERTOS_CONFIG_H#define FREERTOS_CONFIG_H/* 头文件 */#include "./SYSTEM/sys/sys.h"#include "./SYSTEM/usart/usart.h"#include extern uint32_t SystemCoreClock;/* 基础配置项 */#define configUSE_PREEMPTION                            1                       /* 1: 抢占式调度器, 0: 协程式调度器, 无默认需定义 */#define configUSE_PORT_OPTIMISED_TASK_SELECTION         1                       /* 1: 使用硬件计算下一个要运行的任务, 0: 使用软件算法计算下一个要运行的任务, 默认: 0 */#define configUSE_TICKLESS_IDLE                         0                       /* 1: 使能tickless低功耗模式, 默认: 0 */#define configCPU_CLOCK_HZ                              SystemCoreClock         /* 定义CPU主频, 单位: Hz, 无默认需定义 */#define configSYSTICK_CLOCK_HZ                          (configCPU_CLOCK_HZ / 8)/* 定义SysTick时钟频率,当SysTick时钟频率与内核时钟频率不同时才可以定义, 单位: Hz, 默认: 不定义 */#define configTICK_RATE_HZ                              1000                    /* 定义系统时钟节拍频率, 单位: Hz, 无默认需定义 */#define configMAX_PRIORITIES                            32                      /* 定义最大优先级数, 最大优先级=configMAX_PRIORITIES-1, 无默认需定义 */#define configMINIMAL_STACK_SIZE                        128                     /* 定义空闲任务的栈空间大小, 单位: Word, 无默认需定义 */#define configMAX_TASK_NAME_LEN                         16                      /* 定义任务名最大字符数, 默认: 16 */#define configUSE_16_BIT_TICKS                          0                       /* 1: 定义系统时钟节拍计数器的数据类型为16位无符号数, 无默认需定义 */#define configIDLE_SHOULD_YIELD                         1                       /* 1: 使能在抢占式调度下,同优先级的任务能抢占空闲任务, 默认: 1 */#define configUSE_TASK_NOTIFICATIONS                    1                       /* 1: 使能任务间直接的消息传递,包括信号量、事件标志组和消息邮箱, 默认: 1 */#define configTASK_NOTIFICATION_ARRAY_ENTRIES           1                       /* 定义任务通知数组的大小, 默认: 1 */#define configUSE_MUTEXES                               1                       /* 1: 使能互斥信号量, 默认: 0 */#define configUSE_RECURSIVE_MUTEXES                     1                       /* 1: 使能递归互斥信号量, 默认: 0 */#define configUSE_COUNTING_SEMAPHORES                   1                       /* 1: 使能计数信号量, 默认: 0 */#define configUSE_ALTERNATIVE_API                       0                       /* 已弃用!!! */#define configQUEUE_REGISTRY_SIZE                       8                       /* 定义可以注册的信号量和消息队列的个数, 默认: 0 */#define configUSE_QUEUE_SETS                            1                       /* 1: 使能队列集, 默认: 0 */#define configUSE_TIME_SLICING                          1                       /* 1: 使能时间片调度, 默认: 1 */#define configUSE_NEWLIB_REENTRANT                      0                       /* 1: 任务创建时分配Newlib的重入结构体, 默认: 0 */#define configENABLE_BACKWARD_COMPATIBILITY             0                       /* 1: 使能兼容老版本, 默认: 1 */#define configNUM_THREAD_LOCAL_STORAGE_POINTERS         0                       /* 定义线程本地存储指针的个数, 默认: 0 */#define configSTACK_DEPTH_TYPE                          uint16_t                /* 定义任务堆栈深度的数据类型, 默认: uint16_t */#define configMESSAGE_BUFFER_LENGTH_TYPE                size_t                  /* 定义消息缓冲区中消息长度的数据类型, 默认: size_t *//* 内存分配相关定义 */#define configSUPPORT_STATIC_ALLOCATION                 0                       /* 1: 支持静态申请内存, 默认: 0 */#define configSUPPORT_DYNAMIC_ALLOCATION                1                       /* 1: 支持动态申请内存, 默认: 1 */#define configTOTAL_HEAP_SIZE                           ((size_t)(10 * 1024))   /* FreeRTOS堆中可用的RAM总量, 单位: Byte, 无默认需定义 */#define configAPPLICATION_ALLOCATED_HEAP                0                       /* 1: 用户手动分配FreeRTOS内存堆(ucHeap), 默认: 0 */#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP       0                       /* 1: 用户自行实现任务创建时使用的内存申请与释放函数, 默认: 0 *//* 钩子函数相关定义 */#define configUSE_IDLE_HOOK                             0                       /* 1: 使能空闲任务钩子函数, 无默认需定义  */#define configUSE_TICK_HOOK                             0                       /* 1: 使能系统时钟节拍中断钩子函数, 无默认需定义 */#define configCHECK_FOR_STACK_OVERFLOW                  0                       /* 1: 使能栈溢出检测方法1, 2: 使能栈溢出检测方法2, 默认: 0 */#define configUSE_MALLOC_FAILED_HOOK                    0                       /* 1: 使能动态内存申请失败钩子函数, 默认: 0 */#define configUSE_DAEMON_TASK_STARTUP_HOOK              0                       /* 1: 使能定时器服务任务首次执行前的钩子函数, 默认: 0 *//* 运行时间和任务状态统计相关定义 */#define configGENERATE_RUN_TIME_STATS                   0                       /* 1: 使能任务运行时间统计功能, 默认: 0 */#if configGENERATE_RUN_TIME_STATS#include "./BSP/TIMER/btim.h"#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()        ConfigureTimeForRunTimeStats()extern uint32_t FreeRTOSRunTimeTicks;#define portGET_RUN_TIME_COUNTER_VALUE()                FreeRTOSRunTimeTicks#endif#define configUSE_TRACE_FACILITY                        1                       /* 1: 使能可视化跟踪调试, 默认: 0 */#define configUSE_STATS_FORMATTING_FUNCTIONS            1                       /* 1: configUSE_TRACE_FACILITY为1时,会编译vTaskList()和vTaskGetRunTimeStats()函数, 默认: 0 *//* 协程相关定义 */#define configUSE_CO_ROUTINES                           0                       /* 1: 启用协程, 默认: 0 */#define configMAX_CO_ROUTINE_PRIORITIES                 2                       /* 定义协程的最大优先级, 最大优先级=configMAX_CO_ROUTINE_PRIORITIES-1, 无默认configUSE_CO_ROUTINES为1时需定义 *//* 软件定时器相关定义 */#define configUSE_TIMERS                                1                               /* 1: 使能软件定时器, 默认: 0 */#define configTIMER_TASK_PRIORITY                       ( configMAX_PRIORITIES - 1 )    /* 定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义 */#define configTIMER_QUEUE_LENGTH                        5                               /* 定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义 */#define configTIMER_TASK_STACK_DEPTH                    ( configMINIMAL_STACK_SIZE * 2) /* 定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义 *//* 可选函数, 1: 使能 */#define INCLUDE_vTaskPrioritySet                        1                       /* 设置任务优先级 */#define INCLUDE_uxTaskPriorityGet                       1                       /* 获取任务优先级 */#define INCLUDE_vTaskDelete                             1                       /* 删除任务 */#define INCLUDE_vTaskSuspend                            1                       /* 挂起任务 */#define INCLUDE_xResumeFromISR                          1                       /* 恢复在中断中挂起的任务 */#define INCLUDE_vTaskDelayUntil                         1                       /* 任务绝对延时 */#define INCLUDE_vTaskDelay                              1                       /* 任务延时 */#define INCLUDE_xTaskGetSchedulerState                  1                       /* 获取任务调度器状态 */#define INCLUDE_xTaskGetCurrentTaskHandle               1                       /* 获取当前任务的任务句柄 */#define INCLUDE_uxTaskGetStackHighWaterMark             1                       /* 获取任务堆栈历史剩余最小值 */#define INCLUDE_xTaskGetIdleTaskHandle                  1                       /* 获取空闲任务的任务句柄 */#define INCLUDE_eTaskGetState                           1                       /* 获取任务状态 */#define INCLUDE_xEventGroupSetBitFromISR                1                       /* 在中断中设置事件标志位 */#define INCLUDE_xTimerPendFunctionCall                  1                       /* 将函数的执行挂到定时器服务任务 */#define INCLUDE_xTaskAbortDelay                         1                       /* 中断任务延时 */#define INCLUDE_xTaskGetHandle                          1                       /* 通过任务名获取任务句柄 */#define INCLUDE_xTaskResumeFromISR                      1                       /* 恢复在中断中挂起的任务 *//* 中断嵌套行为配置 */#ifdef __NVIC_PRIO_BITS    #define configPRIO_BITS __NVIC_PRIO_BITS#else    #define configPRIO_BITS 4#endif#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15                  /* 中断最低优先级 */#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                   /* FreeRTOS可管理的最高中断优先级 */#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY
您需要登录后才可以回帖 登录 | 立即注册