一、下载FreeRTOS的资源包
直接搜freertos官网就行了,或者以下链接FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions
二、移植FreeRTOS
一、文件移植
首先在工程文件中添加一个FreeRTOS的文件
然后里面创建3个目录,分别是src、lnc、port
1、src文件夹,主要存放.c文件,从刚刚下载的目录中找到source目录,FreeRTOSv9.0.0\FreeRTOS\Source,把所有.c文件复制到src目录
2、lnc文件夹主要存放.h的文件
找到刚刚下载的include目录FreeRTOSv9.0.0\FreeRTOS\Source\include,复制里面所有的.h文件到lnc目录
将FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下的FreeRTOSConfig.h文件也复制到lnc目录下
3、port文件夹
FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3目录下的所有文件复制到port路径
CM3是看你的板子内核来的,如果是F1就是CM3,如果是F4就是CM4,其他的自己百度一下
FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang路径下的所有文件复制到port目录
以上文件都搞定了,以下是keil里面的一些配置
二、keil配置
1、点击魔术棒按钮、然后C/C++添加刚才创建的路径
2、点击三个箱子的按钮,添加FreeRTOS的目录,再将刚才的文件全部添加到,如下图
然后进入FreeRTOSConfig.h文件,拉到最后,在endif之前加上以下代码,这些是FreeRTOS定义好的,然后需要注释掉原来的中断函数,进入stm32f10x_it.c中,ctrl+f搜索
void SVC_Handler(void)、void PendSV_Handler(void)、void SysTick_Handler(void)把这几个空函数给注释掉
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
好的以上就已经完成了基本的移植
三、测试
编译测试一下,看看有没有问题,然后可以写一个电灯的代码测试一下,GPIOC_Pin_13是最小系统板上的LED
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "freertos.h"
#include "task.h"
TaskHandle_t myTaskHandler; //任务句柄
void myTask1(void *arg) //LED闪烁的任务
{
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
}
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//启动GPIO时钟
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);
xTaskCreate(myTask1,"led1",64,NULL,2,&myTaskHandler);//创建任务
vTaskStartScheduler(); //调用
while(1)
{
}
}
没有板的可以试一下仿真看看波形,先打开仿真,下面记得填上对应的型号,不改仿真不了、
不改仿真不了、不改仿真不了
然后点击debug,选择逻辑分析仪(logic analyzer),setup,然后点击添加,填入PORTC.13,类型改成bit,ok,全速运行