FreeRTOS学习笔记——基础知识与移植(STM32F103)

2019-07-18来源: eefocus关键字:FreeRTOS  基础知识  移植  STM32F103

1.1 前后台系统:


    早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念。通常把程序分为两部分:前台系统和后台系统。


     简单的小系统通常是前后台系统,这样的程序包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统。中断服务程序用于处理系统的异步事件,也就是前台系统。前台是中断级,后台是任务级。



1.2 RTOS系统:


       RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。实时操作系统又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作 ,硬实时系统不允许超时,在软实时里面处理过程超时的后果就没有那么严格。

       在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。

       RTOS操作系统:FreeRTOS,UCOS,RTX,RT-Thread,DJYOS等。

       RTOS操作系统的核心内容在于:实时内核。


可剥夺型内核:


     RTOS的内核负责管理所有的任务,内核决定了运行哪个任务,何时停止当前任务切换到其他任务,这个是内核的多任务管理能力。多任务管理给人的感觉就好像芯片有多个CPU,多任务管理实现了CPU资源的最大化利用,多任务管理有助于实现程序的模块化开发,能够实现复杂的实时应用。

     RTOS中的经典代表作:FreeRTOS,而FreeOS的内核是可剥夺型的,所以我们简单提一下什么是可剥夺型内核,关于FreeRTOS内核的详细内容我们会在后续的视频中专门讲解的。

     可剥夺内核顾名思义就是可以剥夺其他任务的CPU使用权,它总是运行就绪任务中的优先级最高的那个任务。



2.1 FreeRTOS系统简介:


       FreeRTOS是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。FreeRTOS提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。

       FreeRTOS是用C和汇编来写的,其中绝大部分都是用C语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,FreeRTOS结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。


为什么学FreeRTOS


1、因为FreeROTS开源。

2、FreeRTOS免费

3、FreeRTOS是很多第三方组件钦定的系统!


2.2 FreeRTOS相关资料查找:


1、FreeRTOS官网:http://www.freertos.org/。

2、开源电子网:www.openedv.com。

3、其他论坛。


FreeRTOS 移植


2.2.1 向工程中添加相应文件

1、添加FreeRTOS 源码

在基础工程中新建一个名为FreeRTOS 的文件夹,如图2.2.1.1 所示:



创建FreeRTOS 文件夹以后就可以将FreeRTOS 的源码添加到这个文件夹中,添加完以后如图2.2.1.2 所示:



在1.3.2 小节中详细的讲解过portable 文件夹,我们只需要留下keil、MemMang 和RVDS这三个文件夹,其他的都可以删除掉,完成以后如图2.2.1.3 所示:



2、向工程分组中添加文件

打开基础工程,新建分组FreeRTOS_CORE 和FreeRTOS_PORTABLE,然后向这两个分组中添加文件,如图2.2.1.4 所示:



分组FreeRTOS_CORE 中的文件在什么地方就不说了,打开FreeRTOS 源码一目了然。重点来说说FreeRTOS_PORTABLE 分组中的port.c 和heap_4.c 是怎么来的,port.c 是RVDS 文件夹下的ARM_CM3 中的文件,因为STM32F103 是Cortex-M3 内核的,因此要选择ARM_CM3中的port.c 文件。heap_4.c 是MemMang 文件夹中的,前面说了MemMang 是跟内存管理相关

的,里面有5 个c 文件:heap_1.c、heap_2.c、heap_3.c、heap_4.c 和heap_5.c。这5 个c 文件是五种不同的内存管理方法,就像从北京到上海你可以坐火车、坐飞机,如果心情好的话也可以走路,反正有很多种方法,只要能到上海就行。这里也一样的,这5 个文件都可以用来作为FreeRTOS 的内存管理文件,只是它们的实现原理不同,各有利弊。这里我们选择heap_4.c,至于原因,后面会有一章节专门来讲解FreeRTOS 的内存管理,到时候大家就知道原因了。这里就先选择heap_4.c,毕竟本章的重点是FreeRTOS 的移植。


3、添加相应的头文件路径

添加完FreeRTOS 源码中的C 文件以后还要添加FreeRTOS 源码的头文件路径,头文件路径如图2.2.1.5 所示:



