MDK移植freeRTOS及多任务创建

本文所使用的硬件为野火的指南者开发板,购买后,商家会提供已经移植好freeRTOS的工程可以直接使用进行开发。
但如果没有现成的框架,就需要自己移植,ST公司开发了集成了freeROTS可视化操作的stm32cubeIDE,可方便快捷的进行开发,但使用的是HAL库,在之后的文章中会进行介绍。
本文主要讲在keil中完成stm32标准库里freeRTOS操作系统的手动移植,并简单的创建两个不同频率的led闪烁和串口数据发送这3个任务

一、移植前准备

  • 在freeROTS官网下载freeROTS源码,下载后解压
    在这里插入图片描述
  • 新建一个文件夹freeRTOS,将刚才解压文件夹中的 FreeROTS\Source\ 目录下的所有文件复制到新建文件夹中
    在这里插入图片描述
  • portable/RVDS中的CM3复制到keil文件夹中
    在这里插入图片描述
    在这里插入图片描述
  • 解压的源码文件夹中的FreeRTOS\Demo\CORTEX_stm32f103_keil中的FreeRTOSConfig.h复制到自己新建的文件夹中
    在这里插入图片描述
    在这里插入图片描述

二、freeRTOS移植

  • 打开商家提供的一个例程,在例程目录中,将刚才自己新建的文件夹freeRTOS复制进去
    在这里插入图片描述
  • 打开工程,在工程中新建组FreeRTOS
    在这里插入图片描述
    在这里插入图片描述
  • 向组FreeRTOS添加文件
    在这里插入图片描述
    需要添加的文件都在刚才复制到工程目录的文件夹中,路径如下:
    freeRTOS\tasks.c
    freeRTOS\list.c
    freeRTOS\portable\Keil\ARM_CM3\port.c
    freeRTOS\portable\MemMang\heap_4.c
  • 添加头文件路径,右键工程,按照以下步骤,添加freeRTOS的头文件所在路径
    在这里插入图片描述
    在这里插入图片描述
    添加完成后进行编译,编译成功即说明移植已经基本完成了
    在这里插入图片描述
  • 想要进行实时操作系统下的编程,还需要对FreeRTOSConfig.hstm32f10x_it.c两个文件进行修改,在左边工程栏中找到文件,打开进行修改,下面分别是两个文件中需要进行修改的部分,如果没有则自己添加
    FreeRTOS.h
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    stm32f10x_it.c
    在这里插入图片描述
    在这里插入图片描述

修改完成后,编译成功即可进行主程序的编写。

三、创建任务

  • main.c输入以下代码
/* FreeRTOS头文件*/
#include "FreeRTOS.h"
#include "task.h"
/*stm32头文件*/
#include "bsp_led.h"
#include "bsp_usart.h"
#include "stm32f10x.h"


void Task1_led1()     //任务一
{
	while(1)
	{
		LED1_ON;
		vTaskDelay(500);	 //延时500ms
		LED1_OFF;
		vTaskDelay(500);	//延时500ms
	}
}
 
void Task2_uart()     //任务二

	while(1)
	{
		Usart_SendString( DEBUG_USARTx,"贾哥你好帅\n");
		vTaskDelay(2000);	//延时2000ms
	}
}

void Task3_led2()    //任务二
{
	while(1)
	{
	LED2_ON;
	vTaskDelay(1000);	 //延时1000ms
	LED2_OFF;
	vTaskDelay(1000);	//延时1000ms
	}
}

 int main(void)
 {	
	 
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);   //中断优先级设置为组4
	  
	 LED_GPIO_Config();		  	//LED初始化
	 USART_Config();            //串口初始化
	 xTaskCreate(Task1_led1,   //任务一函数指针
	           "TASK1_led1",   //任务一名称
	                    40,   //堆栈深度(字节)
	                  NULL,   //任务参数为空
	                     1,   //任务优先级设置,数字越大优先级越高
	                 NULL);   //任务句柄为空
	 
	 xTaskCreate(Task2_uart,"TASK2_uart",40,NULL,2,NULL);  //同上
	 xTaskCreate(Task3_led2,"TASK3_led2",40,NULL,3,NULL);  //同上
	 
	 vTaskStartScheduler();  //启动任务调度器,系统运行
	 
  while(1)
	{	
	}
 }

注意中断优先级的设置,需设置为 组4 ,在串口初始化函数中也要将其设置为 4
所有用到的头文件以及对应的C文件都要放到工程目录中,并添加到工程中
运行后,可以看到3个任务是几乎同步运行的。

  • 效果图,Y因为指南者板子的灯是复合灯,程序控制红灯间隔500ms,绿灯间隔1000ms,所以中间会出现红绿混合色。
    在这里插入图片描述
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值