STM32完成FreeRTOS的多任务程序

STM32完成FreeRTOS的多任务程序

一、FreeRTOS移植

1、简述
RTOS(Real Time Operating System 实时操作系统。
FreeRTOS是其中应用最为广泛的一种,开源免费,源码和相应的官方书籍均可从官网 www.freertos.org 获得。
使用FreeRTOS移植源码,创建多任务进行编程可以使单片机可实现功能更多,多任务管理编程更加简单。
这就是区别于裸机系统单片机编程的一点。
2、参考书籍下载
对于FreeRTOS移植,由于本人所用单片机为野火家的指南者,因此学习资料直接从野火提供的资料包里学习使用。
资料包中的学习书目路径如下:下载连接 提取码:pmf1
在这里插入图片描述
3、多任务管理实现
(1)在野火资料包里找到可移植的FreeRTOS模板,进行多任务的操作。文件路径如下:
在这里插入图片描述
(2)之后解压到当前文件夹下
(3)因为我们要做的是多任务程序,因此选择打开“14-3SRAM动态创建多任务”,之后选择“project”下的keil工程文件双击打开即可。如下:
在这里插入图片描述
(4)打开后,文件显示如下
在这里插入图片描述
可以看到,此时的该工程文件已完成拷贝 FreeRTOS Package 到裸机工程,FreeRTOSConfig.h 文件到 user 文件夹的工作,无需手动添加。FreeRTOS/src 和 FreeRTOS/port 组也已建立完成。
此时在main.c主程序下去看,包含几个部分如下:
1)硬件初始化;
2)创建任务。
我们要做的有三个任务,因此需要创建三个任务,步骤如下:
-打开main.c函数找到任务句柄部分
在这里插入图片描述

/* 创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle = NULL;
/* 创建LED1句柄 */
static TaskHandle_t LED1_Task_Handle = NULL;//task1,每间隔500ms闪烁(变化)一次LED;
/* 创建hello句柄 */
static TaskHandle_t hello_Task_Handle = NULL;//task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
/* 创建AHT20句柄 */
static TaskHandle_t AHT_Task_Handle = NULL;//task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。 

在主程序中添加hello任务

 xReturn = xTaskCreate((TaskFunction_t )hello_Task, 
                        (const char*    )"hello_Task",
                        (uint16_t       )512,  
                        (void*          )NULL,	
                        (UBaseType_t    )3,	 
                        (TaskHandle_t*  )&hello_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建hello任务成功!\r\n");

在主程序中添加AHT20任务

xReturn = xTaskCreate((TaskFunction_t )AHT_Task, 
                        (const char*    )"AHT_Task",
                        (uint16_t       )512,  
                        (void*          )NULL,
                        (UBaseType_t    )3,	  
                        (TaskHandle_t*  )&AHT_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建AHT20任务成功!\r\n");

再添加如下两个函数

static void hello_Task(void* parameter)
{	
    while (1)
    {
        vTaskDelay(2000);  
        printf("hello World!\n");
            
    }
}
static void AHT_Task(void* parameter)
{	
    
     /*暂无*/   
            
    
}

修改完成后主程序如下

#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"


static TaskHandle_t AppTaskCreate_Handle = NULL;

static TaskHandle_t LED1_Task_Handle = NULL;

static TaskHandle_t hello_Task_Handle = NULL; 



static void AppTaskCreate(void);

static void LED1_Task(void* pvParameters);
static void hello_Task(void* pvParameters);
static void AHT_Task(void* pvParameters);

static void BSP_Init(void);


int main(void)
{	
  BaseType_t xReturn = pdPASS;
  BSP_Init();
  printf("这是一个多任务实验\r\n");

  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  
                        (const char*    )"AppTaskCreate",
                        (uint16_t       )512,  
                        (void*          )NULL, 
                        (UBaseType_t    )1, 
                        (TaskHandle_t*  )
   
  if(pdPASS == xReturn)
    vTaskStartScheduler();  
  else
    return -1;  
  
  while(1);       
}
static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;
  
  taskENTER_CRITICAL();         
  
 
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task, 
                        (const char*    )"LED1_Task",
                        (uint16_t       )512,   
                        (void*          )NULL,	
                        (UBaseType_t    )2,	    
                        (TaskHandle_t*  )&LED1_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建LED灯任务成功!\r\n");
  

  xReturn = xTaskCreate((TaskFunction_t )hello_Task, 
                        (const char*    )"hello_Task",
                        (uint16_t       )512,  
                        (void*          )NULL,	
                        (UBaseType_t    )3,	 
                        (TaskHandle_t*  )&hello_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建hello任务成功!\r\n");
  

	vTaskDelete(AppTaskCreate_Handle); 
  taskEXIT_CRITICAL();          
}
static void LED1_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500); 
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);   		 		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}
static void hello_Task(void* parameter)
{	
    while (1)
    {
        vTaskDelay(2000);  
        printf("hello World!\n");
            
    }
}

static void BSP_Init(void)
{
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	LED_GPIO_Config();
	USART_Config();
  
}

修改完成后,编译运行,生成hex文件
在这里插入图片描述

二、程序的烧录

接下来通过usb将程序烧录到指南者板子里
过程如下
首先利用USB线将板子与上位机连接(连“usb转串口”)
安装驱动
在这里插入图片描述

在mcuisp中进行配置
并导入刚才修改完代码的hex文件如下
在这里插入图片描述

点击开始编程
板子变化如下,第一个LED任务执行成功
在这里插入图片描述

在野火资料包中下载野火串口调试助手v1.0.1.5
双击运行,设置串行口调试设置波特率为115200,1位停止位,无校验位:
点击打开串口,程序运行如下
在这里插入图片描述

三、 总结

通过此次学习,我了解了一些FreeRTOS多任务系统的知识,并理解了FreeRTOS的多任务的创建和实践。作为初学者,自己所学到的知识太少了,还需要继续努力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值