三、FreeRTOS静态任务创建和删除(stm32f103标准库)

三、FreeRTOS静态任务创建和删除(stm32f103标准库)

3.1、任务的创建和删除(静态方式):

3.2、静态创建任务流程

①使用静态创建任务,在FreeConfig.h中我们需要将宏configSUPPORT_STATIC_ALLOCATION

配置为 1。

②定义空闲任务&定时器任务的任务堆栈及TCB。

③实现两个接口函数:vApplicationGetIdleTaskMemory( )和vApplicationGetTimerTaskMemory ( )

④编写任务函数(task1、task2、task3.。)

3.3、静态创建任务目的:

实验目的:学会 xTaskCreateStatic( ) 和 vTaskDelete( ) 的使用

3.4、代码的操作部分:

task_demo.c

//###########创建task_demo.c和task_demo.h###########
//**task_demo.c**//

#include "stm32f10x.h"                  // Device header
#include "freertos.h"
#include "task.h"
#include "Key.h"
#include "LED.h"
#include "stdio.h"

/*步骤一是配置#define configSUPPORT_STATIC_ALLOCATION 1//静态任务申请内存的配置为1*/
/*步骤二空闲任务内存分配*/
/*步骤三软件定时器配置*/
/*步骤四定义函数的入口函数和参数*/


uint8_t KNum=0;
/*创建任务的句柄
 */
TaskHandle_t myTaskHandler0 ;
TaskHandle_t myTaskHandler1 ;
TaskHandle_t myTaskHandler2 ;
TaskHandle_t myTaskHandler3 ;

/*创建任务配置
 *包括:任务优先级 任务堆栈大小 任务堆栈(由用户分配) 任务控制块tcb(由用户分配)
 */
#define START_TASK_PRIO			1
#define START_TASK_STACK_SIZE	128
StackType_t start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_tcb;
//task1
#define TASK1_PRIO				2
#define TASK1_STACK_SIZE		128
StackType_t task1_stack[TASK1_STACK_SIZE];
StaticTask_t task1_tcb;
//task2
#define TASK2_PRIO				3
#define TASK2_STACK_SIZE		128
StackType_t task2_stack[TASK2_STACK_SIZE];
StaticTask_t task2_tcb;
//task3
#define TASK3_PRIO				4
#define TASK3_STACK_SIZE		128
StackType_t task3_stack[TASK3_STACK_SIZE];
StaticTask_t task3_tcb;

/*空闲任务内存分配*/
StaticTask_t idle_task_tcb;//任务控制块
StackType_t idle_task_stack[configMINIMAL_STACK_SIZE];//空闲任务的堆栈空间
/*软件定时器配置*/
StaticTask_t timer_task_tcb;//任务控制块
StackType_t timer_task_stack[configTIMER_TASK_PRIORTIY];//堆栈大小

//空闲任务内存分配
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
                                    StackType_t ** ppxIdleTaskStackBuffer,
                                    uint32_t * pulIdleTaskStackSize )
{
	
	*ppxIdleTaskTCBBuffer = &idle_task_tcb;
	*ppxIdleTaskStackBuffer = idle_task_stack;
	*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
	
}		


//软件定时器配置
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
                                      StackType_t ** ppxTimerTaskStackBuffer,
                                      uint32_t * pulTimerTaskStackSize )
{
	*ppxTimerTaskTCBBuffer = &timer_task_tcb;
	*ppxTimerTaskStackBuffer = timer_task_stack;
	* pulTimerTaskStackSize = configTIMER_TASK_PRIORTIY;
}


void task_begin(void *arg);
void myTask1(void *arg );
void myTask2(void *arg );
void myTask3(void *arg );


void freertos_demo(void)
{
	myTaskHandler0 = xTaskCreateStatic((TaskFunction_t	) task_begin,
													(char * 	   	) "task_begin",
													(uint32_t		) START_TASK_STACK_SIZE,
													(void * 		) NULL,
													(UBaseType_t	) START_TASK_PRIO,
													(StackType_t * 	) start_task_stack,
													(StaticTask_t *	) &start_task_tcb );
	
	vTaskStartScheduler();
}


void task_begin(void *arg)
{
	taskENTER_CRITICAL();//进入临界区
	
	myTaskHandler1 = xTaskCreateStatic( (TaskFunction_t	) myTask1,
													(char * 	   	) "myTask1",
													(uint32_t		) TASK1_STACK_SIZE,
													(void * 		) NULL,
													(UBaseType_t	) TASK1_PRIO,
													(StackType_t * 	) task1_stack,
													(StaticTask_t *	) &task1_tcb );
									
	myTaskHandler2 = xTaskCreateStatic( 	(TaskFunction_t	) myTask2,
													(char * 	   	) "myTask2",
													(uint32_t		) TASK2_STACK_SIZE,
													(void * 		) NULL,
													(UBaseType_t	) TASK2_PRIO,
													(StackType_t * 	) task2_stack,
													(StaticTask_t *	) &task2_tcb );
									
	myTaskHandler3 = xTaskCreateStatic( 	(TaskFunction_t	) myTask3,
													(char * 	   	) "myTask3",
													(uint32_t		) TASK3_STACK_SIZE,
													(void * 		) NULL,
													(UBaseType_t	) TASK3_PRIO,
													(StackType_t * 	) task3_stack,
													(StaticTask_t *	) &task3_tcb );
	

	vTaskDelete(myTaskHandler0);
	taskEXIT_CRITICAL();//退出临界区
}


void myTask1(void *arg )
{
	while(1)
	{
		printf("task1正在运行\n");
		LED1_Turn();
		vTaskDelay(500);
	}
}

void myTask2(void *arg )
{
	while(1)
	{
		printf("task2正在运行\n");
		LED2_Turn();
		vTaskDelay(500);
	}
}

void myTask3(void *arg )
{
	while(1)
	{
		printf("task3正在运行\n");
		KNum = Key_GetNum();
		if(KNum==1)
		{
			if(myTaskHandler1!=NULL)
			{
				printf("删除task1任务\n");
				vTaskDelete(myTaskHandler1);
				myTaskHandler1=NULL;
			}
		}
		vTaskDelay(10);
	}
}
//###########创建task_demo.c和task_demo.h###########
//**task_demo.h**//

#ifndef __TASK_DEMO_H
#define __TASK_DEMO_H

void freertos_demo(void);


void task_begin(void *arg);

void myTask1(void *arg );

void myTask2(void *arg );

void myTask3(void *arg );

#endif

//主函数main.c

#include "stm32f10x.h"                  // Device header
#include "freertos.h"
#include "task.h"
#include "LED.h"
#include "Key.h"
#include "Serial.h"
#include "OLED.h"
#include "task_demo.h"


int main(void)
{
	LED_Init();
	Key_Init();
	Serial_Init();

	freertos_demo();
}



剩下的LED_Init()和Key_Init()和Serial_Init()初始化可以根据江科大的来,以下是连线图

按键为PB1和PB11。LED短脚接PA1和PA2。TTL转USB的TXD接PA10,RXD接PA9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值