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
结果如下