一、静态方式创建任务和删除任务
1>测试环境
系统:WIN7
MDK:keil v5.26
开发板:GD32F303C-EVAL
固件库:V1.0.2
FreeRTOS版本:V10.4.0
2>需要满足条件
条件一:需要在FreeRTOS.h或FreeRTOSConfig.h中定义
#define configSUPPORT_STATIC_ALLOCATION 1
条件二:加载头文件时,加载FreeRTOS.h必须在task.h之前,如下:
#include "FreeRTOS.h"
#include "task.h"
否则会出现如下错误
.\FreeRTOS\Source\include\task.h(32): error: #35: #error directive: “include FreeRTOS.h must appear in source files before include task.h”
3>代码如下:
#include "gd32f30x.h"
#include "led.h"
#include "systick.h"
#include <stdio.h>
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#define START_TASK_STACK_SIZE 200
StaticTask_t StartTaskBuffer;
StackType_t StartTaskStack[ START_TASK_STACK_SIZE ];
#define LED1_TASK_STACK_SIZE 200
StaticTask_t Led1TaskBuffer;
StackType_t Led1TaskStack[ LED1_TASK_STACK_SIZE ];
#define LED2_TASK_STACK_SIZE 200
StaticTask_t Led2TaskBuffer;
StackType_t Led2TaskStack[ LED2_TASK_STACK_SIZE ];
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
static StaticTask_t IdleTaskTCB;
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize)
{
*ppxIdleTaskTCBBuffer=&IdleTaskTCB;
*ppxIdleTaskStackBuffer=IdleTaskStack;
*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
#define START_TASK_PRIO ( tskIDLE_PRIORITY + 1 )
#define LED1_TASK_PRIO ( tskIDLE_PRIORITY + 2 )
#define LED2_TASK_PRIO ( tskIDLE_PRIORITY + 3 )
void START_task(void * pvParameters);
void LED1_task(void * pvParameters);
void LED2_task(void * pvParameters);
TaskHandle_t xHandle = NULL;
int main(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
GW_LedInit(LED1);
GW_LedInit(LED2);
GW_ComInit(GW_COM3);
xHandle = xTaskCreateStatic(
(TaskFunction_t ) START_task,
(const char* ) "start_task",
(uint32_t ) START_TASK_STACK_SIZE,
(void* ) 1,
(UBaseType_t ) START_TASK_PRIO,
(StackType_t* ) StartTaskStack,
(StaticTask_t* ) &StartTaskBuffer
);
vTaskStartScheduler();
while(1){
}
}
void START_task(void * pvParameters)
{
static uint8_t ucParameterToPass=5;
taskENTER_CRITICAL();
xTaskCreateStatic(
(TaskFunction_t ) LED1_task,
(const char* ) "LED1_task",
(uint32_t ) LED1_TASK_STACK_SIZE,
(void* ) &ucParameterToPass,
(UBaseType_t ) LED2_TASK_PRIO,
(StackType_t* ) Led1TaskStack,
(StaticTask_t* ) &Led1TaskBuffer
);
xTaskCreateStatic(
(TaskFunction_t ) LED2_task,
(const char* ) "LED2_task",
(uint32_t ) LED2_TASK_STACK_SIZE,
(void* ) NULL,
(UBaseType_t ) LED1_TASK_PRIO,
(StackType_t* ) Led2TaskStack,
(StaticTask_t* ) &Led2TaskBuffer
);
configASSERT( xHandle );
if( xHandle != NULL )
{
vTaskSuspend( xHandle );
printf("Delete START_task!\r\n");
}
taskEXIT_CRITICAL();
}
void LED1_task(void * pvParameters)
{
uint8_t *tmp=NULL;
tmp = (uint8_t *)pvParameters;
for( ;; ){
printf("LED1_task,value:%d\r\n",*tmp);
GW_LedToggle(LED1);
vTaskDelay(300);
}
}
void LED2_task(void * pvParameters)
{
for( ;; ){
printf("LED2_task\r\n");
GW_LedToggle(LED2);
vTaskDelay(500);
}
}
二、测试结果
工程下载链接:GD32F303_FreeRTOS静态创建任务
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)