STM32标准库移植FreeRTOS并测试
- 最终现象
- 一、移植
- ①下载FreeRTOS源码
- ②移植步骤
- 二、测试
- 三、工程项目
最终现象
主函数中创建三个任务,优先级都相同,意味着每个任务执行固定事件之后就会轮到下一个任务运行,由于这个时间是很短的,近似可以看成多任务同时运行。不同任务操控不同的led灯亮灭,最终视觉上的效果就是三个灯同时亮灭。
一、移植
①下载FreeRTOS源码
方法一:直接上官网下载
方法二:夸克网盘
②移植步骤
1、在自己的项目下新建FreeRTOS文件夹(项目直接使用江协科技的流水灯程序)
2、在新建的FreeRTOS文件夹中新建以下三个文件夹
3、将下面两图中的所有文件复制进前面新建好的port文件夹中
4将下图中所有头文件复制进前面新建好的inc文件夹中(README文件就不用了)
5、将下图中所有c文件复制进前面新建好的src文件夹中
6、将一个重要头文件复制到FreeRTOS目录下
完成后如下:
7、打开工程项目添加前面复制进来的文件到工程里
①添加文件路径
②新建组存放这些文件
③将文件添加进来
按照上述上图方式把三个文件夹的文件全部添加进来。注意port文件夹只需要添加两个文件即可,如下:
还有一个注意就是需要将FreeRTOSConfig.h也添加到inc组中,操作是一样的,只要找到点击添加就可以。
8、打开工程项目,修改代码
①修改FreeRTOSConfig.h文件:
在endif前加上以下三行代码:
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
②修改stm32f10x_it.c文件:
将下图中圈起来的三个中断函数删除
二、测试
直接在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