天天看点

stm32上基于FreeRTOS多任务程序运行

    • 一、FreeRTOS简介
    • 二、在stm32开发板上实现多任务程序运行
      • 1、任务要求
      • 2、编写程序
      • 3、编译生成hex文件
      • 4、将程序下载到stm32开发板上

一、FreeRTOS简介

       FreeRTOS是一个迷你操作系统内核的小型嵌入式系统。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。

二、在stm32开发板上实现多任务程序运行

1、任务要求

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

2、编写程序

       因为指南者开发板的厂家为我们提供了很多源码直接供我们可使用,所以我们可以直接打开其中的一个FreeRTOS多任务程序。

stm32上基于FreeRTOS多任务程序运行
stm32上基于FreeRTOS多任务程序运行

选择其中的动态创建多任务文件。

stm32上基于FreeRTOS多任务程序运行

打开工程。

stm32上基于FreeRTOS多任务程序运行

注意:其路径最后全部是英文,没有中文,否则可能打不开,路径也不要太长。

将其中的主函数(main.c)修改成我们期望的程序,头文件不变,其他代码如下:

/* 创建任务句柄 */
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(); 
}


           

3、编译生成hex文件

stm32上基于FreeRTOS多任务程序运行
stm32上基于FreeRTOS多任务程序运行

4、将程序下载到stm32开发板上

stm32上基于FreeRTOS多任务程序运行

5、调试

设置好参数,打开串口

结果如下:

stm32上基于FreeRTOS多任务程序运行

总结

       以上就是本次所有的内容了,大家如果对FreePTOS感兴趣的话可以去查阅相关资料了解。

继续阅读