会调用portYIELD_WITHIN_API()的 API。从下表可以看出,这些 API 触发调度是因为当前执行的任务无法继续执行任务 (主动放弃执行,或被删除/阻塞/挂起)。 抢占调度 会调用taskYIELD_IF_USING_PREEMPTION()的 API,需要 FreeRTOS 的编译宏configUSE_PREEMPTION为 1。从下表可以看出,这些 API 触发调度是因为有其它任务的...
(1)任务中调用任务切换 切换函数:portYIELD()/portYIELD_WITHIN_API()/taskYEILD() 处理器资源:Trap_class6_TIN0 触发方式:_syscall(0) 处理函数:void prvTrapYield( int iTrapIdentification ) 使用场合:例如 ①任务调用vTaskDelay()时,其内部会执行portYIELD_WITHIN_API()进行任务切换;②调用xQueueSend()函数...
configASSERT( uxSchedulerSuspended == 0 ); portYIELD_WITHIN_API(); } else { mtCOVERAGE_TEST_MARKER(); } } }
且调度器在运行,那么表示当前任务自身被挂起,需要进行任务调度 */if(xSchedulerRunning != pdFALSE) {/* The current task has just been suspended. *//* 首先进行断言验证确保调度器没有被挂起 */configASSERT(uxSchedulerSuspended ==0);/* 调用 portYIELD_WITHIN_API 函数主动触发任务切换,使其他就绪任务...
portYIELD_WITHIN_API(); }else{ mtCOVERAGE_TEST_MARKER(); } } (1):如果传递进来的延时时间是0,只能进行强制切换任务了,调用的是portYIELD_WITHIN_API(),它其实是一个宏,真正起作用的是portYIELD(),下面是它的源码: #define portYIELD() \\{\\ ...
portYIELD_WITHIN_API(); }else{/* The scheduler is not running, but the task that was pointed to by pxCurrentTCB has just been suspended and pxCurrentTCB must be adjusted to point to a different task. 调度器没有开启,pxCurrentTCB必须指向另外一个不同的task ...
{ portYIELD_WITHIN_API(); } else { mtCOVERAGE_TEST_MARKER(); } } else { /* 解锁队列 */ prvUnlockQueue( pxQueue ); /* 恢复任务调度器 */ ( void ) xTaskResumeAll(); } } else { /* 已超时,解锁队列 */ prvUnlockQueue( pxQueue ); /* 恢复任务调度器 */ ( void ) xTaskResumeAll...
104 portYIELD_WITHIN_API(); 105 } else { 106 mtCOVERAGE_TEST_MARKER(); 107 } 108 } else { 109 /* 如果队列有消息了,就再试一次获取消息 */ 110 prvUnlockQueue( pxQueue ); (24) 111 ( void ) xTaskResumeAll(); 112 } 113 } else { ...
当延时参数为0时,会强制进行任务切换(portYIELD_WITHIN_API)(疑问:如果当前任务的优先级是最高的,虽然强制切换,但由于该任务的优先级最高,所起其实没有切换到其它任务?如果真的是强制切换到另一个任务,那上面时候这个最高优先级的任务再抢会CPU的使用权呢?)。
queue. */if( prvIsQueueEmpty( pxQueue ) != pdFALSE ){traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );prvUnlockQueue( pxQueue );if( xTaskResumeAll() == pdFALSE ){portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER(...