FreeRtos入门

FreeRtos入门

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

本次使用野火指南者单片机,所作实验以野火提供资料为模板
百度云链接
提取码:0375
百度云链接
提取码:pmf1
下图为野火提供的实验工程模板
在这里插入图片描述

文档路径:基于STM32F103_指南者_开发板\ebf_freertos_base_code_stm32f103_zhinanzhe\14-3,SRAM动态创建多任务\Project\RVMDK(uv5)

为实现任务要求,将三个任务依次创建并执行
修改main.c代码如下:

/**
  *********************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2018-xx-xx
  * @brief   FreeRTOS v9.0.0 + STM32 ¶¯Ì¬´´½¨¶àÈÎÎñ
  *********************************************************************
  * @attention
  *
  * ʵÑéƽ̨:Ò°»ð STM32ȫϵÁпª·¢°å 
  * ÂÛ̳    :http://www.firebbs.cn
  * ÌÔ±¦    :https://fire-stm32.taobao.com
  *
  **********************************************************************
  */ 
 
/*
*************************************************************************
*                             °üº¬µÄÍ·Îļþ
*************************************************************************
*/ 
/* FreeRTOSÍ·Îļþ */
#include "FreeRTOS.h"
#include "task.h"
/* ¿ª·¢°åÓ²¼þbspÍ·Îļþ */
#include "bsp_led.h"
#include "bsp_usart.h"

/**************************** ÈÎÎñ¾ä±ú ********************************/
/* 
 * ÈÎÎñ¾ä±úÊÇÒ»¸öÖ¸Õ룬ÓÃÓÚÖ¸ÏòÒ»¸öÈÎÎñ£¬µ±ÈÎÎñ´´½¨ºÃÖ®ºó£¬Ëü¾Í¾ßÓÐÁËÒ»¸öÈÎÎñ¾ä±ú
 * ÒÔºóÎÒÃÇÒªÏë²Ù×÷Õâ¸öÈÎÎñ¶¼ÐèҪͨ¹ýÕâ¸öÈÎÎñ¾ä±ú£¬Èç¹ûÊÇ×ÔÉíµÄÈÎÎñ²Ù×÷×Ô¼º£¬ÄÇô
 * Õâ¸ö¾ä±ú¿ÉÒÔΪNULL¡£
 */
 /* ´´½¨ÈÎÎñ¾ä±ú */
static TaskHandle_t AppTaskCreate_Handle = NULL;
/* LED1ÈÎÎñ¾ä±ú */
static TaskHandle_t LED1_Task_Handle = NULL;
/* LED2ÈÎÎñ¾ä±ú */
static TaskHandle_t LED2_Task_Handle = NULL;
/* LED3ÈÎÎñ¾ä±ú */
static TaskHandle_t LED3_Task_Handle = NULL;

/********************************** Äں˶ÔÏó¾ä±ú *********************************/
/*
 * ÐźÅÁ¿£¬ÏûÏ¢¶ÓÁУ¬Ê¼þ±êÖ¾×飬Èí¼þ¶¨Ê±Æ÷ÕâЩ¶¼ÊôÓÚÄں˵ĶÔÏó£¬ÒªÏëʹÓÃÕâЩÄÚºË
 * ¶ÔÏ󣬱ØÐëÏÈ´´½¨£¬´´½¨³É¹¦Ö®ºó»á·µ»ØÒ»¸öÏàÓ¦µÄ¾ä±ú¡£Êµ¼ÊÉϾÍÊÇÒ»¸öÖ¸Õ룬ºóÐøÎÒ
 * ÃǾͿÉÒÔͨ¹ýÕâ¸ö¾ä±ú²Ù×÷ÕâЩÄں˶ÔÏó¡£
 *
 * Äں˶ÔÏó˵°×Á˾ÍÊÇÒ»ÖÖÈ«¾ÖµÄÊý¾Ý½á¹¹£¬Í¨¹ýÕâЩÊý¾Ý½á¹¹ÎÒÃÇ¿ÉÒÔʵÏÖÈÎÎñ¼äµÄͨÐÅ£¬
 * ÈÎÎñ¼äµÄʼþͬ²½µÈ¸÷ÖÖ¹¦ÄÜ¡£ÖÁÓÚÕâЩ¹¦ÄܵÄʵÏÖÎÒÃÇÊÇͨ¹ýµ÷ÓÃÕâЩÄں˶ÔÏóµÄº¯Êý
 * À´Íê³ÉµÄ
 * 
 */


/******************************* È«¾Ö±äÁ¿ÉùÃ÷ ************************************/
/*
 * µ±ÎÒÃÇÔÚдӦÓóÌÐòµÄʱºò£¬¿ÉÄÜÐèÒªÓõ½Ò»Ð©È«¾Ö±äÁ¿¡£
 */


/*
*************************************************************************
*                             º¯ÊýÉùÃ÷
*************************************************************************
*/
static void AppTaskCreate(void);/* ÓÃÓÚ´´½¨ÈÎÎñ */

static void LED1_Task(void* pvParameters);/* LED1_TaskÈÎÎñʵÏÖ */
static void LED2_Task(void* pvParameters);/* LED2_TaskÈÎÎñʵÏÖ */
static void LED3_Task(void* pvParameters);/* LED3_TaskÈÎÎñʵÏÖ */

static void BSP_Init(void);/* ÓÃÓÚ³õʼ»¯°åÔØÏà¹Ø×ÊÔ´ */

