嵌入式学习⑥——FreeRTOS入门

FreeRTOS入门


目录

  • FreeRTOS入门
    • 一、准备工作
    • 二、操作目的
    • 三、实验操作
      • 1.实验所需代码
      • 2.烧录程序


一、准备工作

所用器件:STM32 MINI、下载线ST–Link
所用编程软件:MDK5.33


二、操作目的

在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task。

  1. task1,每间隔500ms闪烁(变化)一次LED;
  2. task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
  3. task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。

三、实验操作

1.实验所需代码

#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(); 
}


程序编译运行如下:
嵌入式学习⑥——FreeRTOS入门_第1张图片

2.烧录程序

  1. 首先将电脑与核心板连接起来

  2. 配置下载环境

配置下载环境详细步骤见:STM32的USART窗口通讯程序

  1. 烧录程序进开发板MINI

使用调试助手测试如下:

嵌入式学习⑥——FreeRTOS入门_第2张图片
GIF演示:
嵌入式学习⑥——FreeRTOS入门_第3张图片
可以看到输出hello world的同时,两个灯交替闪烁
视频演示如下:

***

你可能感兴趣的:(阿为,stm32)