【STM32F1】FreeRTOS创建/删除任务实验

本实验使用FreeRTOS相关知识来创建执行任务,创建了start_task、led0_task、led1_task三个任务,实现了LED0与LED1以不同频率进行闪烁。

目的是记录本人学习FreeRTOS的过程,也希望能够帮助广大网友了解FreeRTOS相关知识。

1. 主要函数介绍

xTaskCreate任务创建函数

	 xTaskCreate( 
				(TaskFunction_t ) start_task,
                (const char*    ) "start_task", 
                (uint16_t       ) START_TASK_SIZE,
                (void *         ) NULL,
                (UBaseType_t    ) START_TASK_PRIO,
                (TaskHandle_t*  ) &STARTTask_Handler);

       该函数主要用于创建任务,它是以一种动态的方式对任务进行创建。与静态创建任务函数不同的是,动态任务创建函数创建的任务使用的空间、堆栈大小这些都是由RTOS进行管理的,而静态任务创建函数则是需要用户去定义空间、堆栈大小这些。简单来说,动态任务创建函数更容易使用一些。

上述代码是我们以动态方式创建的开始任务,该函数的定义在task.h文件按ctrl+f搜索xTaskCreate即可找到,进入RTOS官网也可以找到相关使用方法。如下:

第一个参数就是我们要创建的任务函数,在下面的程序中我们有声明任务函数。第二个参数是一个描述性名称,我们和任务函数名保持一致。第三个参数任务要使用的堆栈大小。第四个参数是要传递给任务函数的参数,为空即可。第五个参数是任务执行的优先级,数字越大越优先。第六个参数是任务句柄,主要在停止任务,或者调用的时候方便指定。

vTaskDelete 

//删除开始任务,为NULL默认删除该任务,或者写要删除的任务对应的任务句柄。被删除的任务将被从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除,要注意的是,空闲任务会负责释放被删除任务中由系统分配的内存,但是由用户在任务删除前申请的内存,则需要由用户在任务被删除前提前释放,否则将导致内存泄露。若使用此函数,需要在FreeRTOSConfig.h文件中将宏INCLUDE_vTaskDelete配置为 1

2. 完整实验代码

#include "FreeRTOS.h"
#include "task.h"

#include "led.h"
#include "sys.h"

/****************star_task相关声明************************/
//任务堆栈大小
#define START_TASK_SIZE 128 
//任务优先级
#define START_TASK_PRIO 3
//任务句柄
TaskHandle_t * STARTTask_Handler;
//任务函数声明
void start_task(void *pvParameters);
/****************led0相关声明************************/
//任务堆栈大小
#define LED0_TASK_SIZE 128 
//任务优先级
#define LED0_TASK_PRIO 2
//任务句柄
TaskHandle_t * LED0Task_Handler;
//任务函数声明
void led0_task(void *pvParameters);
/****************led1相关声明************************/
//任务堆栈大小
#define LED1_TASK_SIZE 128 
//任务优先级
#define LED1_TASK_PRIO 1
//任务句柄
TaskHandle_t * LED1Task_Handler;
//任务函数声明
void led1_task(void *pvParameters);


void freertos_demo(void){
	
	//创建开始任务
	 xTaskCreate( 
								(TaskFunction_t ) start_task,
                (const char*    ) "start_task", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                (uint16_t       ) START_TASK_SIZE,
                (void *         ) NULL,
                (UBaseType_t    ) START_TASK_PRIO,
                (TaskHandle_t*  ) &STARTTask_Handler);
//开启任务调度
vTaskStartScheduler();
}

/*开始任务任务函数
* 该任务用于创建其他任务,本实验创建LED0任务和LED1任务。
* 功能:LED0与LED1以不同频率进行闪烁
*/

void start_task(void *pvParameters){
	   //进入临界区,目的是为了打断中断
	   taskENTER_CRITICAL();
	   //创建LED0任务
	 	 xTaskCreate( 
								(TaskFunction_t ) led0_task,
                (const char*    ) "led0_task", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                (uint16_t       ) LED0_TASK_SIZE,
                (void *         ) NULL,
                (UBaseType_t    ) LED0_TASK_PRIO,
                (TaskHandle_t*  ) &LED0Task_Handler);
		 //创建LED1任务
	 	 xTaskCreate( 
								(TaskFunction_t ) led1_task,
                (const char*    ) "led1_task", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                (uint16_t       ) LED1_TASK_SIZE,
                (void *         ) NULL,
                (UBaseType_t    ) LED1_TASK_PRIO,
                (TaskHandle_t*  ) &LED1Task_Handler);
	   vTaskDelete(NULL);   //删除开始任务,为NULL默认删除该任务,或者写该任务句柄
		 taskEXIT_CRITICAL(); //退出临界区
}

//LED0任务函数 
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0_TOGGLE();
        vTaskDelay(500);
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1(0);
        vTaskDelay(200);
        LED1(1);
        vTaskDelay(800);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐大队队长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值