/*****************************************************************
  * @brief  Ö÷º¯Êý
  * @param  ÎÞ
  * @retval ÎÞ
  * @note   µÚÒ»²½£º¿ª·¢°åÓ²¼þ³õʼ»¯ 
            µÚ¶þ²½£º´´½¨APPÓ¦ÓÃÈÎÎñ
            µÚÈý²½£ºÆô¶¯FreeRTOS£¬¿ªÊ¼¶àÈÎÎñµ÷¶È
  ****************************************************************/
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);   /* Õý³£²»»áÖ´Ðе½ÕâÀï */    
}


/***********************************************************************
  * @ º¯ÊýÃû  £º AppTaskCreate
  * @ ¹¦ÄÜ˵Ã÷£º ΪÁË·½±ã¹ÜÀí£¬ËùÓеÄÈÎÎñ´´½¨º¯Êý¶¼·ÅÔÚÕâ¸öº¯ÊýÀïÃæ
  * @ ²ÎÊý    £º ÎÞ  
  * @ ·µ»ØÖµ  £º ÎÞ
  **********************************************************************/
static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;/* ¶¨ÒåÒ»¸ö´´½¨ÐÅÏ¢·µ»ØÖµ£¬Ä¬ÈÏΪpdPASS */
  
  taskENTER_CRITICAL();           //½øÈëÁÙ½çÇø
  
  /* ´´½¨LED_TaskÈÎÎñ */
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task, /* ÈÎÎñÈë¿Úº¯Êý */
                        (const char*    )"LED1_Task",/* ÈÎÎñÃû×Ö */
                        (uint16_t       )512,   /* ÈÎÎñÕ»´óС */
                        (void*          )NULL,	/* ÈÎÎñÈë¿Úº¯Êý²ÎÊý */
                        (UBaseType_t    )3,	    /* ÈÎÎñµÄÓÅÏȼ¶ */
                        (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    )4,	    /* ÈÎÎñµÄÓÅÏȼ¶ */
                        (TaskHandle_t*  )&LED2_Task_Handle);/* ÈÎÎñ¿ØÖÆ¿éÖ¸Õë */
  if(pdPASS == xReturn)
    printf("´´½¨LED2_TaskÈÎÎñ³É¹¦!\r\n");
	xReturn = xTaskCreate((TaskFunction_t )LED3_Task, /* ÈÎÎñÈë¿Úº¯Êý */
                        (const char*    )"LED3_Task",/* ÈÎÎñÃû×Ö */
                        (uint16_t       )512,   /* ÈÎÎñÕ»´óС */
                        (void*          )NULL,	/* ÈÎÎñÈë¿Úº¯Êý²ÎÊý */
                        (UBaseType_t    )2,	    /* ÈÎÎñµÄÓÅÏȼ¶ */
                        (TaskHandle_t*  )&LED3_Task_Handle);/* ÈÎÎñ¿ØÖÆ¿éÖ¸Õë */
  if(pdPASS == xReturn)
    printf("´´½¨LED3_TaskÈÎÎñ³É¹¦!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); //ɾ³ýAppTaskCreateÈÎÎñ
  
  taskEXIT_CRITICAL();            //Í˳öÁÙ½çÇø
}



/**********************************************************************
  * @ º¯ÊýÃû  £º LED_Task
  * @ ¹¦ÄÜ˵Ã÷£º LED_TaskÈÎÎñÖ÷Ìå
  * @ ²ÎÊý    £º   
  * @ ·µ»ØÖµ  £º ÎÞ
  ********************************************************************/
static void LED1_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   /* ÑÓʱ500¸ötick */
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);   /* ÑÓʱ500¸ötick */		 		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}

/**********************************************************************
  * @ º¯ÊýÃû  £º LED_Task
  * @ ¹¦ÄÜ˵Ã÷£º LED_TaskÈÎÎñÖ÷Ìå
  * @ ²ÎÊý    £º   
  * @ ·µ»ØÖµ  £º ÎÞ
  ********************************************************************/
static void LED2_Task(void* parameter)
{	
    while (1)
    {
        
        vTaskDelay(2000);   /* ÑÓʱ500¸ötick */
        printf("hello world\r\n");
        
        
       		
       
    }
}
static void LED3_Task(void* parameter)
{
	while(1);
}
/***********************************************************************
  * @ º¯ÊýÃû  £º BSP_Init
  * @ ¹¦ÄÜ˵Ã÷£º °å¼¶ÍâÉè³õʼ»¯£¬ËùÓаå×ÓÉϵijõʼ»¯¾ù¿É·ÅÔÚÕâ¸öº¯ÊýÀïÃæ
  * @ ²ÎÊý    £º   
  * @ ·µ»ØÖµ  £º ÎÞ
  *********************************************************************/
static void BSP_Init(void)
{
	/*
	 * STM32ÖжÏÓÅÏȼ¶·Ö×éΪ4£¬¼´4bit¶¼ÓÃÀ´±íʾÇÀÕ¼ÓÅÏȼ¶£¬·¶Î§Îª£º0~15
	 * ÓÅÏȼ¶·Ö×éÖ»ÐèÒª·Ö×éÒ»´Î¼´¿É£¬ÒÔºóÈç¹ûÓÐÆäËûµÄÈÎÎñÐèÒªÓõ½Öжϣ¬
	 * ¶¼Í³Ò»ÓÃÕâ¸öÓÅÏȼ¶·Ö×飬ǧÍò²»ÒªÔÙ·Ö×飬Çмɡ£
	 */
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	
	/* LED ³õʼ»¯ */
	LED_GPIO_Config();

	/* ´®¿Ú³õʼ»¯	*/
	USART_Config();
  
}

/********************************END OF FILE****************************/

编译生成hex文件,烧录进STM32
结果如下
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值