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
- 拷贝一个最简单的所使用cubeMX+HAL的LED实验工程作为待移植工程文件,并在基础工程中新建一个名为 FreeRTOS 的文件夹
注意这里的工程的timebase source时(即HAL_Delay的时钟源),默认cubeMX新建工程时使用的systick,不能使用SysTick,因为SysTick被FreeRTOS使用了,可以使用其他的(如TIM1、TIM2……)另外,假设使用了TIM2作为timebase source,记得修改其优先级为较高或最高,比如0或1


Systick的优先级由FreeRTOS设置,我们不用管
- 创建FreeRTOS文件夹之后将步骤1获取到的FreeRTOS文件下的FreeRTOSv202212.01->FreeRTOS->Source中的全部文件全部拷贝到创建文件夹下

- 其中为了工程轻简,protable文件夹下只留下以下三个文件夹:

2.Keil添加文件
-
用keil打开工程文件,点击所示图标新建两个分组FreeRTOS_CORE 和 FreeRTOS_PORTABLE
-
其中FreeRTOS_CORE中的文件为源码直接打开可看到的.c文件

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

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

-
keil添加include目录,一个是include,一个是ARM_CM3(自己所使用芯片内核对应的名称,一个是led.h即自己任务函数存放的位置)

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

3.代码修改
- 在stm32f1xx_it.c文件中,注释掉这两个函数定义
void SVC_Handler(void)
void PendSV_Handler(void)
- 如果此时编译报错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();
}
}
- 如果报错:Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o),#define configSUPPORT_STATIC_ALLOCATION 改为0 ,取消静态内存申请

4.自定义的任务函数
- 之前新建的任务函数存放的地方led.h:
#ifndef LED_H__
#define LED_H__
void task_led(void *argument);
#endif
- led.c
#

最低0.47元/天 解锁文章
2301

被折叠的 条评论
为什么被折叠?



