STM32F1+FreeRTOS系统移植例程

一、系统下载
1.1、下载FreeRTOS系统
首先我们需要去到FreeRTOS系统管网下载他们的源码,官网地址是:www.freertos.org
打开后如图所示,并点击右上角绿色按钮
在这里插入图片描述
跳转到如下页面之后,点击下载即可
在这里插入图片描述
下载完成之后,如图所示
在这里插入图片描述
二、系统移植
要移植 FreeRTOS,肯定需要一个基础工程,基础工程越简单越好,这里我使用的是STM32F103VET6的板子,例程则选择最基础的跑马灯实验来作为基础工程
2.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下,如下图所示:
在这里插入图片描述
在这里插入图片描述
2.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文件
在这里插入图片描述
在这里插入图片描述
添加完成如下图所示:
在这里插入图片描述
2.3、添加相对应的头文件路径
添加完 FreeRTOS 源码中的 C 文件以后还要添加 FreeRTOS 源码的头文件路径,头文件路径如下图所示:
在这里插入图片描述
2.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。

QQ群:

131322621

欢迎大家进群交流!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值