三、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