处理器资源:Trap_class6_TIN0 触发方式:_syscall(0) 处理函数:void prvTrapYield( int iTrapIdentification ) 使用场合:例如 ①任务调用vTaskDelay()时,其内部会执行portYIELD_WITHIN_API()进行任务切换;②调用xQueueSend()函数时,会检查是否使某一阻塞态任务解阻塞,若是,则调用portYIELD_WITHIN_API()进行任务切...
会调用portYIELD_WITHIN_API()的 API。从下表可以看出,这些 API 触发调度是因为当前执行的任务无法继续执行任务 (主动放弃执行,或被删除/阻塞/挂起)。 抢占调度 会调用taskYIELD_IF_USING_PREEMPTION()的 API,需要 FreeRTOS 的编译宏configUSE_PREEMPTION为 1。从下表可以看出,这些 API 触发调度是因为有其它任务的...
}if(pxTCB ==pxCurrentTCB){if(xSchedulerRunning !=pdFALSE){/*若刚挂起的是正在运行的任务,且任务调度器运行正常,则强制进行一次任务切换*/configASSERT( uxSchedulerSuspended==0); portYIELD_WITHIN_API(); }else{/*若任务调度器没有开启,则读取当前任务挂起列表的长度,判断所有任务是否都被挂起*/if(listC...
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 因为这个任务被挂起了 */if( list...
104 portYIELD_WITHIN_API(); 105 } else { 106 mtCOVERAGE_TEST_MARKER(); 107 } 108 } else { 109 /* 如果队列有消息了,就再试一次获取消息 */ 110 prvUnlockQueue( pxQueue ); (24) 111 ( void ) xTaskResumeAll(); 112 } 113 } else { ...
无论portYIELD_FROM_ISR( x )还是portYIELD_WITHIN_API()最终都是通过portYIELD() 函数实现任务切换。 portNVIC_INT_CTRL_REG 是内存为0xE000_ED04的指针,portNVIC_PENDSVSET_BIT是1左移28位。 通过portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;这条命令触发PendSV事件。
portYIELD_WITHIN_API(); } else //todo 调度器关闭所以必须调整pxCurrentTCB { if (listCURRENT_LIST_LENGTH(&xSuspendedTaskList) == uxCurrentNumberOfTasks) { //所有任务都被挂起 pxCurrentTCB为null,下次创建新任务时,就执行新任务 pxCurrentTCB = NULL; ...
= pdFALSE){if (pxTCB == pxCurrentTCB){configASSERT(uxSchedulerSuspended == 0);portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();}}endif / INCLUDE_vTaskDelete */ 此外,该函数的功能受宏INCLUDE_vTaskDelete的控制,该宏在FreeRTOSConfig.h文件中定义。函数的传入参数是一个任务句柄「pxTaskTo...
portYIELD_WITHIN_API(); }else{ mtCOVERAGE_TEST_MARKER(); } } (1):如果传递进来的延时时间是0,只能进行强制切换任务了,调用的是portYIELD_WITHIN_API(),它其实是一个宏,真正起作用的是portYIELD(),下面是它的源码: #define portYIELD() \\{\\ ...
当延时参数为0时,会强制进行任务切换(portYIELD_WITHIN_API)(疑问:如果当前任务的优先级是最高的,虽然强制切换,但由于该任务的优先级最高,所起其实没有切换到其它任务?如果真的是强制切换到另一个任务,那上面时候这个最高优先级的任务再抢会CPU的使用权呢?)。