1.基本知识
2.任务的状态
FreeRTOS中任务共存在4种状态:
Running 运行态
当任务处于实际运行状态称之为运行态,即CPU的使用权被这个任务占用(同一时间仅一个任务处于运行态)。
Ready 就绪态
处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。
Blocked 阻塞态
如果一个任务因延时,或等待信号量、消息队列、事件标志组等而处于的状态被称之为阻塞态。
Suspended 挂起态
类似暂停,通过调用函数 vTaskSuspend() 对指定任务进行挂起,挂起后这个任务将不被执行,只有调用函数 xTaskResume() 才可以将这个任务从挂起态恢复。
3.综合小实验
4.代码部分
void StartTaskLED2(void const * argument)
{/* USER CODE BEGIN StartTaskLED2 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);osDelay(500);}/* USER CODE END StartTaskLED2 */
}/* USER CODE BEGIN Header_StartTaskLED1 */
/**
* @brief Function implementing the taskLED1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTaskLED1 */
void StartTaskLED1(void const * argument)
{/* USER CODE BEGIN StartTaskLED1 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);osDelay(1000);}/* USER CODE END StartTaskLED1 */
}/* USER CODE BEGIN Header_StarttaskKEY1 */
/**
* @brief Function implementing the taskKEY1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StarttaskKEY1 */
void StarttaskKEY1(void const * argument)
{/* USER CODE BEGIN StarttaskKEY1 *//* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET){osDelay(20);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET){printf("KEY1摁下\r\n");if(taskLED1Handle==NULL){printf("任务1不存在,准备创建任务1\r\n");osThreadDef(taskLED1, StartTaskLED1, osPriorityNormal, 0, 128);taskLED1Handle = osThreadCreate(osThread(taskLED1), NULL);if(taskLED1Handle!=NULL){printf("任务1创建完成\r\n");}}else{printf("删除任务1\r\n");osThreadTerminate(taskLED1Handle);//删除任务taskLED1Handle=NULL;}}while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET);}osDelay(1);}/* USER CODE END StarttaskKEY1 */
}/* USER CODE BEGIN Header_StarttaskKEY2 */
/**
* @brief Function implementing the taskKEY2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StarttaskKEY2 */
void StarttaskKEY2(void const * argument)
{/* USER CODE BEGIN StarttaskKEY2 */static int flag=0;/* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET){osDelay(20);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET){printf("KEY2摁下\r\n");if(flag==0){osThreadSuspend(taskLED2Handle);//挂起任务printf("任务二已经被暂停\r\n");flag=1;}else{osThreadResume(taskLED2Handle);//恢复任务printf("任务二已经被恢复\r\n");flag=0;}}while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET);}osDelay(1);}/* USER CODE END StarttaskKEY2 */
}/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application *//* USER CODE END Application */