stm32f103C8移植FreeRTOS记录

一、新建KEIL5工程

1、新建一个空目录,命名为stm32f103。 在stm32f103/新建目录: APP、LIB、USER、STARTUP

2、在stm32f103/下建立一个空的keil5工程命名为FreeRTOS。选择芯片STM32F103C8。

3、搭建工程框架,打开官方固件库包:

1)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver目录下的src、inc拷贝到stm32f103/LIB目录下

2)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下的 stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h拷贝到stm32f103/STARTUP目录下。

3)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下的startup_stm32f10x_hd.s文件拷贝到stm32f103/STARTUP目录下。

4)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport目录下的core_cm3.c、core_cm3.h拷贝到stm32f103/STARTUP目录下。

5)(将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录下的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h拷贝到 stm32f103/USER目录下。system_stm32f10x.c不要再拷贝了,因为上面已经拷贝过了。

4、写自己的应用代码。

在APP目录下新建自己的main.c文件。

5、

点击

弹出如下界面,新建如下代码分组,并将对应的文件添加到对于分组目录下

 

6、配置编译头文件路径

点击

弹出如下界面,添加头文件路径

 

二、移植FreeRTOS 9.0.0

1、在stm32f103目录下建立 FreeRTOS目录

2、将源码 FreeRTOSv9.0.0\FreeRTOS\Source下的所有文件拷贝到stm32f103/FreeRTOS目录下

3、portable 文件夹下的只需要留下keil、MemMang 和RVDS这三个文件夹,其它的都删除。

4、将源码 FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下的FreeRTOSConfig.h文件拷贝到stm32f103\FreeRTOS\include目录下。此文件是内核裁剪、配置文件。

5、将FreeRTOS代码加入到代码分组并设置头文件目录

相关文件地址如下

stm32f103\FreeRTOS\portable\MemMang\heap_4.c

stm32f103\FreeRTOS\portable\RVDS\ARM_CM3\port.c

 

t

头文件目录增加

6、在delay.c中增加代码,否则在调用

extern void xPortSysTickHandler(void);

void SysTick_Handler(void)

{

    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)

    {

        xPortSysTickHandler();

    }

}

7、在FreeRTOSConfig.h末尾增加如下三行,使用FreeRTOS提供的函数。

#define INCLUDE_xTaskGetSchedulerState  1

#define vPortSVCHandler SVC_Handler

#define xPortPendSVHandler PendSV_Handler

8、在stm32f10x_it.c中删除三个函数。

void SVC_Handler(void)

void PendSV_Handler(void)

void SysTick_Handler(void)

我之前测试时发现在这文件中实现SysTick_Handler()函数,在调用vTaskDelay()函数后程序卡住,xTaskGetTickCount()获取的系统节拍不会增加。在delay.c中实现就可以了,不知道为什。

9、在main函数中实现多任务创建和开始任务调度

#include "bsp.h"

#include "FreeRTOS.h"

#include "task.h"

void task1_entryPoint(void)

{

    while(1){

        vTaskDelay(1000/portTICK_RATE_MS);

    }

}

void task2_entryPoint(void)

{

    while(1) {

        vTaskDelay(100/portTICK_RATE_MS);

    }

}

int main()

{

    /* 创建任务句柄 */

    TaskHandle_t ledTurnOnTask_Handle = NULL;

    bsp_init();

    /* 创建任务 */

    xTaskCreate((TaskFunction_t )task1_entryPoint, /* 任务入口函数 */

                (const char*    )"task1_entryPoint",/* 任务名字 */

                (uint16_t       )512, /* 任务栈大小 */

                (void*          )NULL,/* 任务入口函数参数 */

                (UBaseType_t    )1, /* 任务的优先级 */

                (TaskHandle_t*  )&ledTurnOnTask_Handle);/* 任务控制块指针 */

    xTaskCreate((TaskFunction_t )task2_entryPoint, /* 任务入口函数 */

                (const char*    )"task2_entryPoint",/* 任务名字 */

                (uint16_t       )512, /* 任务栈大小 */

                (void*          )NULL,/* 任务入口函数参数 */

                (UBaseType_t    )1, /* 任务的优先级 */

                (TaskHandle_t*  )&ledTurnOnTask_Handle);/* 任务控制块指针 */

    /* 启动任务调度 */

    vTaskStartScheduler();

}

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!感谢您的提问。要将 FreeRTOS 移植到 STM32 上,可以按照以下步骤进行操作: 1. 配置 STM32 开发环境:安装 STM32CubeMX 和相关的开发工具,如 Keil 或者 STM32CubeIDE。 2. 创建一个新的 STM32 项目:使用 STM32CubeMX 创建一个新的项目,选择您的目标 MCU 型号,并配置相应的外设和时钟设置。 3. 生成代码:根据您的配置,生成初始化代码和 FreeRTOS 的配置文件。 4. 添加 FreeRTOS 文件:将 FreeRTOS 的源码添加到您的项目中。可以从官方网站下载最新版本的 FreeRTOS,并将其添加到您的项目文件夹中。 5. 配置 FreeRTOS:修改 FreeRTOSConfig.h 文件,根据您的需求配置任务堆栈大小、任务优先级等参数。 6. 配置中断:根据您的应用需求,配置合适的中断优先级,并且确保 FreeRTOS 的 tick 中断优先级较低。 7. 编写任务代码:根据您的应用需求,编写任务代码并创建任务。可以使用 FreeRTOS 提供的 API 函数来创建、删除和管理任务。 8. 编译和调试:编译您的项目并下载到 STM32 开发板上进行调试。确保任务能够正确运行并按照预期进行调度。 这些是大致的步骤,具体的移植细节可能会根据您的项目需求和 STM32 型号而有所不同。建议您参考相关的 FreeRTOS 文档和 STM32 的用户手册以获得更详细的信息和指导。希望对您有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值