【从0制作自己的ros导航小车:下位机篇】01、工程准备_标准库移植freertos

前言

本系列下位机开发使用keilv5,开发时使用移植了freertos的标准库,如果是资源比较丰富的开发板,可以不用移植freertos,本系列用的是stm32f103c8t6,一共只有四个普通定时器,写代码时全部用了,高级定时器不知道为什么一直有问题,所以移植实时操作系统,控制代码执行频率,如果你的高级定时器可以使用,那也可以跳过这篇文章。

最终现象

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

一、移植

①下载FreeRTOS源码

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

②移植步骤

1、在自己的项目下新建FreeRTOS文件夹(项目直接使用江协科技的流水灯程序)
在这里插入图片描述
2、在新建的FreeRTOS文件夹中新建以下三个文件夹
在这里插入图片描述
3、将下面两图中的所有文件复制进前面新建好的port文件夹中
在这里插入图片描述
在这里插入图片描述
4将下图中所有头文件复制进前面新建好的inc文件夹中(README文件就不用了)
在这里插入图片描述
5、将下图中所有c文件复制进前面新建好的src文件夹中
在这里插入图片描述
6、将一个重要头文件复制到FreeRTOS目录下
在这里插入图片描述
完成后如下:
在这里插入图片描述
7、打开工程项目添加前面复制进来的文件到工程里
①添加文件路径
点击魔术棒--------点击C/C++----------
在这里插入图片描述
在这里插入图片描述
②新建组存放这些文件
在这里插入图片描述
③将文件添加进来
在这里插入图片描述
按照上述上图方式把三个文件夹的文件全部添加进来。注意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)
	{
	}
}

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值