stm32 移植 FreeRTOS

1. 建立裸机工程

在移植 freeRTOS 之前需要创建一个 stm32f103 的 keil5 裸机工程。所谓裸机工程就是包含 stm32f103 单片机的启动文件,外设驱动固件库的文件集合,也可以说是支持裸机开发的一个单片机运行环境。通过这样的一个工程即可进行 stm32 单片机的驱动开发。同时对于 freeRTOS 移植也需要一个这样的工程环境,换而言之 freeRTOS 的移植和配置需要用到裸机工程中的文件。
stm32 移植 FreeRTOS_第1张图片

2. 移植相关文件版本

freeRTOS 使用 9.00 版本(这篇文章同样适用 FreeRTOSv10.00版本),可以通过 github 官网搜索进行下载,或通过我的 github 链接 https://github.com/zhbi98/FreeRTOSv9.0.0 下载,下载后将得到一个 FreeRTOSv9.0.0-master.zip 这样的压缩包,该压缩包即为 freeRTOS 源码文件。
stm32 具体型号为 stm32f103vet6(当然如果使用 stm32f4xx系列的移植,本文章移植方法也是适用的,只是一些文件选择不同,下面将会说到如果是 stm32f4xx 如何选择)。

3. 完整 freeRTOS 文件概览

stm32 移植 FreeRTOS_第2张图片
**FreeRTOS:**该文件夹存放 freertos 的源码(Source 文件夹),移植参考工程(Demo 文件夹),许可证(License 文件夹)。注意:该路径下的源码(Source 文件夹),和移植参考工程(Demo 文件夹)即为移植需要使用的
**FreeRTOS-Plus:**该文件夹存放其他相关应用组件,比如网络等,如果不开发网络相关的设备一般不使用。

源码相关文件(Source 文件夹),这里就包含了 freeRTOS 的所有 C 语言源码文件了,所以可以知道 freeRTOS 整体的源码并不多,如下图。
stm32 移植 FreeRTOS_第3张图片

4. 删除源码包中不需要使用的文件

FreeRTOS-Plus 文件夹: 该文件夹为网络相关组件和网络相关使用参考,如果不使用网络那么可以直接将这个文件夹删除。
网页 HTML 文件: 一般不使用源码包中凡是 HTML 文件均可直接删除。
License 文件夹: 不需要的话可以直接删除。
Demo 文件夹: 这里留下所使用的 STM32F103 单片机的移植参考,其余非自己使用单片机型号的移植参考直接删除。

5. 移植 freeRTOS 文件

5.1. 需要使用的 C (源文件)文件

路径:FreeRTOS\Source\ 中的 croutine.clist.cqueue.ctimer.ctasks.c
路径:FreeRTOS\Source\portable\RVDS\ARM_CM3\ 中的 port.c(如果是 stm32f4则选择 ARM_CM4\ 中的 port.c)。
路径:FreeRTOS\Source\portable\MemMang\ 中的 heap_2.c

以上这些文件需要添加到 keil 中,也就是前面提到的裸机工程中,在裸机 keil 工程中新建一个 FreeRTOS 文件夹将上面的文件添加到该文件夹中。
stm32 移植 FreeRTOS_第4张图片

5.2. 需要使用的 H (头文件)文件

路径:FreeRTOS\Source\include\ 中的所有 .h 文件。
路径:FreeRTOS\Source\portable\RVDS\ARM_CM3\ 中的 portmacro.h 文件(如果是 stm32f4则选择 ARM_CM4\ 中的 portmacro.h)。
路径:FreeRTOS\Demo\CORTEX_STM32F103_Keil\ 中的 FreeRTOSConfig.h 文件(如果是 stm32f4则选择 STM32F4xx_Keil 中的 FreeRTOSConfig.h)。

以上这些头文件所在的路径同样需要导入 keil 中。
stm32 移植 FreeRTOS_第5张图片

6. 修改文件

6.1. 修改 stm32 启动文件 startup_stm32f10x_hd.s

以下的修改是为了将 freeRTOS 的三个中断函数导入到 stm32 的汇编启动文件中。
stm32 移植 FreeRTOS_第6张图片

以下修改是为了将上面导入的 freeRTOS 中断函数替换 stm32 本身的中断函数。
stm32 移植 FreeRTOS_第7张图片

第二种办法是不将 freeRTOS 的三个中断函数导入到 stm32 的汇编启动文件中进行替换,而是通过在 freeRTOS 配置文件 FreeRTOSConfig.h 中将这三个函数使用宏定义直接替换,这个操作比较简便。
stm32 移植 FreeRTOS_第8张图片

修改 stm32 堆栈的大小
stm32 移植 FreeRTOS_第9张图片

6.2. 修改 freeRTOS 配置文件 FreeRTOSConfig.h

在这里配置 stm32 单片机的系统时钟,这里配置为 72MHz,配置系统调度时间片,这里设置为 1000Hz 即 1ms 的时间片。
stm32 移植 FreeRTOS_第10张图片

通过以上的修改就移植完成了。

6.3. 验证任务调度

#include "stm32f10x.h"

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "semphr.h"

// Lowest priority 0
#define TASK1_PRIORITY 1
#define TASK1_STACK_SIZE 512

#define TASK2_PRIORITY 2
#define TASK2_STACK_SIZE 512

TaskHandle_t task1_handler;
TaskHandle_t task2_handler;

static void task1(void * pvParameters)
{
    for (;;) {
        printf("%s\n", "task1");
        vTaskDelay(1000);
    }
}

static void task2(void * pvParameters)
{
    for (;;) {
        printf("%s\n", "task2");
        vTaskDelay(1000);
    }
}

static unsigned char task_init()
{
    BaseType_t status = pdPASS;

    status = xTaskCreate(task1,
            "task1",
            TASK1_STACK_SIZE,
            NULL,
            TASK1_PRIORITY,
            &task1_handler);

    status = xTaskCreate(task2,
            "task2",
            TASK2_STACK_SIZE,
            NULL,
            TASK2_PRIORITY,
            &task2_handler);

    return status;
}

int main()
{
    if (task_init() == pdPASS)
        vTaskStartScheduler();

    for (;;) {

    }
    return 0;
}

你可能感兴趣的:(ARM嵌入式开发,单片机,stm32,驱动开发,freertos,arm)