头文件路径添加完成以后编译一下,看看有没有什么错误,结果会发现提示打不开“FreeRTOSConfig.h”这个文件,如图2.2.1.6 所示:



这是因为缺少FreeRTOSConfig.h 文件,这个文件在哪里找呢?你可以自己创建,显然这不是一个明智的做法。我们可以找找FreeRTOS 的官方移植工程中会不会有这个文件,打开FreeRTOS 针对STM32F103 的移植工程文件,文件夹是CORTEX_STM32F103_Keil,打开以后如图2.2.1.7 所示:



果然!官方的移植工程中有这个文件,我们可以使用这个文件,但是建议大家使用我们例程中的FreeRTOSConf.h 文件,这个文件是FreeRTOS 的系统配置文件,不同的平台其配置不同,但是我们提供的例程中的这个文件肯定是针对ALIENTEK 开发板配置正确的。这个文件复制到什么地方大家可以自行决定,这里我为了方便放到了FreeRTOS 源码中的include 文件夹下。FreeRTOSConfig.h 是何方神圣?看名字就知道,他是FreeRTOS 的配置文件,一般的操作系统都有裁剪、配置功能,而这些裁剪及配置都是通过一个文件来完成的,基本都是通过宏定义来完成对系统的配置和裁剪的,关于FreeRTOS 的配置文件FreeRTOSConfig.h 后面也会有一章节来详细的讲解。到这里我们再编译一次,没有错误!如图2.2.1.8 所示:



如果还有错误的话大家自行根据错误类型查找和修改错误!


2.2.2 修改SYSTEM 文件

SYSTEM 文件夹里面的文件一开始是针对UCOS 而编写的,所以如果使用FreeRTOS 的话就需要做相应的修改。本来打算让SYSTEM 文件夹也支持FreeRTOS,但是这样的话会导致SYSTEM 里面的文件太过于复杂,这样非常不利于初学者学习,所以这里就专门针对FreeRTOS修改了SYSTEM 里面的文件。

1、修改sys.h 文件

sys.h 文件修改很简单,在sys.h 文件里面用宏SYSTEM_SUPPORT_OS 来定义是否使用OS,我们使用了FreeRTOS,所以应该将宏SYSTEM_SUPPORT_OS 改为1。


//0,不支持os

//1,支持os

#define SYSTEM_SUPPORT_OS 1 //定义系统文件夹是否支持OS

2、修改usart.c 文件

usart.c 文件修改也很简单,usart.c 文件有两部分要修改,一个是添加FreeRTOS.h 头文件,默认是添加的UCOS 中的includes.h 头文件,修改以后如下:

//如果使用os,则包括下面的头文件即可.

#if SYSTEM_SUPPORT_OS

#include "FreeRTOS.h" //os 使用

#endif

另外一个就是USART1 的中断服务函数,在使用UCOS 的时候进出中断的时候需要添加OSIntEnter()和OSIntExit(),使用FreeRTOS 的话就不需要了,所以将这两行代码删除掉,修改以后如下:

void USART1_IRQHandler(void) //串口1 中断服务程序

{

    u8 Res;

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

    {

        Res =USART_ReceiveData(USART1); //读取接收到的数据

        if((USART_RX_STA&0x8000)==0) //接收未完成

    {

    if(USART_RX_STA&0x4000) //接收到了0x0d

    {

        if(Res!=0x0a)USART_RX_STA=0; //接收错误,重新开始

        else USART_RX_STA|=0x8000; //接收完成了

    }

    else //还没收到0X0D

    {

        if(Res==0x0d)USART_RX_STA|=0x4000;

        else

        {

            USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

            USART_RX_STA++;

            if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;

        }

    }

    }

}

}

3、修改delay.c 文件

delay.c 文件修改的就比较大了,因为涉及到FreeRTOS 的系统时钟,delay.c 文件里面有4个函数,先来看一下函数SysTick_Handler(),此函数是滴答定时器的中断服务函数,代码如下:

extern void xPortSysTickHandler(void);

//systick 中断服务函数,使用OS 时用到

void SysTick_Handler(void)

{

    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行

    {

        xPortSysTickHandler();

    }

}

