基于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系统能否正常工作。具体驱动代码网上例程很多,直接拿来用就好了。
基于STM32F767的FreeRTOS的移植相关推荐
- 基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)
基于STM32F767通过STM32CubeMX实现ModbusTCP读多为寄存器操作(后续) 由于上篇着重介绍了实现功能的代码,以至于我没有和大家讲清楚FreeModbus应该怎么移植,在此先抱歉浪 ...
- 基于STM32F767通过STM32CubeMX实现ModbusTCP
基于STM32F767通过STM32CubeMX实现ModbusTCP读多为寄存器操作(一) 本文为modbus代码讲解概述,实现modbus具体操作请点击以下博客: 基于STM32F767通过STM ...
- 移植根文件系统到linux内核 s3c2440,u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统...
三.根文件系统的制作 我们利用busybox来制作根文件系统 1.在下列网站下载busybox-1.15.0.tar.bz2 在当前目录下解压busybox tar -jxvf busybox-1.1 ...
- 基于ARM的嵌入式Linux移植真实体验(3)――操作系统
基于ARM的嵌入式Linux移植真实体验(3)――操作系统 宋宝华[email]21cnbao@21cn.com[/email] 出处:dev.yesky.com 在笔者撰写的<C语言嵌入式系统 ...
- STM32F4+FreeRTOS+FreeRTosTcpIp移植教程
花了几天时间完成了FreeRTOS自带的TCP/IP协议栈在stm32F407上的移植,在此记录并分享,第一次写这个,写的不好的地方见谅. 硬件是stm32F407最小系统(内带phy控制器),所以还 ...
- 嵌入式中断:如何正确设置中断优先级 (万字总结) - 基于Cortex-M和FreeRTOS
嵌入式中断:深入探讨如何正确设置中断优先级 - 基于Cortex-M和FreeRTOS 1. 如何正确设置中断优先级 2. 从Cortex-M角度 configPRIO_BITS 3. 从RTOS角度 ...
- stm32驱动rgb屏电路图_基于STM32F767驱动 LTDC LCD(RGB屏)
[实例简介] 基于STM32F767驱动 LTDC LCD(RGB屏) 可以作为参考资料 [实例截图] [核心代码] 基于STM32F767驱动LTDCLCD(RGB屏) └── 基于STM32F76 ...
- touchgfx程序_基于TouchGFX和FreeRTOS的智能家居解决方案
基于 TouchGFX 和 FreeRTOS 的智能家居解决方案 * 马志宁,王鑫宇,吴淑琴 [摘 要] 摘要 : 以 32 位 Cortex-M4 内核的 LPCXpresso54608 作为智能家 ...
- 基于FPGA+SDRAM+BT656视频解码移植总结
基于FPGA+SDRAM+BT656视频解码移植总结 一.硬件准备 1.TVP5150模块(模拟视频信号解码模块). 2.模拟摄像头一个(PAL或NT格式输出 AV同轴) 3.FPGA开发板一块(EP ...
最新文章
- retinajs 使用方法
- mysql存储过程详解[转]
- 图解高内聚与低耦合,傻瓜都能看懂!
- spring创建web项目_使用Spring WS创建合同优先的Web服务
- 能干什么_闲鱼流量系统能干什么?真的有用吗?
- CentOS7 安装 scala 2.11.1
- table中怎么设置两行间距
- vmware 多外网ip
- form表单样式案例
- python爬虫实战万年历
- 从零学爬虫:采集房天下二手房信息
- Flash | 用几张帧图创建逐帧动画元件并插入场景层的一般步骤
- 双麦阵列回音消除及降噪模块 A-47
- 为什么阿里不允许用Executors创建线程池,而是通过ThreadPoolExecutor的方式?
- 2019-nCoV肺炎疫情同程查询-完整提供 Demo 代码示例及数据专业且全面的 API 查询接口
- AHU-727 美妙音乐 【DP】
- 杨辉三角~~~~~~~~
- 【java】eclipse
- Android Retrofit 2.0(三)从源码分析原理
- 记Global Protect安装的一次坑旅
热门文章
- php 可视化编辑建站源码,CmsEasy可视化编辑商城系统 v7.3.1
- 计算机组成原理实验课设:复杂指令模型计算机设计与实现
- 计算机组成原理——作业2
- 博贤科技管理系统漏洞0day
- 【ESP32_8266_WiFi (九)】JSON基础
- zigbee 之 路由
- python timedelta() 和relativedelta()的区别
- 成考本科计算机找工作有用吗,就是想问问成人高考的学历 到底有多大用,找工作好找么?...
- 在C#中调用条码标签打印机中的动态链接库PPLA/PPLB(Argox)
- ACL 2021 | ChineseBERT:香侬科技提出融合字形与拼音信息的中文预训练模型