新建网站后域名跳转到别的网站了网络营销顾问是做什么的
- 实验目的:学会xTaskCreate()和vTaskDelete()的使用
- 实验设计:将设计四个任务:start_task、task1、task2、task3
四个任务功能如下:
start_task 用来创建其他的三个任务
task1 实现LED0每500ms闪烁一次
task2 实现LED1每500ms闪烁一次
task3 判断按键KEY0是否按下,按下则删掉task1
基于移植好的框架
FreeRTOS框架(STM32标准库)
https://gitee.com/fei-c-language/free-rtos/tree/master/FreeRTOS%E7%A7%BB%E6%A4%8D%E6%A1%86%E6%9E%B6(STM32%E6%A0%87%E5%87%86%E5%BA%93)
第一步
将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1
第二步
定义函数入口参数
根据官网例程https://freertos.org/
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE uxStackDepth,void *pvParameters,UBaseType_t uxPriority,TaskHandle_t *pxCreatedTask);
Example usage:
/* Task to be created. */ void vTaskCode( void * pvParameters ) {/* The parameter value is expected to be 1 as 1 is passed in thepvParameters value in the call to xTaskCreate() below. */configASSERT( ( ( uint32_t ) pvParameters ) == 1 );for( ;; ){/* Task code goes here. */} }/* Function that creates a task. */ void vOtherFunction( void ) {BaseType_t xReturned;TaskHandle_t xHandle = NULL;/* Create the task, storing the handle. */xReturned = xTaskCreate(vTaskCode, /* Function that implements the task. */"NAME", /* Text name for the task. */STACK_SIZE, /* Stack size in words, not bytes. */( void * ) 1, /* Parameter passed into the task. */tskIDLE_PRIORITY,/* Priority at which the task is created. */&xHandle ); /* Used to pass out the created task's handle. */if( xReturned == pdPASS ){/* The task was created. Use the task's handle to delete the task. */vTaskDelete( xHandle );} }
创建动态任务函数
/** *@brief FreeRTOS例程入口函数 *@param 无 *@retval 无 */ void freertos_demo(void) {xTaskCreate((TaskFunction_t ) start_task, //开始任务函数(char* ) "start_task", //开始任务函数名称(configSTACK_DEPTH_TYPE ) START_TASK_STACK_SIZE, //堆栈大小-字(void* ) NULL, //传递的任务函数参数(UBaseType_t ) START_TASK_PRIO, //任务优先级(TaskHandle_t* ) &start_task_handler //任务句柄);vTaskStartScheduler();//开启任务调度器 }
创建开始任务
/* 开始任务函数-用来创建其他的三个任务*/ void start_task( void * pvParameters) {taskENTER_CRITICAL();/*进入临界区--关闭中断,任务切换就不会进行*//*创建任务1*/xTaskCreate((TaskFunction_t ) task1, //开始任务函数(char* ) "task1", //开始任务函数名称(configSTACK_DEPTH_TYPE ) TASK1_STACK_SIZE, //堆栈大小-字(void* ) NULL, //传递的任务函数参数(UBaseType_t ) TASK1_PRIO, //任务优先级(TaskHandle_t* ) &task1_handler //任务句柄);/*创建任务2*/xTaskCreate((TaskFunction_t ) task2, //开始任务函数(char* ) "task2", //开始任务函数名称(configSTACK_DEPTH_TYPE ) TASK2_STACK_SIZE, //堆栈大小-字(void* ) NULL, //传递的任务函数参数(UBaseType_t ) TASK2_PRIO, //任务优先级(TaskHandle_t* ) &task2_handler //任务句柄);/*创建任务3*/xTaskCreate((TaskFunction_t ) task3, //开始任务函数(char* ) "task3", //开始任务函数名称(configSTACK_DEPTH_TYPE ) TASK3_STACK_SIZE, //堆栈大小-字(void* ) NULL, //传递的任务函数参数(UBaseType_t ) TASK3_PRIO, //任务优先级(TaskHandle_t* ) &task3_handler //任务句柄);vTaskDelete(NULL);//使用完删除任务taskEXIT_CRITICAL();/*退出临界区--开始任务切换-开启任务调度-限制性任务优先级最高的任务*/}
- 每个任务函数的参数宏定义,函数声明
/*START_TASK 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define START_TASK_PRIO 1 #define START_TASK_STACK_SIZE 128 TaskHandle_t start_task_handler; void start_task( void * pvParameters);
/*task1 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define TASK1_PRIO 2 #define TASK1_STACK_SIZE 128 TaskHandle_t task1_handler; void task1( void * pvParameters);
/*task2 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define TASK2_PRIO 3 #define TASK2_STACK_SIZE 128 TaskHandle_t task2_handler; void task2( void * pvParameters);
/*task3 任务 配置 *包括:任务句柄 任务优先级 堆栈大小 创建任务 */ #define TASK3_PRIO 4 #define TASK3_STACK_SIZE 128 TaskHandle_t task3_handler; void task3( void * pvParameters); /********************************************************************/
定义在创建函数的上部
移植成品
FreeRTOS动态创建