1、下载FreeRTOS源码
1.1github仓库下载
链接:FreeRTOS
下面的教程是基于从github下载压缩包进行的,最好下载这个或者直接看3.1,从我百度网盘下载。如果是别的下载源也问题不大,大同小异。
此时我们需要下载以下两个仓库,
点进去按下面的步骤下载就行了,另一个也是这样下。
1.2官网下载
链接: FreeRTOS官网
打开链接我们可以看到有两个下载选项,我们下载第一个就行。
下载速度较慢。
1.3百度网盘下载
链接:https://pan.baidu.com/s/1x00zgnJfCae75DpJ1W4RIg?pwd=1233
提取码:1233
若上述都不行可以直接私信。
2、FreeRTOS移植
2.1首先需要有一个可运行的标准库工程
我这里拿一个跟江科大创建的标准库工程为例:
2.2在工程内创建一个FreeRTOS文件夹,然后在FreeRTOS文件夹中再新建port、include、src三个文件夹。
- port文件夹存放移植平台的相关文件
- include文件夹存放FreeRTOS相关的头文件
- src文件夹用来存放FreeRTOS相关的源码
2.3 port文件夹移植
- 将下载的源码:FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff\portable\MemMang路径下的heap_4.c文件复制到自己创建的port文件夹中
- 将FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff\portable\RVDS\ARM_CM3路径下的port.c和portmacro.h文件复制到自己创建的port文件夹中
2.4 include文件夹移植
- 将下载源码:FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff\include路径下的所有头文件复制到自己创建的include文件夹中。
2.5 src文件夹移植
- 将FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff文件夹中的所有FreeRTOS相关.c文件复制到自己创建的src文件夹中
2.6 移植FreeRTOSConfig.h配置文件
- 在下载源码:FreeRTOS源码\FreeRTOS-main\FreeRTOS\Demo\CORTEX_STM32F103_Keil路径下将FreeRTOSConfig.h文件复制到自己创建的FreeRTOS文件夹中
2.7 在keil中添加文件路径
在keil中点击魔术棒,进入“C/C++”,在Include Paths中添加FreeRTO、src、inc、port路径。
2.8 打开组文件夹管理,新建FreeRTOS组
2.9 添加freeRTOS源文件
按下面的操作分别添加src文件夹和port文件夹下的所有.c文件
2.10 修改FreeRTOSConfig.h配置文件
- 1.先编译链接下工程
- 2.根据下面图操作打开FreeRTOSConfig.h文件
- 3.添加以下几条宏定义
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
2.10注释掉stm32f10x_it.c中的三个中断处理空函数
注释掉以下几个函数
void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
2.11此时编译链接无报错
3、调试测试
我们简单写一个让STM32F103C8T6最小系统板上led灯闪烁的程序测试下。
- 1.首先添加几个有关FreeRTOS基本操作的头文件
#include "freertos.h"
#include "task.h"
#include "timers.h"
- 2.简单写一个led灯对应GPIO初始化的函数
void Led_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
- 3.简单写一个led闪烁的任务
void Led_Task(void *pvParams)
{
Led_Init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
}
}
- 4.创建任务并启动调度
int main(void)
{
xTaskCreate(Led_Task,"ledtask",128,NULL,12,NULL);
vTaskStartScheduler();
}
- 5.下载到开发板上进行测试,效果很好。
main文件中的全部代码为
#include "stm32f10x.h" // Device header
#include "freertos.h"
#include "task.h"
#include "timers.h"
void Led_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void Led_Task(void *pvParams)
{
Led_Init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
}
}
int main(void)
{
xTaskCreate(Led_Task,"ledtask",128,NULL,12,NULL);
vTaskStartScheduler();
}
4.移植完成的工程
链接:https://pan.baidu.com/s/1E_bi4nIzayskaVl3YrLBGA?pwd=1233
提取码:1233文章来源:https://www.toymoban.com/news/detail-816177.html
5、注意
需要注意的是Stm32F103C8T6的SRAM仅有20KB,而我们移植的FreeRTOS默认占用了17KB来作为自己的堆,所以我们写不了多少程序就会出现内存超出无法编译的情况。
故我们需要手动将configTOTAL_HEAP_SIZE调小些。如:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) )文章来源地址https://www.toymoban.com/news/detail-816177.html
到了这里,关于FreeRTOS_Stm32F103系列单片机标准库移植的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!