STM32标准库移植FreeRTOS并测试

STM32标准库移植FreeRTOS并测试

    • 最终现象
    • 一、移植
      • ①下载FreeRTOS源码
      • ②移植步骤
    • 二、测试
    • 三、工程项目

最终现象

主函数中创建三个任务,优先级都相同,意味着每个任务执行固定事件之后就会轮到下一个任务运行,由于这个时间是很短的,近似可以看成多任务同时运行。不同任务操控不同的led灯亮灭,最终视觉上的效果就是三个灯同时亮灭。

一、移植

①下载FreeRTOS源码

方法一:直接上官网下载
方法二:夸克网盘

②移植步骤

1、在自己的项目下新建FreeRTOS文件夹(项目直接使用江协科技的流水灯程序)
STM32标准库移植FreeRTOS并测试_第1张图片
2、在新建的FreeRTOS文件夹中新建以下三个文件夹
STM32标准库移植FreeRTOS并测试_第2张图片
3、将下面两图中的所有文件复制进前面新建好的port文件夹中
STM32标准库移植FreeRTOS并测试_第3张图片
STM32标准库移植FreeRTOS并测试_第4张图片
4将下图中所有头文件复制进前面新建好的inc文件夹中(README文件就不用了)
STM32标准库移植FreeRTOS并测试_第5张图片
5、将下图中所有c文件复制进前面新建好的src文件夹中
STM32标准库移植FreeRTOS并测试_第6张图片
6、将一个重要头文件复制到FreeRTOS目录下
STM32标准库移植FreeRTOS并测试_第7张图片
完成后如下:
STM32标准库移植FreeRTOS并测试_第8张图片
7、打开工程项目添加前面复制进来的文件到工程里
①添加文件路径
STM32标准库移植FreeRTOS并测试_第9张图片
STM32标准库移植FreeRTOS并测试_第10张图片
STM32标准库移植FreeRTOS并测试_第11张图片
②新建组存放这些文件
STM32标准库移植FreeRTOS并测试_第12张图片
③将文件添加进来
STM32标准库移植FreeRTOS并测试_第13张图片
按照上述上图方式把三个文件夹的文件全部添加进来。注意port文件夹只需要添加两个文件即可,如下:
STM32标准库移植FreeRTOS并测试_第14张图片
还有一个注意就是需要将FreeRTOSConfig.h也添加到inc组中,操作是一样的,只要找到点击添加就可以。

8、打开工程项目,修改代码
①修改FreeRTOSConfig.h文件:
在endif前加上以下三行代码:

#define xPortPendSVHandler  PendSV_Handler
#define vPortSVCHandler     SVC_Handler
#define xPortSysTickHandler SysTick_Handler

②修改stm32f10x_it.c文件:
将下图中圈起来的三个中断函数删除
STM32标准库移植FreeRTOS并测试_第15张图片

二、测试

直接在main.c编写代码即可因为只是简单的点灯:

#include "stm32f10x.h"          
#include "Delay.h" 
#include "FreeRTOS.h"      //使用之前至少要包含FreeRTOS.h和task.h
#include "task.h"

TaskHandle_t mytask1;      //任务句柄
TaskHandle_t mytask2;
TaskHandle_t mytask3;

void myTask( void *arg )
{
	while(1)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);
		vTaskDelay(500);
		GPIO_SetBits(GPIOC, GPIO_Pin_13);
		vTaskDelay(500);
	}
}

void myTask2( void *arg )
{
	while(1)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_14);
		vTaskDelay(500);
		GPIO_SetBits(GPIOC, GPIO_Pin_14);
		vTaskDelay(500);
	}
}

void myTask3( void *arg )
{
	while(1)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_15);
		vTaskDelay(500);
		GPIO_SetBits(GPIOC, GPIO_Pin_15);
		vTaskDelay(500);
	}
}

	

int main(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_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOC, GPIO_Pin_13);
	GPIO_ResetBits(GPIOC, GPIO_Pin_14);
	GPIO_ResetBits(GPIOC, GPIO_Pin_15);
	
	xTaskCreate(myTask,"matask",512,NULL,2,&mytask1);      //创建三个优先级相同的任务
	xTaskCreate(myTask2,"matask2",512,NULL,2,&mytask2);
	xTaskCreate(myTask3,"matask3",512,NULL,2,&mytask3);
	vTaskStartScheduler();      //开启任务调度,这句代码之后的程序不会执行,比如下面的while死循环
	
	while (1)
	{
	}
}

三、工程项目

我用夸克网盘分享了「STM32标准库移植FreeRTOS.rar」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/7ff1f2cb2f0d

你可能感兴趣的:(stm32,实时操作系统,freertos)