freertos移植

freertos简介

简介

FreeRTOS(Free Real-Time Operating System)是一个免费的实时操作系统内核,专为小型、资源受限的嵌入式系统设计。它非常适合应用于微控制器(MCU)和物联网(IoT)设备上,因为这些设备通常具有有限的计算能力和内存资源。

以下是一些关于FreeRTOS的关键特性:

  1. 轻量级:FreeRTOS内核非常小巧,可以根据具体的应用需求进行裁剪,使得它能够在非常有限的硬件资源上运行。

  2. 开放源代码:FreeRTOS的源代码是公开的,这允许开发者查看并修改代码以适应特定的需求。

  3. 可移植性:FreeRTOS可以被移植到多种不同的微控制器架构上,这增加了它的适用范围。

  4. 任务管理:FreeRTOS支持创建和管理多个任务,即用户定义的函数,这些任务可以并发运行。系统负责调度这些任务,确保它们按照优先级顺序得到执行。

  5. 任务间通信:提供了多种任务间通信机制,包括信号量、消息队列和互斥锁等,帮助协调不同任务间的资源共享和同步。

  6. 定时器:软件定时器功能允许任务在指定的时间间隔后自动唤醒执行。

  7. 免费:相比于一些商业RTOS,FreeRTOS是完全免费且没有许可费用的,这对于成本敏感的项目来说是一个很大的优势。

  8. 灵活性:FreeRTOS支持多种调度算法,可以根据应用的具体需求选择最合适的调度策略。

FreeRTOS最初由Richard Barry在2003年开发,并在之后得到了广泛的采用。直到2018年,FreeRTOS被亚马逊收购,并成为AWS IoT平台的一部分,进一步增强了其在网络连接和安全方面的功能。FreeRTOS的最新版本已经发展到了支持更多高级特性的程度,并且仍然保持了其作为一款易于使用的实时操作系统的核心优势。

目的

我准备写一个freertos的系类文章,但文章的目的在于记录一些最常用的实时操作的通用功能,加强对rtos的使用,以及记录常用代码方便查看。计划有任务管理、队列、信号量、事件组、以及任务通知这5篇文章,主要记录学习巩固过程,所以并不会吧所有功能细节都展示出来。所以你如果想更加详细的学习freertos可以在这两个网站学习。

  1. FreeFtos官方文档:https://www.freertos.org/zh-cn-cmn-s/Documentation/00-Overview
  2. 百问网:https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter1.html

工程创建

基础程序创建

基于cubemx来创建hal库,虽然cubemx中可以直接配置freertos,但是其api都是被cmsics标准给封装了一层,不够纯净不利于用来学习freertos,所以我们只生成基础工程,这里可以参考我一直freemodus的文章,所以我直接放一些关键的设置截图就不赘述了。

  • 时钟
    freertos的心跳时钟是systick,hal库的基础时钟设置成tim6防止冲突
    image.png
    image.png

  • 串口
    用于调试输出
    image.png
    image.png

  • nvic设置
    不生成这几个中断回调,应为freertos中会定义并使用这几个中断
    image.png

  • gpio
    用于按键和led驱动初始化
    image.png

  • 生成设置
    image.png

freertos源码下载

在官网下载 https://www.freertos.org/zh-cn-cmn-s 本次我下载的式FreeRTOSv202406.01-LTS版本。
下载完成后解压,将FreeRTOSv202406.01-LTS\FreeRTOS-LTS\FreeRTOS\目录下的整个FreeRTOS-Kernel文件夹拷贝一份出来,此文件就是freertos的内核源码了。然后删除一些文件来精简体积。
根目录下的c文件就是核心源码,portable下是移植接口文件,examples下是实例代码

image.png
image.png

文件删除完毕,我们将port文件和内存管理文件放在同一个文件夹下方便管理,将F407HAL_FreeRtos\FreeRTOS-Kernel\portable\RVDS\ARM_CM4F下的所有文件复制到F407HAL_FreeRtos\FreeRTOS-Kernel\portable\MemMang里面,这个文件夹里原来是freertos的5种内存管理文件,一般情况下我们都使用的内存管理4。
image.png

然后将 F407HAL_FreeRtos\FreeRTOS-Kernel\examples\template_configuration 文件夹下的 FreeRTOSConfig.h复制到 F407HAL_FreeRtos\FreeRTOS-Kernel\include目录下。这是freertos的配置文件。
image.png

keil工程整合

keil添加新文件
其中multibutton是一个按键驱动库,这里可以直接当作没有-后续可能会出一篇文章介绍。
image.png
image.png

添加头文件包含
image.png

配置文件修改

对FreeRTOSConfig.h文件进行修改,例如针对Cortex-M内核,需修改的部分:
configCPU_CLOCK_HZ 系统时钟我们这里是168000000-根据实际情况修改。
configSYSTICK_CLOCK_HZ 1ms调度一次就设置成1000HZ系统滴答周期。
configMAX_PRIORITIES 最大的FreeRTOS任务优先级值,建议设置成16. 注意:FreeRTOS中的任务优先级是值越小优先级越低,而例如Cortex-M内核中的中断优先级则是其值越小优先级越高!可以参考FreeRTOS官方文档
configTICK_TYPE_WIDTH_IN_BITS 修改为TICK_TYPE_WIDTH_32_BITS
configKERNEL_INTERRUPT_PRIORITY 内核中断优先级,一般建议设置成0x0f,也就是最低优先级。
configMAX_SYSCALL_INTERRUPT_PRIORITYconfigMAX_API_CALL_INTERRUPT_PRIORITY 最大调用优先级,例如设置为0x50,因为Cortex-M内核使用高4位作为优先级位,而低4位则弃用。所以,等级低于优先级5(数值上大于5)的任务则接受FreeRTOS任务调用,会被中断,而高于优先级5(数值上小于5)的任务则不会被中断。这里的高于5和低于5是按照Cortex-M内核里面的优先级逻辑来计算的。详细介绍参考FreeRTOS官方文档。
configCHECK_FOR_STACK_OVERFLOW 设置为1和2对应不同的堆栈溢出处理逻辑,如此值非0,则需实现钩子函数vApplicationStackOverflowHook的定义,用于在堆栈溢出时调用此钩子函数。
configUSE_CO_ROUTINES 是否使用协程。一般为资源紧缺的MCU准备,已计划停止维护更新,所以一般关掉不用。
configENABLE_TRUSTZONE TrustZone使能,如不使用,则关掉。
configENABLE_MPU MPU使能,如不使用,则关掉。
configENABLE_FPU FPU使能,如不使用,则关掉。
configENABLE_MVE MVE使能,如不使用,则关掉。
configCHECK_HANDLER_INSTALLATION 用于对SVC call和PendSV调用指针检查,建议打开。
并在FreeRTOSConfig.h文件末尾的有效位置加入如下代码来使得系统自动调用port.c中的SVC call和PendSV函数,而非stm32f10x_it.c中的PendSV_Handler、SysTick_Handler和SVC_Handler函数,否则会出现调用stm32f10x_it.c的SVC_Handler函数后直接跳入HardFault_Handler函数导致程序崩溃。

1
2
3
#define vPortSVCHandler     SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

至此freertos的移植就完成了🙌。
这里是这个文章freertos的总仓库 github https://github.com/freedom413/FreeRtosDemo.git