在阻塞状态中 可以空闲出时间 来让低优先级的任务可以进行
有两种阻塞延时 一个是相对延时 也就是
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 */
}
暂停恢复任务文章来源:https://www.toymoban.com/news/detail-631422.html
删除重建任务文章来源地址https://www.toymoban.com/news/detail-631422.html
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 */
}
到了这里,关于STM32CubeMx学习FreeRTOS的绝对延时和相对延时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!