freertos移植
freertos移植
domffreertos简介
简介
FreeRTOS(Free Real-Time Operating System)是一个免费的实时操作系统内核,专为小型、资源受限的嵌入式系统设计。它非常适合应用于微控制器(MCU)和物联网(IoT)设备上,因为这些设备通常具有有限的计算能力和内存资源。
以下是一些关于FreeRTOS的关键特性:
-
轻量级:FreeRTOS内核非常小巧,可以根据具体的应用需求进行裁剪,使得它能够在非常有限的硬件资源上运行。
-
开放源代码:FreeRTOS的源代码是公开的,这允许开发者查看并修改代码以适应特定的需求。
-
可移植性:FreeRTOS可以被移植到多种不同的微控制器架构上,这增加了它的适用范围。
-
任务管理:FreeRTOS支持创建和管理多个任务,即用户定义的函数,这些任务可以并发运行。系统负责调度这些任务,确保它们按照优先级顺序得到执行。
-
任务间通信:提供了多种任务间通信机制,包括信号量、消息队列和互斥锁等,帮助协调不同任务间的资源共享和同步。
-
定时器:软件定时器功能允许任务在指定的时间间隔后自动唤醒执行。
-
免费:相比于一些商业RTOS,FreeRTOS是完全免费且没有许可费用的,这对于成本敏感的项目来说是一个很大的优势。
-
灵活性:FreeRTOS支持多种调度算法,可以根据应用的具体需求选择最合适的调度策略。
FreeRTOS最初由Richard Barry在2003年开发,并在之后得到了广泛的采用。直到2018年,FreeRTOS被亚马逊收购,并成为AWS IoT平台的一部分,进一步增强了其在网络连接和安全方面的功能。FreeRTOS的最新版本已经发展到了支持更多高级特性的程度,并且仍然保持了其作为一款易于使用的实时操作系统的核心优势。
目的
我准备写一个freertos的系类文章,但文章的目的在于记录一些最常用的实时操作的通用功能,加强对rtos的使用,以及记录常用代码方便查看。计划有任务管理、队列、信号量、事件组、以及任务通知这5篇文章,主要记录学习巩固过程,所以并不会吧所有功能细节都展示出来。所以你如果想更加详细的学习freertos可以在这两个网站学习。
- FreeFtos官方文档:https://www.freertos.org/zh-cn-cmn-s/Documentation/00-Overview
- 百问网:https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter1.html
工程创建
基础程序创建
基于cubemx来创建hal库,虽然cubemx中可以直接配置freertos,但是其api都是被cmsics标准给封装了一层,不够纯净不利于用来学习freertos,所以我们只生成基础工程,这里可以参考我一直freemodus的文章,所以我直接放一些关键的设置截图就不赘述了。
-
时钟
freertos的心跳时钟是systick,hal库的基础时钟设置成tim6防止冲突
-
串口
用于调试输出
-
nvic设置
不生成这几个中断回调,应为freertos中会定义并使用这几个中断
-
gpio
用于按键和led驱动初始化
-
生成设置
freertos源码下载
在官网下载 https://www.freertos.org/zh-cn-cmn-s 本次我下载的式FreeRTOSv202406.01-LTS版本。
下载完成后解压,将FreeRTOSv202406.01-LTS\FreeRTOS-LTS\FreeRTOS\
目录下的整个FreeRTOS-Kernel
文件夹拷贝一份出来,此文件就是freertos的内核源码了。然后删除一些文件来精简体积。
根目录下的c文件就是核心源码,portable下是移植接口文件,examples下是实例代码
文件删除完毕,我们将port文件和内存管理文件放在同一个文件夹下方便管理,将F407HAL_FreeRtos\FreeRTOS-Kernel\portable\RVDS\ARM_CM4F
下的所有文件复制到F407HAL_FreeRtos\FreeRTOS-Kernel\portable\MemMang
里面,这个文件夹里原来是freertos的5种内存管理文件,一般情况下我们都使用的内存管理4。
然后将 F407HAL_FreeRtos\FreeRTOS-Kernel\examples\template_configuration
文件夹下的 FreeRTOSConfig.h
复制到 F407HAL_FreeRtos\FreeRTOS-Kernel\include
目录下。这是freertos的配置文件。
keil工程整合
keil添加新文件
其中multibutton是一个按键驱动库,这里可以直接当作没有-后续可能会出一篇文章介绍。
添加头文件包含
配置文件修改
对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_PRIORITY
和configMAX_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 |
至此freertos的移植就完成了🙌。
这里是这个文章freertos的总仓库 github
https://github.com/freedom413/FreeRtosDemo.git