FreeRTOS中任务共存在4种状态:
Running 运行态
当任务处于实际运行状态称之为运行态,即CPU的使用权被这个任务占用(同一时间仅一个任务处于运行态)。
Ready 就绪态
处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。
Blocked 阻塞态
如果一个任务因延时,或等待信号量、消息队列、事件标志组等而处于的状态被称之为阻塞态。
Suspended 挂起态
类似暂停,通过调用函数 vTaskSuspend() 对指定任务进行挂起,挂起后这个任务将不被执行,只有调用函数 xTaskResume() 才可以将这个任务从挂起态恢复。
- 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 */