打印
[其他ST产品]

STM32系列单片机标准库移植FreeRTOS

[复制链接]
2255|64
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qsrg51|  楼主 | 2023-12-26 19:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  最近看正点原子新录制了手把手教你学FreeRTOS的视频教程,看了一下教程发现视频里面讲的是使用HAL移植 FreeRTOS V10.4.6 版本,以前的标准库移植的是FreeRTOS V9.0 版本。而自己平时写代码使用的都是标准库,就想着能不能把FreeRTOS V10.4.6 版移植到标准库中去。
  为了移植简单,直接下载正点原子的代码在上面修改。实现思路为,下载一个标准库函数的FreeRTOS V9.0版的程序,然后在下载一个HAL库函数的FreeRTOS V10.4.6 版的程序,然后将HAL库函数中FreeRTOS 相关代码直接拷贝到标准库函数中替换FreeRTOS相关代码。

准备资料
  首先下载源码,下载mini开发板和战舰开发板的资料。




  mini开发板里面有标准库函数的FreeRTOS代码,战舰开发板里面有HAL库函数的FreeRTOS代码。

使用特权

评论回复
沙发
qsrg51|  楼主 | 2023-12-26 19:22 | 只看该作者
下载mini开发板资料,在mini开发板中找到扩展程序,在里面打开FreeRTOS例程,复制第一个程序到桌面。

使用特权

评论回复
板凳
qsrg51|  楼主 | 2023-12-26 19:23 | 只看该作者
 将文件夹重命名为FreeRTOS_demo

  随便打开一个FreeRTOS相关的文件,可以看到这个FreeRTOS的版本为V9.0


使用特权

评论回复
地板
qsrg51|  楼主 | 2023-12-26 19:25 | 只看该作者
 下载战舰开发板资料,在战舰开发板中找到扩展程序,在里面打开FreeRTOS例程,一会要用到这些程序里面FreeRTOS相关代码。

使用特权

评论回复
5
qsrg51|  楼主 | 2023-12-26 19:25 | 只看该作者

使用特权

评论回复
6
qsrg51|  楼主 | 2023-12-26 19:25 | 只看该作者
  随便打开一个FreeRTOS相关的文件,可以看到这个FreeRTOS的版本为V10.4.6

使用特权

评论回复
7
qsrg51|  楼主 | 2023-12-26 19:25 | 只看该作者
开始移植
删除main函数中无用代码
  准备工作已经完成了,下面开始移植。打开桌面上FreeRTOS_demo工程。

使用特权

评论回复
8
qsrg51|  楼主 | 2023-12-26 19:26 | 只看该作者
编译工程,确保工程文件的正确,接下来删除main文件中和FreeRTOS相关的代码和头文件。
  删除前代码如下:#include "led.h"
#include "delay.h"
#include "sys.h"
#include "FreeRTOS.h"
#include "task.h"
/************************************************
ALIENTEK Mini STM32F103开发板 FreeRTOS实验2-1
FreeRTOS移植实验-库函数版本
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/

//任务优先级
#define START_TASK_PRIO                1
//任务堆栈大小       
#define START_STK_SIZE                 128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define LED0_TASK_PRIO                2
//任务堆栈大小       
#define LED0_STK_SIZE                 50  
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);

//任务优先级
#define LED1_TASK_PRIO                3
//任务堆栈大小       
#define LED1_STK_SIZE                 50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4                  
        delay_init();                                            //延时函数初始化          
        uart_init(115200);                                        //初始化串口
        LED_Init();                                                          //初始化LED
       
         
        //创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,            
                (const char*    )"led0_task",          
                (uint16_t       )LED0_STK_SIZE,
                (void*          )NULL,                               
                (UBaseType_t    )LED0_TASK_PRIO,       
                (TaskHandle_t*  )&LED0Task_Handler);   
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);         
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//LED0任务函数
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
        vTaskDelay(500);
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}


使用特权

评论回复
9
qsrg51|  楼主 | 2023-12-26 19:26 | 只看该作者
删除后代码如下:#include "led.h"
#include "delay.h"
#include "sys.h"
/************************************************
ALIENTEK Mini STM32F103开发板 FreeRTOS实验2-1
FreeRTOS移植实验-库函数版本
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4                  
        delay_init();                                            //延时函数初始化          
        LED_Init();                                                          //初始化LED
}

使用特权

评论回复
10
qsrg51|  楼主 | 2023-12-26 19:37 | 只看该作者
 再次编译工程,确保代码没有错误。

使用特权

评论回复
11
qsrg51|  楼主 | 2023-12-26 19:37 | 只看该作者
替换FreeRTOS文件
  接下来替换FreeRTOS相关文件。将FreeRTOS_demo工程中FreeRTOS文件夹中的所有文件全部删除。

使用特权

评论回复
12
qsrg51|  楼主 | 2023-12-26 19:37 | 只看该作者
  删除FreeRTOS V9.0 所有文件

使用特权

评论回复
13
qsrg51|  楼主 | 2023-12-26 19:38 | 只看该作者
  接下来打开战舰资料中的FreeRTOS例程。文件目录为:【正点原子】战舰STM32F103开发板V4 资料盘(A盘)\4,程序源码\3,扩展例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验\Middlewares\FreeRTOS

使用特权

评论回复
14
qsrg51|  楼主 | 2023-12-26 19:38 | 只看该作者
打开FreeRTOS这个文件夹,将里面所有的文件复制到FreeRTOS_demo工程中FreeRTOS文件夹中。

使用特权

评论回复
15
qsrg51|  楼主 | 2023-12-26 19:38 | 只看该作者
复制初始化和配置文件
  接下来将 战舰STM32F103开发板V4 资料盘(A盘)\4,程序源码\3,扩展例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验\User 文件夹中freertos_demo.c、freertos_demo.h、FreeRTOSConfig.h 这三个文件复制到 FreeRTOS_demo这个工程的USER文件夹中。

使用特权

评论回复
16
qsrg51|  楼主 | 2023-12-26 19:38 | 只看该作者

使用特权

评论回复
17
qsrg51|  楼主 | 2023-12-26 19:38 | 只看该作者
修改代码
  打开 FreeRTOS_demo工程,可以看到此时FreeRTOS的版本已经成功替换为 V10.4.6版本了。

使用特权

评论回复
18
qsrg51|  楼主 | 2023-12-26 19:39 | 只看该作者
  将freertos_demo.c文件添加到USER文件夹中

使用特权

评论回复
19
qsrg51|  楼主 | 2023-12-26 19:39 | 只看该作者
在main函数中添加 freertos_demo.h头文件,在初始化代码中添加freertos_demo();函数。

使用特权

评论回复
20
qsrg51|  楼主 | 2023-12-26 19:39 | 只看该作者
调试编译工程
  将工程文件全部编译,此时工程里面出现了好多错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

395

帖子

2

粉丝