FreeRTOS 的心跳就是由滴答定时器产生的,根据FreeRTOS 的系统时钟节拍设置好滴答定时器的周期,这样就会周期触发滴答定时器中断了。在滴答定时器中断服务函数中调用FreeRTOS 的API 函数xPortSysTickHandler()。delay_init()是用来初始化滴答定时器和延时函数,代码如下:

//初始化延迟函数

//SYSTICK 的时钟固定为AHB 时钟,基础例程里面SYSTICK 时钟频率为AHB/8

//这里为了兼容FreeRTOS,所以将SYSTICK 的时钟频率改为AHB 的频率!

//SYSCLK:系统时钟频率

void delay_init()

{

    u32 reload;

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK

fac_us=SystemCoreClock/1000000; //不论是否使

[1] [2]
关键字:FreeRTOS  基础知识  移植  STM32F103 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468424.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32CubeMX+FreeRTOS实验---使用两个实例,共用一个task
下一篇:STM32使用FreeRTOS中的链表创建节点与列表项

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F4+FreeRTOS+FreeRTosTcpIp移植教程
花了几天时间完成了FreeRTOS自带的TCP/IP协议栈在stm32F407上的移植,在此记录并分享,第一次写这个,写的不好的地方见谅。硬件是stm32F407最小系统(内带phy控制器),所以还需要一个phy芯片,选了DP83848这款不带协议栈的芯片。选了一款淘宝上的以太网模块,内置芯片就是DP83848,只提供RMII接口(mac和phy的通信方式),自带50M振晶(所以不需要stm32PA8口输出时钟源)。两者硬件接口如下:软件方面:(1)需要完成stm32MAC控制器的初始化。(st库自带有)(2)需要完成DP83848的驱动。(st库自带有)(3)FreeRTos和Tcp/IP stack的移植。(1)创建
发表于 2019-10-08
STM32F4+FreeRTOS+FreeRTosTcpIp移植教程
STM32中断及FreeRTOS中断优先级配置知识
很多朋友对中断的一些知识还是不了解,今天就写点关于Cortex-M3处理器中断相关,以及FreeRTOS中断优先级配置的内容。1写在前面写本文之前,先写点相关的扩展内容。STM32属于ARM中Cortex-M系列处理器,比如:STM32F1数据Cortex-M3,STM32F7数据Cortex-M7。可以参看我之前分享文章:从Cortex-M到Cortex-A认识ARM处理器,了解一下关于ARM处理器的种类。本文主要结合Cortex-M3下面STM32F1系列处理器为例来讲述中断控制相关内容。而Cortex-M其它系列,或者说STM32其它系列关于中断的内容类似。Cortex-M3只是STM32F1的一个内核。反过
发表于 2019-10-08
stm32 freertos 之串口中断
一、中断处理函数void USART1_IRQHandler(void){ BaseType_t xHigherPriorityTaskWoken;   xHigherPriorityTaskWoken = pdFALSE; u8 cChar; if(USART_GetITStatus (USART1,USART_IT_RXNE)!=RESET) { cChar=USART_ReceiveData(USART1); xQueueSendToBackFromISR (xQueueRx,&cChar,&xHigherPriorityTaskWoken); portYIELD_FROM_ISR
发表于 2019-10-08
STM32F407上调试freeRTOS问题
是在正点原子的阿波罗STM32F429开发板上的例子改来的,他们的编译没有问题,我编译时出现如下问题:定位到出错的地方,代码是:再追代码,configMAX_SYSCALL_INTERRUPT_PRIORITY 的定义是:#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )其中 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 定义为:#define
发表于 2019-10-08
STM32F407上调试freeRTOS问题
关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置
freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void);调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈,不过在CubeMx中的Configuration->FreeRtos->Include parameters中使能uxTaskGetStackHighWaterMark函数;2.整体设置过小,TOTAL_HEAP_SIZE
发表于 2019-09-30
移植freeRTOS V10.2.0到stm32f103zet6
t; assumed)解决:函数前加void,这是printf函数的相关定义void _sys_exit(int x)warning:#1-D last line of file ends without anewline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个警告,跳转到警告处,然后在后面输入多一个空行就好了。SYSTEM文件夹1、delay顾名思义:延时函数文件夹***************SysTick定时器*****************着重理解RTOS会用到sys文件夹 sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 S
发表于 2019-08-23
移植freeRTOS V10.2.0到stm32f103zet6
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved