FreeRTOS — 源码下载与移植

1、FreeRTOS的学习

1.1、FreeRTOS的源码下载

        学习一个操作系统前,首先要下载对应的源码,用于研究和学习。FreeRTOS的源码下载链接如下:

        FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.net

页面图示如下:

FreeRTOS — 源码下载与移植_第1张图片

下载之后的文件为:FreeRTOSv202012.00-LTS.exe.qbl

1.2、FreeRTOS在线API指南

FreeRTOS提供了在线的API接口的指南,这对于开发和学习都是非常的友好的,在线API指南的网址为:

        http://web.ist.utl.pt/~ist11993/FRTOS-API/index.html

        在线指南的示意图如下:

FreeRTOS — 源码下载与移植_第2张图片

1.3、在线应用指南

除了在线的API应用指南之外,还有一个在线的开发指导手册,是非常好用的一份手册:

        https://www.freertos.org/RTOS.html

FreeRTOS — 源码下载与移植_第3张图片

2、FreeRTOS移植到MCU上

0.基于STM32F103的移植,其它系列MCU类似。

硬件平台:STM32F103ZET6;

软件平台:MDK529

FreeTROS版本:FreeRTOS Kernel V10.4.3

1.在工程目录下新建FreeRTOS文件夹,该文件夹用于存放FreeRTOS相关的文件。

FreeRTOS — 源码下载与移植_第4张图片

2.在FreeRTOSv10.2.1\FreeRTOS\Source路径下找到FreeRTOS的源码,将其拷贝到工程中的FreeRTOS文件夹中。

FreeRTOS — 源码下载与移植_第5张图片

        其中头文件和源码源文件是全部要用到的,不做任何删除。

        portable文件夹是和硬件平台,软件开发环境相关的文件。FreeRTOS为了让用户移植简单,帮用户做了很多工作。打开portable文件夹如下:

FreeRTOS — 源码下载与移植_第6张图片

        3.打开工程,在工程中添加一个专用来存放FreeRTOS的Group

FreeRTOS — 源码下载与移植_第7张图片

        将FreeRTOS的源文件,内存管理文件,硬件接口文件统统添加到这个FreeRTOS这个Group中

FreeRTOS — 源码下载与移植_第8张图片

        内存管理文件在FreeRTOS\portable\MemMang文件夹下,FreeRTOS提供了五种内存管理方案,对于移植来说,随便选一种方案都是可以的。但是heap_4有内存碎片管理的功能,对内存碎片可以自动监控和收集,所以选择这个内存管理会更好。

        port.c文件在FreeRTOS\portable\RVDS路径下找到与自己使用的MCU内核的文件夹:

FreeRTOS — 源码下载与移植_第9张图片

        4.添加头文件路径,需要添加两个路径。

FreeRTOS — 源码下载与移植_第10张图片

        5.编译

FreeRTOS — 源码下载与移植_第11张图片

        便已完成之后,提示打不开FreeRTOSConfig.h这个文件。这是因为FreeRTOS源码中并没有提供这个文件。

        这种情况下有两种办法:

        第一、自己动手写一个(哈哈,个人觉得这个对一般人来说不现实);

        第二、找一个可以直接用的。

        仔细找找会发现,其实官方在很多平台下都移植了FreeRTOS。去官方的demo中找,FreeRTOSv10.2.1\FreeRTOS\Demo路径下存放的全是官方移植的demo。在此路径下找到CORTEX_STM32F103_Keil文件夹,此文件夹是官方基于STM32F103和MDK平台移植的demo。(其他平台参考该方式类似的查找)

        在此文件夹下找到FreeRTOSConfig.h文件。

FreeRTOS — 源码下载与移植_第12张图片

        将其拷贝到源码的头文件中。重新进行编译。

FreeRTOS — 源码下载与移植_第13张图片

        这种情况下,只要使能一个有关的宏定义为1即可以,在FreeRTOSConfig.h文件中将宏INCLUDE_xTaskGetCurrentTaskHandle定义为1,使能该函数,重新编译一下,应该就不会报错了。

        6.添加三个宏定义

首先我们需要对FreeRTOS的几个很重要的问题要有一个认识:

<1> FreeRTOS触发第一个任务是在SVC_Handler中断中进行的;
<2> 切换任务是在PendSV_Handler中断中进行的;
<3> 系统节拍中断是在SysTick_Handler中进行的。

        在我们自己移植的项目中,官方的文件中对3个函数的定义是没有的,需要我们自己进行一些修改。

        在官方的提供的文件中,实现了另外3个相关的函数,名字分别是:

vPortSVCHandler,xPortPendSVHandler,xPortSysTickHandler。

        所以,我们只需要根据自己所用的MCU环境进行相应的替换即可以对应上了。在FreeRTOSConfig.h头文件中做一下宏定义就可以了。注意要将自己的原来3个空函数注释掉。

这三个宏定义非常重要

#define xPortPendSVHandler PendSV_Handler 
#define vPortSVCHandler SVC_Handler 
#define xPortSysTickHandler SysTick_Handler

        其中,xPortSysTickHandler是系统滴答定时器中断,用于给FreeRTOS提供运行的心跳节拍的,代码示意如下:

void xPortSysTickHandler( void )
{
    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
     * executes all interrupts must be unmasked.  There is therefore no need to
     * save and then restore the interrupt mask value as its value is already
     * known - therefore the slightly faster vPortRaiseBASEPRI() function is used
     * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */
    vPortRaiseBASEPRI();
    {
        /* Increment the RTOS tick. */
        if( xTaskIncrementTick() != pdFALSE )
        {
            /* A context switch is required.  Context switching is performed in
             * the PendSV interrupt.  Pend the PendSV interrupt. */
            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
        }
    }

    vPortClearBASEPRIFromISR();
}

 对嵌入式开发感兴趣的话,欢迎关注微信公众号“嵌入式之入坑笔记”,一块学习交流吧!

FreeRTOS — 源码下载与移植_第14张图片

 

你可能感兴趣的:(操作系统,单片机,stm32,物联网)