STM32F103移植FreeRTOS

1. 源码下载

  1. 在https://www.freertos.org/中下载源码,这里下载的是FreeRTOSv202212.01版本,源码内容解释可参考:
https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter7.html#_7-1-freertos%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84
  1. 拷贝一个最简单的所使用cubeMX+HAL的LED实验工程作为待移植工程文件,并在基础工程中新建一个名为 FreeRTOS 的文件夹
    注意这里的工程的timebase source时(即HAL_Delay的时钟源),默认cubeMX新建工程时使用的systick,不能使用SysTick,因为SysTick被FreeRTOS使用了,可以使用其他的(如TIM1、TIM2……)另外,假设使用了TIM2作为timebase source,记得修改其优先级为较高或最高,比如0或1
    在这里插入图片描述
    在这里插入图片描述

Systick的优先级由FreeRTOS设置,我们不用管

  1. 创建FreeRTOS文件夹之后将步骤1获取到的FreeRTOS文件下的FreeRTOSv202212.01->FreeRTOS->Source中的全部文件全部拷贝到创建文件夹下
    在这里插入图片描述
  2. 其中为了工程轻简,protable文件夹下只留下以下三个文件夹:
    在这里插入图片描述

2.Keil添加文件

  1. 用keil打开工程文件,点击所示图标新建两个分组FreeRTOS_CORE 和 FreeRTOS_PORTABLE

  2. 其中FreeRTOS_CORE中的文件为源码直接打开可看到的.c文件
    在这里插入图片描述

  3. FreeRTOS_PORTABLE中的文件为port.c 是 RVDS 文件 夹下的 ARM_CM3 中的文件,因为 STM32F103 是 Cortex-M3 内核的,因此要选择 ARM_CM3 中的 port.c 文件,heap_4.c 是 MemMang 文件夹中的,因为heap_4 提供了一个最优的匹配算法,选择heap_4相关API进行内存管理。
    在这里插入图片描述

  4. 在工程文件夹中创建USER文件夹,用于存放自己的任务代码,这里使用最简单的闪烁LED任务,在USER文件夹中新建led.c和led.h,Keil中新建USER分组并添加led.c文件,这两个文件暂时空白,最后会说。
    在这里插入图片描述 在这里插入图片描述

  5. keil添加include目录,一个是include,一个是ARM_CM3(自己所使用芯片内核对应的名称,一个是led.h即自己任务函数存放的位置)
    在这里插入图片描述

  6. 这里还缺少缺少FreeRTOSConfig.h,他是FreeRTOS 的配置文件,一般的操作系统都有裁剪、配置功能,而这些裁剪及配置都是通过一个文件来完成的,基本都是通过宏定 义来完成对系统的配置和裁剪的。可以到FreeRTOS的demo里面相关的,但是不同硬件和环境配置不同,本操作韦东山瑞士军刀F103的板子,直接拷贝一份freertos示例代码中的FreeRTOSConfig.h到FreeRTOS的include目录下,如果有则进入章节3
    如果没有这个头文件则看看源码Demo文件夹中有没有自己芯片内核名称的文件夹,如CORTEX_CM3…等,复制里面的FreeRTOSConfig.h,我所使用的这个源码在章节五。

  7. 在这里插入图片描述

3.代码修改

  1. 在stm32f1xx_it.c文件中,注释掉这两个函数定义
void SVC_Handler(void)
void PendSV_Handler(void)
  1. 如果此时编译报错systick_Handler重定义(在port.c和stm32f1xx_it.c中定义),则把stm32f1xx_it.c中的注释掉,如果没有报错则在stm32f1xx_it.c中改写这个函数:
#include "FreeRTOS.h"
#include "task.h"
extern void xPortSysTickHandler(void);
//systick中断服务函数,使用ucos时用到
void SysTick_Handler(void)
{
   
   	
    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
   
   
        xPortSysTickHandler();	
    }
}

  1. 如果报错:Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o),#define configSUPPORT_STATIC_ALLOCATION 改为0 ,取消静态内存申请
    在这里插入图片描述

4.自定义的任务函数

  1. 之前新建的任务函数存放的地方led.h:
#ifndef LED_H__
#define LED_H__

void task_led(void *argument);

#endif
  1. led.c
#
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值