STM32CubeMx学习FreeRTOS的绝对延时和相对延时

在阻塞状态中 可以空闲出时间 来让低优先级的任务可以进行

有两种阻塞延时 一个是相对延时 也就是 

osDelay(500);

这样的osDelay可以让在到这里的时候,延时500ms

也就是程序到这里才500ms 不记程序前面所用的时间

而还有一个绝对延时

vTaskDelayUntil(&xlastwakeTime,500);

绝对延时指的是 加上程序自己跑的时间 全部的一起500ms

前面的参数是可以理解成程序开始的标志的地址

完整代码如:

void LED_Task2(void const * argument)
{
  /* USER CODE BEGIN LED_Task2 */
	TickType_t xlastwakeTime;
	xlastwakeTime =xTaskGetTickCount();
  /* Infinite loop */
  for(;;)
  {
		printfl("task2\r\n");
		HAL_Delay(200);
		vTaskDelayUntil(&xlastwakeTime,500);
		
  }
  /* USER CODE END LED_Task2 */
}

这样每次task2都500ms进入一次

500ms来一次

void LED_Task1(void const * argument)
{
  /* USER CODE BEGIN LED_Task1 */
  /* Infinite loop */
  for(;;)
  {
		printfl("task1\r\n");
		HAL_Delay(200);
		osDelay(500);
    
  }
  /* USER CODE END LED_Task1 */
}

task1就700ms来一次,是这样的



 设置按键任务  用来删除 创建 暂停 恢复任务

 

void key0_task(void const * argument)
{
  /* USER CODE BEGIN key0_task */
	static uint8_t Flag=1;
  /* Infinite loop */
  for(;;)
  {
		
     if(HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)==0)
		{
			osDelay(20);
			if(HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)==0)
			{
				if(Flag==1)
				{
					printfl("paused!\r\n");
					vTaskSuspend(LED2Handle);
					Flag=0;
					while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));
				}
				else
				{
					printfl("hui fu 2!\r\n");
					vTaskResume(LED2Handle);
					Flag=1;
					while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));
				}
			}
			
		}
	
		
		
		
  }
  /* USER CODE END key0_task */
}

暂停恢复任务

删除重建任务

void key1_task(void const * argument)
{
  /* USER CODE BEGIN key1_task */
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0)
		{
			osDelay(20);
			if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0)
			{
				if(LED1Handle==NULL)
				{
					printfl("1 no ,creat 1\r\n");
					osThreadDef(LED1, LED_Task1, osPriorityNormal, 0, 128);
					LED1Handle = osThreadCreate(osThread(LED1), NULL);
					printfl("already creat1\r\n");
					while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));
				}
				else
				{
					printfl("delete 1");
					vTaskDelete(LED1Handle);
					LED1Handle=NULL;
					while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));
					
				}
			
			}
			
		}
		
		
		
  }
  /* USER CODE END key1_task */
}

你可能感兴趣的:(stm32,学习,嵌入式硬件)