基于STM32F767的FreeRTOS的移植
(一)FreeRTOS简介
1.1 什么是FreeRTOS?
FreeRTOS是一个免费的RTOS类系统。RTOS不是指某一个确定的系统,而是指一类系统。例如UCOS、RTX、RT-Thread等。
操作系统允许多个任务同时运行,但实际上一个处理器核心在某一时刻只能运行一个任务。操作系统中的任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快,这就造成了同一时刻有多个任务在同时运行的错觉。
操作系统的分类方式可以由任务调度器的工作方式决定。有的操作系统给每个任务分配相同的运行时间,时间到了就切换下一个任务,UNIX操作系统就是这样。RTOS的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,在实时环境中要求操作系统必须对某个事件作出实时响应,因此系统任务调度器的行为必须是可预测的。像FreeRTOS这种传统的RTOS类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据优先级来决定下一时刻运行的任务。
1.2 FreeRTOS特点
(1)FreeRTOS的内核支持抢占式,合作式和时间片调度。
(2)提供一个用于低功耗的Tickless模式。
(3)系统的组件在创建时可以选择动态或者静态的RAM,比如任务、消息队列、信号量、软件定时器等。
(4)已经超过30中架构的芯片上进行了移植。
(5)FreeRTOS-MPU支持Cortex-M系列中的MPU单元,如STM32F767。
(6)FreeRTOS系统简单、小巧、易用,通常情况下内核占用4K-9K字节空间。
(7)高可移植性,代码主要C语言编写。
(8)支持实时任务和协程。
(9)任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信号量、递归互斥信号量和互斥信号量进行通信和同步。
(10)创新的事件组或者事件标志。
(11)具有优先级继承特性的互斥信号量。
(12)高效的软件定时器。
(13)强大的跟踪执行能力。
(14)堆栈溢出检测功能。
(15)任务数量不限。
(16)任务优先级不限。
1.3FreeRTOS源码初探
1.3.1 FreeRTOS源码下载
官网链接:https://www.freertos.org/a00104.html
1.3.2 FreeRTOS文件预览
(1)FreeRTOS文件夹
Demo文件夹:
FreeRTOS针对不同的MCU提供了很多Demo,其中就有ST的F1、F4、F7的相关例程。
License文件夹
这里面是相关的许可信息,要用FreeRTOS做产品的得仔细了解,尤其是要出口的产品。
Source文件夹
这个文件夹下就是FreeRTOS的源码文件。include文件夹下是一些头文件,.c文件是FreeRTOS的源码文件。重点了解一下portale文件夹,由于FreeRTOS是一个系统,与硬件无关,故portable文件夹下东西负责把系统与硬件连接起来。不同的编译环境,不同的MCU,其连接方式应该不同的,就如portable文件夹里,针对不同的编译环境给出了不同的文件
由于我采用的是MDK下的STM32F767的正点原子的开发板,所以就需要Keil文件。这里还有一个非常重要的文件夹MemMang,这是和内存管理相关的,移植的时候是必须的。打开Keil文件夹,发现只有一个See-also-the-RVDS-directory.txt的文本文档,但从文件名可以看出,这是让我们去看RVDS这个文件夹,故打开RVDS文件夹,如下图所示。
STM32F767就参考ARM_CM7这个文件夹,打开ARM_CM7中的r0p1文件夹,如下图所示。
这两个文件就是我们移植时所需要的。
(2)FreeRTOS-Plus文件夹
分析完了FreeRTOS文件夹,接下来看一下FreeRTOS-Plus文件夹,打开后如下图所示:
Demo文件夹下肯定是一些例程,所以我们直接看Source文件夹,打开后如图所示:
可以看出,FreeRTOS-Plus中的源码并不是FreeRTOS系统的源码,而是在这个系统上增加的一些功能代码,比如CLI、FAT、Trace等。
(二)FreeRTOS移植
2.1 准备一个基础工程
这里我们用LED灯的实验例程。
2.2 移植FreeRTOS
2.2.1 向工程中添加FreeRTOS源码
(1)新建一个FreeRTOS文件夹,用来存放FreeRTOS的源码。
添加完后如下图所示:
在portable文件夹下,我们只需留下Keil、MemMang和RVDS文件夹,其余文件夹都用不到。
接下去,打开工程文件,新建FreeRTOS_Core和FreeRTOS_Portable两个文件分组,并添加对应的文件,如下图所示:
FreeRTOS_Core下的文件就是源码FreeRTOS文件夹下的.c文件,FreeRTOS_Portable下的port.c是RVDS文件中ARM_CM7文件下的port.c文件。heap_4.c是MemMang文件下的。MemMang文件下有5个C文件:heap_1.c、heap_2.c、heap_3.c、heap_4.c和heap_5.c。这五个文件是五中不同的内存管理方法,实现的原理不一样但结果是相同的,都可以作为FreeRTOS的内存管理文件,这里就暂时选择heap_4.c文件。注意:五个文件任选其一即可,都添加进工程的话,会出现很多重复定义的错误。
最后添加对应的头文件路径,编译。
编译之后报了很多错误。如下图所示:
根据错误提示,发现缺少FreeRTOSConfig.h文件。这个文件可以自己创建,但很明显对于初学者来说不现实,所以我们就去官方提供的Demo中寻找这个文件。在CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil这个文件夹下。这里我把这个文件复制到FreeRTOS的include文件夹下,这样头文件相对来说比较集中。
再次编译,有报错,错误提示如下:
重复定义,所以我们注释掉stm32f7xx_it.c中的这三个函数,再次编译,出现了一堆未定义的错误。
第一个函数vAssertCalled()是跟断言函数有关,在移植是不需要,故直接在FreeRTOSConfig.h中屏蔽掉以下两行代码:
剩下的3个未定义函数都是以Hook结尾的,意味着它们都是钩子函数,由于在FreeRTOSConfig.h中开启了这三个钩子函数,却没有定义它们而导致报错,故在FreeRTOSConfig.h中将它们对应的宏改为0即可。分别为configUSE_TICK_HOOK、configUSE_MALLOC_FAILED_HOOK、configCHECK_FOR_STACK_OVERFLOW。
再次编译,无错误。
总结一下上面的移植思想,主要根据编译器的报错信息来修改,缺少对应文件就去FreeRTOS源码Demo文件夹中寻找合适的编译器、型号文件下的文件,拷贝至自己的工程文件中;出现重定义错误,注释掉对应的重定义部分;出现未定义错误,首先观察配置问价FreeRTOSConfig.h中是否开启勒配置,如果有先关闭。
(三)验证FreeRTOS系统移植
简单编写一下LED灯、USART1的驱动,验证一下FreeRTOS系统能否正常工作。具体驱动代码网上例程很多,直接拿来用就好了。
本文地址:https://blog.****.net/weixin_44366217/article/details/103107384
上一篇: sts中maven
推荐阅读
-
MySQL 5.6 基于GTID及多线程的复制详解
-
基于python发送邮件的乱码问题的解决办法_PHP教程
-
PHP基于cookie与session统计网站访问量并输出显示的方法,cookiesession
-
基于Solaris sparc的Oracle调优
-
开发一个基于纯网页的棋牌游戏,需要掌握那些技术?_html/css_WEB-ITnose
-
我想开发一个基于web中小型企业的员工管理系统?用PHP写,但是我的编程工具用什么啊?
-
基于OneThink1129的新浪SAE移植版
-
使用mysqlbinlog工具进行基于位置或时间点的恢复
-
基于php上传图片重命名的6种解决方法的详细介绍
-
基于php中使用excel的简单介绍_PHP