| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32--FreeRTOS系统学习(一):系统下载移植以及跑马灯测试 -> 正文阅读 |
|
[嵌入式]STM32--FreeRTOS系统学习(一):系统下载移植以及跑马灯测试 |
以下内容皆是个人学习过程中的总结,记录一下整个过程,用于后期复习,如有不对之处,麻烦各位大佬指出~一、什么是FreeRTOS我们看一下 FreeRTOS 的名字,可以分为两部分:Free 和 RTOS,Free 就是免费的、自由的、 不受约束的意思,RTOS 全称是 Real Time Operating System,中文名就是实时操作系统。可以看 出 FreeROTS 就是一个免费的 RTOS 类系统。这里要注意,RTOS 不是指某一个确定的系统,而 是指一类系统。比如 UCOS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。 操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻 只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任 务调度在各个任务之间的切换非常快!这就给人们造成了同一时刻有多个任务同时运行的错觉。 操作系统的分类方式可以由任务调度器的工作方式决定,比如有的操作系统给每个任务分 配同样的运行时间,时间到了就轮到下一个任务,Unix 操作系统就是这样的。 RTOS 的任务调 度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,实时环境中要求操作系统必 须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像 FreeRTOS 这 种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据 此优先级来决定下一刻应该运行哪个任务。 FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运 行,当然了,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比 UCOSII 和 UCOSIII 小的多。 二、FreeRTOS特点FreeRTOS 是一个可裁剪的小型 RTOS 系统,其特点包括: ● FreeRTOS 的内核支持抢占式,合作式和时间片调度。 ● SafeRTOS 衍生自 FreeRTOS,SafeRTOS 在代码完整性上相比 FreeRTOS 更胜一筹。 ● 提供了一个用于低功耗的 Tickless 模式。 ● 系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、 软件定时器等等。 ● 已经在超过 30 种架构的芯片上进行了移植。 ● FreeRTOS-MPU 支持 Corex-M 系列中的 MPU 单元,如 STM32F103。 ● FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。 ● 高可移植性,代码主要 C 语言编写。 ● 支持实时任务和协程(co-routines 也有称为合作式、协同程序,本教程均成为协程)。 ● 任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信 号量、递归互斥信号量和互斥信号量进行通信和同步。 ● 创新的事件组(或者事件标志)。 ● 具有优先级继承特性的互斥信号量。 ● 高效的软件定时器。 ● 强大的跟踪执行功能。 ● 堆栈溢出检测功能。 ● 任务数量不限。 ● 任务优先级不限。 三、FreeRTOS系统下载首先我们需要去到FreeRTOS系统管网下载他们的源码,官网地址是:www.freertos.org 打开后如图所示,并点击右上角绿色按钮 跳转到如下页面之后,点击下载即可 PS:网上查找资料发现,有人下载时是下载.exe文件,而不是直接下载压缩包,如果是点击下载之后发现是.exe文件,不要惊慌,安静等待下载完成之后,双击将其打开,然后选择保存路径,最后点击确定即可 ?下载完成之后,如图所示 接着我们打开 FreeRTOS 文件夹 ?图中有三个文件夹,Demo、License 和 Source,从名字上就可以很容易的得出他 们都是些什么。 ?● Demo 文件夹 Demo 文件夹里面就是 FreeRTOS 的相关例程,打开以后如图所示: 可以看出 FreeRTOS 针对不同的 MCU 提供了非常多的 Demo,其中就有 ST 的 F1、F4 和 F7 的相关例程,这对于我们学习来说是非常友好的,我们在移植的时候就会参考这些例程。 ● License 文件夹 这个文件夹里面就是相关的许可信息,要用FreeRTOS 做产品的得仔细看看,尤其是要出口的产品。 ● Source 文件夹 看名字就知道了,这个就是 FreeRTOS 的本尊了,打开后如图所示: 下图就是 FreeRTOS 的源码文件,也是我们以后打交道的,可以看出,相比于 UCOS 来说 FreeRTOS 的文件非常少!include 文件夹是一些头文件,移植的时候是需要的,下面的这些.C 文件就是 FreeRTOS 的源码文件了,移植的时候肯定也是需要的 四、开始移植大概了解完毕之后,我们就开始进行移植 要移植 FreeRTOS,肯定需要一个基础工程,基础工程越简单越好,这里我使用的是STM32F103VET6的板子,例程则选择最基础的跑马灯实验来作为基础工程 4.1 添加FreeRTOS 源码?在基础工程中新建一个名为 FreeRTOS 的文件夹,如图所示 创建 FreeRTOS 文件夹以后就可以将 FreeRTOS 的源码添加到这个文件夹中,打开刚刚下载的FreeRTOS源码,找到路径为:FreeRTOSv202111.00\FreeRTOS\Source下的文件 ?将所有.c文件以及include、portable两个文件夹复制到基础工程下刚刚创建的FreeRTOS 文件夹中,如下图所示: ?复制完成之后打开portable文件夹,我们只需要留下 keil、MemMang 和 RVDS 这三个文件夹,其他的都可以删除掉,删除完成之后如下图所示 接着打开FreeRTOS源码,找到路径为:FreeRTOSv202111.00\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的 FreeRTOSConfig.h文件,将其复制到基础工程路径为:实验1 LED灯闪烁\FreeRTOS\include下,如下图所示:? ? ? ? ?4.2 向工程分组中添加文件?打开基础工程,新建分组 FreeRTOS_CORE?和 FreeRTOS_PORTABLE 接着往这两个分组里添加文件,FreeRTOS_CORE 分组添加路径为:实验1 LED灯闪烁\FreeRTOS下的所有.c文件FreeRTOS_PORTABLE分组添加路径为:实验1 LED灯闪烁\FreeRTOS\portable\MemMang下的heap_4.c文件以及路径为:实验1 LED灯闪烁\FreeRTOS\portable\RVDS\ARM_CM3下的port.c文件 ?添加完成如下图所示: 4.3 添加相应的头文件路径 添加完 FreeRTOS 源码中的 C 文件以后还要添加 FreeRTOS 源码的头文件路径,头文件路径如下图所示: ? 4.4?修改 BasicSYSTEM文件 SYSTEM 文件夹里面的文件一开始是针对 UCOS 而编写的,所以如果使用 FreeRTOS 的话 就需要做相应的修改。本来打算让 SYSTEM 文件夹也支持 FreeRTOS,但是这样的话会导致 SYSTEM 里面的文件太过于复杂,这样非常不利于初学者学习,所以这里就专门针对 FreeRTOS 修改了 SYSTEM 里面的文件。 1、修改 sys.h 文件 sys.h 文件修改很简单,在 sys.h 文件里面用宏 SYSTEM_SUPPORT_OS 来定义是否使用 OS, 我们使用了 FreeRTOS,所以应该将宏 SYSTEM_SUPPORT_OS 改为 1。
2、修改 usart.c 文件 usart.c 文件修改也很简单,usart.c 文件有两部分要修改,一个是添加 FreeRTOS.h 头文件, 默认是添加的 UCOS 中的 includes.h 头文件,修改以后如下:
?另外一个就是 USART1 的中断服务函数,在使用 UCOS 的时候进出中断的时候需要添加 OSIntEnter()和 OSIntExit(),使用 FreeRTOS 的话就不需要了,所以将这两行代码删除掉,修改 以后如下:
3、修改 delay.c 文件 delay.c 文件修改的就比较大了,因为涉及到 FreeRTOS 的系统时钟,delay.c 文件里面有 4 个函数,先来看一下函数 SysTick_Handler(),此函数是滴答定时器的中断服务函数,代码如下:?
FreeRTOS 的心跳就是由滴答定时器产生的,根据 FreeRTOS 的系统时钟节拍设置好滴答定 时器的周期,这样就会周期触发滴答定时器中断了。在滴答定时器中断服务函数中调用 FreeRTOS 的 API 函数 xPortSysTickHandler()。 delay_init()是用来初始化滴答定时器和延时函数,代码如下:
? ? ? ? 前面我们说了 FreeRTOS 的系统时钟是由滴答定时器提供的,那么肯定要根据 FreeRTOS 的 系统时钟节拍来初始化滴答定时器了,delay_init()就是来完成这个功能的。FreeRTOS 的系统时 钟节拍由宏 configTICK_RATE_HZ 来设置,这个值我们可以自由设置,但是一旦设置好以后我 们就要根据这个值来初始化滴答定时器,其实就是设置滴答定时器的中断周期。在基础例程中 滴答定时器的时钟频率设置的是 AHB 的 1/8,这里为了兼容 FreeRTOS 将滴答定时器的时钟频 率改为了 AHB,也就是 72MHz!这一点一定要注意! 接下来的三个函数都是延时的,代码如下:
delay_us()是 us 级延时函数,delay_ms 和 delay_xms()都是 ms 级的延时函数,delay_us()和 delay_xms()不会导致任务切换。delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的 简单封装,所以在使用 delay_ms()的时候就会导致任务切换。 delay.c 修改完成以后编译一下,会提示如下图所示错误:上图的错误提示表示在 port.c、delay.c 和 stm32f10x_it.c 中三个重复定义的函数: SysTick_Handler()、SVC_Handler()和 PendSV_Handler(),这三个函数分别为滴答定时器中断服 务函数、SVC 中断服务函数和 PendSV 中断服务函数,将 stm32f10x_it.c 中的三个函数屏蔽掉, 如下图所示:再次编译代码,应该没有错误了,如果还是错误的话自行根据错误类型修改!至此,SYSTEM 文件夹就修改完成了,接下来我们进行跑马灯测试,测试代码如下
测试代码中创建了 3 个任务:LED0 测试任务、LED1 测试任务和浮点测试任务,它们的任务函数分别为:led0_task()、led1_task()。led0_task()和 led1_task()任务很简单,就是让 LED0 和 LED1 周期性闪烁 编译并下载代码到 STM32F103VET6 开发板中,下载进去以后会看到 LED0 和 LED1 开始闪烁, LED0 均匀闪烁,那是因为我们在 LED0 的任务代码中设置好的 LED0 亮 500ms,灭 500ms。 LED1 亮的时间短,灭的时间长,这是因为在 LED1 的任务代码中设置好的亮 200ms,灭 800ms PS:学习移植的过程中发现,下载最新版的FreeRTOS系统源码,移植完成之后不能运行成功,经过各种查阅资料还是没能解决,后面将最新版本的FreeRTOSConfig.h文件替换成V9.0版本的FreeRTOSConfig.h文件,即可成功运行 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 1:11:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |