做网站v1认证是什么意思,怎么建设网站最便宜,河南公司网站制作咨询,网页个人主页设计STM32 CubeMX Freertos STM32 CubeMX #xff08;Freertos任务#xff1a;创建、删除、挂起、恢复#xff09; STM32 CubeMX Freertos前言一、STM32 CubeMX 配置时钟树配置使能串口#xff0c;用于用于检查实验现象使用STM32 CubeMX 库#xff0c;配置Freertos创建任务 二…STM32 CubeMX Freertos STM32 CubeMX Freertos任务创建、删除、挂起、恢复 STM32 CubeMX Freertos前言一、STM32 CubeMX 配置时钟树配置使能串口用于用于检查实验现象使用STM32 CubeMX 库配置Freertos创建任务 二、实验一创建两个函数将LED闪烁实验现象使用 vTaskDelayUntil绝对延时 三实验二删除LED1任务和自身任务实验现象四实验三挂起和恢复实验现象总结 前言
学习使用Freertos第一步 FreeRTOS 任务管理您需要掌握以下几个关键函数
xTaskCreate()用于创建一个任务需要指定任务函数、任务名称、任务栈大小和优先级等参数。vTaskDelete()用于删除一个任务可以由任务自身或其他任务调用。vTaskDelay()用于使当前任务进入阻塞状态延迟一段时间后再继续执行。vTaskDelayUntil()类似于vTaskDelay()但是可以实现周期性的延迟使任务按照指定的时间间隔执行。vTaskSuspend()和vTaskResume()用于暂停和恢复一个任务的执行暂停后的任务将不会被调度执行。xTaskResumeFromISR()在中断服务程序中恢复一个被挂起暂停的任务。uxTaskPriorityGet()和vTaskPrioritySet()用于获取和设置任务的优先级。uxTaskGetStackHighWaterMark()用于获取任务栈的剩余可用空间大小可以用来检查任务是否使用了过多的栈空间。 一、STM32 CubeMX 配置
时钟树配置 使能串口用于用于检查实验现象 使用STM32 CubeMX 库配置Freertos
选择CMISS_V1接口就可以满足Freertos接口且代码量比CMISS_V2小
创建任务 二、实验一创建两个函数将LED闪烁 代码如下示例 void LED1Task(void const * argument)
{/* USER CODE BEGIN LED1Task *//* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);printf(LED灭\r\n); // printf输出字符串osDelay(1000);}/* USER CODE END LED1Task */
}/* USER CODE BEGIN Header_LED2Task */
/**
* brief Function implementing the LED2 thread.
* param argument: Not used
* retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{/* USER CODE BEGIN LED2Task *//* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);printf(LED亮\r\n); // printf输出字符串osDelay(2000);}/* USER CODE END LED2Task */
}
实验现象 使用 vTaskDelayUntil绝对延时
使能 vTaskDelayUntil函数
void LED1Task(void const * argument)
{/* USER CODE BEGIN LED1Task */TickType_t xlaswketime;xlaswketime xTaskGetTickCount();//获取进入的时间/* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);printf(LED灭\r\n); // printf输出字符串vTaskDelayUntil(xlaswketime,1000);}/* USER CODE END LED1Task */
}/* USER CODE BEGIN Header_LED2Task */
/**
* brief Function implementing the LED2 thread.
* param argument: Not used
* retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{/* USER CODE BEGIN LED2Task */TickType_t xlaswketime;xlaswketime xTaskGetTickCount();//获取进入的时间/* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);printf(LED亮\r\n); // printf输出字符串vTaskDelayUntil(xlaswketime,2000);}/* USER CODE END LED2Task */
}三实验二删除LED1任务和自身任务
/* USER CODE END Header_LED1Task */
void LED1Task(void const * argument)
{/* USER CODE BEGIN LED1Task */TickType_t xlaswketime;xlaswketime xTaskGetTickCount();//获取进入的时间/* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);vTaskDelayUntil(xlaswketime,500);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);vTaskDelayUntil(xlaswketime,500);}/* USER CODE END LED1Task */
}/* USER CODE BEGIN Header_LED2Task */
/**
* brief Function implementing the LED2 thread.
* param argument: Not used
* retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{/* USER CODE BEGIN LED2Task */TickType_t xlaswketime;xlaswketime xTaskGetTickCount();//获取进入的时间printf(5s后删除LED1任务再5S删除自身任务\r\n); // printf输出字符串/* Infinite loop */for(;;){vTaskDelayUntil(xlaswketime,5000);//5秒vTaskDelete(LED1Handle);printf(删除LED闪烁任务\r\n); // printf输出字符串vTaskDelayUntil(xlaswketime,5000);//5秒printf(删除自身任务\r\n); // printf输出字符串vTaskDelete(NULL);printf(正常情况不会打印这段话\r\n); // printf输出字符串}/* USER CODE END LED2Task */
}实验现象 四实验三挂起和恢复
void LED1Task(void const * argument)
{/* USER CODE BEGIN LED1Task */TickType_t xlaswketime;xlaswketime xTaskGetTickCount();//获取进入的时间/* Infinite loop */for(;;){HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);vTaskDelayUntil(xlaswketime,500);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);vTaskDelayUntil(xlaswketime,500);}/* USER CODE END LED1Task */
}/* USER CODE BEGIN Header_LED2Task */
/**
* brief Function implementing the LED2 thread.
* param argument: Not used
* retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{/* USER CODE BEGIN LED2Task */TickType_t xlaswketime;xlaswketime xTaskGetTickCount();//获取进入的时间printf(5s后暂停再5S恢复\r\n); // printf输出字符串/* Infinite loop */for(;;){vTaskDelayUntil(xlaswketime,5000);//5秒vTaskSuspend(LED1Handle);printf(暂停LED闪烁任务\r\n); // printf输出字符串vTaskDelayUntil(xlaswketime,5000);//5秒vTaskResume(LED1Handle);printf(恢复LED闪烁任务\r\n); // printf输出字符串}/* USER CODE END LED2Task */
}实验现象 总结
学会 任务管理 需要掌握并熟练任务的创建、删除、挂起、恢复和切换等操作以及任务的优先级和调度机制。