鲜花网站建设策划方案书,电脑软件推广,四川城乡和住房建设厅官方网站,做视觉影像网站用什么软件系统两个Delay函数有两个延时函数vTaskDelay#xff1a;至少等待指定个数的Tick Interrupt才能变为就绪态xTaskDelayUtil#xff1a;等待到指定的绝对时刻#xff0c;才能变为就绪态个人感觉这两个延时函数就是#xff0c;比如一个我等3个小时#xff0c;一个是我等到下午3点的…两个Delay函数有两个延时函数vTaskDelay至少等待指定个数的Tick Interrupt才能变为就绪态xTaskDelayUtil等待到指定的绝对时刻才能变为就绪态个人感觉这两个延时函数就是比如一个我等3个小时一个是我等到下午3点的区别。两个函数的原型如下vTaskDelay:void vTaskDelay( const TickType_t xTicksToDelay ){BaseType_t xAlreadyYielded pdFALSE;/* A delay time of zero just forces a reschedule. */if( xTicksToDelay ( TickType_t ) 0U ){configASSERT( uxSchedulerSuspended 0 );vTaskSuspendAll();{traceTASK_DELAY();/* A task that is removed from the event list while the* scheduler is suspended will not get placed in the ready* list or removed from the blocked list until the scheduler* is resumed.** This task cannot be in an event list as it is the currently* executing task. */prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );}xAlreadyYielded xTaskResumeAll();}else{mtCOVERAGE_TEST_MARKER();}/* Force a reschedule if xTaskResumeAll has not already done so, we may* have put ourselves to sleep. */if( xAlreadyYielded pdFALSE ){portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();}}
xTaskDelayUtil BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement ){TickType_t xTimeToWake;BaseType_t xAlreadyYielded, xShouldDelay pdFALSE;configASSERT( pxPreviousWakeTime );configASSERT( ( xTimeIncrement 0U ) );configASSERT( uxSchedulerSuspended 0 );vTaskSuspendAll();{/* Minor optimisation. The tick count cannot change in this* block. */const TickType_t xConstTickCount xTickCount;/* Generate the tick time at which the task wants to wake. */xTimeToWake *pxPreviousWakeTime xTimeIncrement;if( xConstTickCount *pxPreviousWakeTime ){/* The tick count has overflowed since this function was* lasted called. In this case the only time we should ever* actually delay is if the wake time has also overflowed,* and the wake time is greater than the tick time. When this* is the case it is as if neither time had overflowed. */if( ( xTimeToWake *pxPreviousWakeTime ) ( xTimeToWake xConstTickCount ) ){xShouldDelay pdTRUE;}else{mtCOVERAGE_TEST_MARKER();}}else{/* The tick time has not overflowed. In this case we will* delay if either the wake time has overflowed, and/or the* tick time is less than the wake time. */if( ( xTimeToWake *pxPreviousWakeTime ) || ( xTimeToWake xConstTickCount ) ){xShouldDelay pdTRUE;}else{mtCOVERAGE_TEST_MARKER();}}/* Update the wake time ready for the next call. */*pxPreviousWakeTime xTimeToWake;if( xShouldDelay ! pdFALSE ){traceTASK_DELAY_UNTIL( xTimeToWake );/* prvAddCurrentTaskToDelayedList() needs the block time, not* the time to wake, so subtract the current tick count. */prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE );}else{mtCOVERAGE_TEST_MARKER();}}xAlreadyYielded xTaskResumeAll();/* Force a reschedule if xTaskResumeAll has not already done so, we may* have put ourselves to sleep. */if( xAlreadyYielded pdFALSE ){portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();}return xShouldDelay;}
下面是图示使用vTaskDelay(n)时进入退出vTaskDelay的时间间隔至少是n个Tick中断使用xTaskDelayUtil(Pre,n)时前后两次退出xTaskDelayUntil的时间至少是n个Tick中断退出xTaskDelayUntil时任务就进入就绪态一般都能得到执行机会所以可以使用xTaskDelayUntil来让任务周期性的运行实验证明程序创建2个任务Task1高优先级设置变量flag为1然后调用vTaskDelay(xDelay50ms)或vTaskDelayUntil(xLastWakeTime,xDelay50ms)Task2:低优先级设置变量flag0main函数代码如下int main(void)
{prvSetupHardware();/*Task1的优先级更高Task1先执行*/xTaskCreate(vTask1,Task1,1000,NULL,2,NULL);xTaskCreate(vTask2,Task2,1000,NULL,1,NULL);/*启动调度器*/vTaskStartScheduler();/*如果程序运行到这里就表示出错了一般是内存不足*/return 0;}Task1的代码中使用条件开关来选择Delay函数把#if 1 改为 #if 0 就可以使用vTaskDelayUntil代码如下void vTask1(void *pvParameters)
{const TickType_t xDelay50ms pdMS_TO_TICKS(50UL);TickType_t xLastWakeTime;int i;/*获得当前的Tick Count*/xLastWakeTime xTaskGetTickCount();for(;;){flag 1;/*故意加入多个循环让程序运行时间长一点*/for(i0;i5;i)printf(Task1 is running\r\n);
#if 1vTaskDelay(xDelay50ms);
#else vTaskDelayUntil(PreWakeTime,xDelay50ms);}
}使用MDK的逻辑分析仪可以观察flag变量的bit波形如下flag为1时表示Task1正在运行flag为0时表示Task2正在运行也就是Task1处于阻塞状态vTaskDelay指定的是阻塞时间vTaskDelayUntil指定的是任务执行的间隔周期