FreeRTOS入门

FreeRTOS入门

一,实验目标

学习FreeRTOS原理,在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:
1、task1,每间隔500ms闪烁(变化)一次LED;
2、task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
3、task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。

二,准备工作

(一)先连接硬件。(较简单,在此不再赘述)

(二)下载野火官方资源文件


打开project

三,操作步骤

(一)分析代码
分析代码主要由五部分构成
(1)任务主体构成

**********************************************************************
  * @ 函数名  : LED_Task
  * @ 功能说明: LED_Task任务主体
  * @ 参数    :   
  * @ 返回值  : 无
  ********************************************************************/
static void LED2_Task(void* parameter)
{	
    while (1)
    {
        LED2_ON;
        vTaskDelay(500);   /* 延时500个tick */
        
			
        
        LED2_OFF;     
        vTaskDelay(500);   /* 延时500个tick */		 		
        
    }
		
}

(2)创建LED_Task任务

  /* 创建LED_Task任务 */
  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("创建LED1_Task任务成功!\r\n");
  
	/* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED2_Task, /* 任务入口函数 */
                        (const char*    )"LED2_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )3,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED2_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
	

(3)LED任务句柄

static TaskHandle_t AppTaskCreate_Handle = NULL;
/* LED1任务句柄 */
static TaskHandle_t LED1_Task_Handle = NULL;
/* LED2任务句柄 */
static TaskHandle_t LED2_Task_Handle = NULL;

(4)函数声明

/*
*************************************************************************
*                             函数声明
*************************************************************************
*/
static void AppTaskCreate(void);/* 用于创建任务 */

static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */
static void LED2_Task(void* pvParameters);/* LED2_Task任务实现 */
static void usb_Task(void* pvParameters);/* LED2_Task任务实现 */

(5)主函数

int main(void)
{	
  BaseType_t xReturn = pdPASS;/* ¶¨ÒåÒ»¸ö´´½¨ÐÅÏ¢·µ»ØÖµ£¬Ä¬ÈÏΪpdPASS */

  /* ¿ª·¢°åÓ²¼þ³õʼ»¯ */
  BSP_Init();
  printf("ÕâÊÇÒ»¸ö[Ò°»ð]-STM32ȫϵÁпª·¢°å-FreeRTOS-¶¯Ì¬´´½¨¶àÈÎÎñʵÑé!\r\n");
   /* ´´½¨AppTaskCreateÈÎÎñ */
  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* ÈÎÎñÈë¿Úº¯Êý */
                        (const char*    )"AppTaskCreate",/* ÈÎÎñÃû×Ö */
                        (uint16_t       )512,  /* ÈÎÎñÕ»´óС */
                        (void*          )NULL,/* ÈÎÎñÈë¿Úº¯Êý²ÎÊý */
                        (UBaseType_t    )1, /* ÈÎÎñµÄÓÅÏȼ¶ */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* ÈÎÎñ¿ØÖÆ¿éÖ¸Õë */ 
  /* Æô¶¯ÈÎÎñµ÷¶È */           
  if(pdPASS == xReturn)
    vTaskStartScheduler();   /* Æô¶¯ÈÎÎñ£¬¿ªÆôµ÷¶È */
  else
    return -1;  
  
  while(1);   /* Õý³£²»»áÖ´Ðе½ÕâÀï */    
}

(二)改写代码
(1)改写任务句柄部分

/* 创建任务句柄 */
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采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。 

(2)改写主程序

#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 TaskHandle_t AHT_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*  )&AppTaskCreate_Handle);         
  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("创建LED1_Task任务成功!\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_Task任务成功!\r\n");
  
  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("创建AHT_Task任务成功!\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 AHT_Task(void* parameter)
{	
    
     /*无硬件,之后实现*/   
                
}
static void BSP_Init(void)
{
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	LED_GPIO_Config();
	USART_Config(); 
}

(三)编译运行
(1)编译生成AFX文件

(2)设置


添加

四,运行结果


你好!关于 FreeRTOS入门,我可以给你一些基本的指导。 FreeRTOS 是一个开源的实时操作系统(RTOS),它被广泛用于嵌入式系统开发。下面是一些入门的步骤: 1. 下载和安装 FreeRTOS:首先,你需要从 FreeRTOS 的官方网站(https://www.freertos.org/)下载 FreeRTOS 的最新版本。根据你的需求选择合适的版本,可能是源代码或者预编译好的二进制文件。安装方法可以参考官方提供的文档。 2. 阅读文档:FreeRTOS 提供了详细的文档,包括参考手册、编程指南和示例代码等。你应该仔细阅读这些文档,了解 FreeRTOS 的基本概念、API 接口和使用方法。 3. 配置 FreeRTOS:在开始使用 FreeRTOS 之前,你需要根据你的硬件平台和应用需求进行配置。这包括选择适当的内核配置选项、任务调度策略、堆栈大小等。你可以根据文档中的指导进行配置。 4. 创建任务:在 FreeRTOS 中,任务是系统的基本执行单位。你可以使用 FreeRTOS 提供的 API 创建和管理任务。首先,你需要定义任务函数,然后使用 xTaskCreate() 函数创建任务。 5. 运行 FreeRTOS:一旦你创建了任务,你可以使用 vTaskStartScheduler() 函数启动 FreeRTOS 内核,并开始任务调度。FreeRTOS 内核会按照你配置的调度策略和优先级来调度任务执行。 6. 调试和优化:在开发过程中,你可能会遇到一些问题,比如任务调度错误、内存泄漏等。你可以使用 FreeRTOS 提供的调试工具和技术来诊断和解决这些问题。同时,你也可以根据应用的需求对系统进行优化。 以上是 FreeRTOS 入门的基本步骤。希望对你有所帮助!如果你有更多的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值