EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet ){
ListItem_t *pxListItem,*pxNext;
ListItem_t const*pxListEnd;
List_t *pxList;
EventBits_t uxBitsToClear =0, uxBitsWaitedFor, uxControlBits;
EventGroup_t *pxEventBits =( EventGroup_t *) xEventGroup;
BaseType_t xMatchFound = pdFALSE;/* Check the user is not attempting to set the bits used by the kernel
itself. */configASSERT( xEventGroup );configASSERT(( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES )==0);/* 获取事件列表头 */
pxList =&( pxEventBits->xTasksWaitingForBits );/* 获取列表尾节点 */
pxListEnd =listGET_END_MARKER( pxList );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. *//* 挂起调度器 */vTaskSuspendAll();{traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );/* 获取头结点 */
pxListItem =listGET_HEAD_ENTRY( pxList );/* Set the bits. *//* 设置事件标志位 */
pxEventBits->uxEventBits |= uxBitsToSet;/* See if the new bit value should unblock any tasks. *//* 循环遍历整个列表项,直到列表头节点等于尾节点(指针) */while( pxListItem != pxListEnd ){
pxNext =listGET_NEXT( pxListItem );//获取下个列表项/* 获取当前列表项的值 */
uxBitsWaitedFor =listGET_LIST_ITEM_VALUE( pxListItem );
xMatchFound = pdFALSE;//标记是否找到需要处理的节点/* Split the bits waited for from the control bits. *//* 拆分 */
uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES;
uxBitsWaitedFor &=~eventEVENT_BITS_CONTROL_BYTES;if(( uxControlBits & eventWAIT_FOR_ALL_BITS )==( EventBits_t )0){/* Just looking for single bit being set. *//* 或逻辑,等待位已经置位 */if(( uxBitsWaitedFor & pxEventBits->uxEventBits )!=( EventBits_t )0){
xMatchFound = pdTRUE;}else{mtCOVERAGE_TEST_MARKER();}}/* 表示所有等待的位都已经触发 */elseif(( uxBitsWaitedFor & pxEventBits->uxEventBits )== uxBitsWaitedFor ){/* All bits are set. */
xMatchFound = pdTRUE;}else{/* Need all bits to be set, but not all the bits were set. */}if( xMatchFound != pdFALSE ){/* The bits match. Should the bits be cleared on exit? *//* 判断是否需要清除 */if(( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT )!=( EventBits_t )0){
uxBitsToClear |= uxBitsWaitedFor;}else{mtCOVERAGE_TEST_MARKER();}/* Store the actual event flag value in the task's event list
item before removing the task from the event list. The
eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows
that is was unblocked due to its required bits matching, rather
than because it timed out. *//* 把任务从事件列表中移除 */(void)xTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET );}/* Move onto the next list item. Note pxListItem->pxNext is not
used here as the list item may have been removed from the event list
and inserted into the ready/pending reading list. */
pxListItem = pxNext;//当前列表项指向下个,继续遍历}/* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT
bit was set in the control word. */
pxEventBits->uxEventBits &=~uxBitsToClear;//清除设置后的标志位}(void)xTaskResumeAll();//开启调度器return pxEventBits->uxEventBits;}
3 等待标志位 xEventGroupWaitBits
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ){
EventGroup_t *pxEventBits =( EventGroup_t *) xEventGroup;
EventBits_t uxReturn, uxControlBits =0;
BaseType_t xWaitConditionMet, xAlreadyYielded;
BaseType_t xTimeoutOccurred = pdFALSE;/* Check the user is not attempting to wait on the bits used by the kernel
itself, and that at least one bit is being requested. */configASSERT( xEventGroup );configASSERT(( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES )==0);configASSERT( uxBitsToWaitFor !=0);#if(( INCLUDE_xTaskGetSchedulerState ==1)||( configUSE_TIMERS ==1)){configASSERT(!((xTaskGetSchedulerState()== taskSCHEDULER_SUSPENDED )&&( xTicksToWait !=0)));}#endifvTaskSuspendAll();//挂起调度器{/* 获取当前的事件标志位 */const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits;/* Check to see if the wait condition is already met or not. *//* 检查是否触发 */
xWaitConditionMet =prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits );if( xWaitConditionMet != pdFALSE ){/* The wait condition has already been met so there is no need to
block. *//* 已经触发 */
uxReturn = uxCurrentEventBits;
xTicksToWait =( TickType_t )0;/* Clear the wait bits if requested to do so. *//* 清楚已经触发的标志 */if( xClearOnExit != pdFALSE ){
pxEventBits->uxEventBits &=~uxBitsToWaitFor;}else{mtCOVERAGE_TEST_MARKER();}}elseif( xTicksToWait ==( TickType_t )0){/* 不需要超时,直接返回标志位. */
uxReturn = uxCurrentEventBits;}else{/* 事件没有触发,并且需要超时*/if( xClearOnExit != pdFALSE ){
uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT;}else{mtCOVERAGE_TEST_MARKER();}if( xWaitForAllBits != pdFALSE ){
uxControlBits |= eventWAIT_FOR_ALL_BITS;}else{mtCOVERAGE_TEST_MARKER();}/* 把任务添加到事件列表中 */vTaskPlaceOnUnorderedEventList(&( pxEventBits->xTasksWaitingForBits ),( uxBitsToWaitFor | uxControlBits ), xTicksToWait );
uxReturn =0;traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor );}}
xAlreadyYielded =xTaskResumeAll();//恢复调度器 if( xTicksToWait !=( TickType_t )0){if( xAlreadyYielded == pdFALSE ){portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();}/* 任务已经恢复,则复位列表项中的值 复位为任务有优先级 */
uxReturn =uxTaskResetEventItemValue();/* 是不是通过事件置位解除的任务 */if(( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET )==( EventBits_t )0){taskENTER_CRITICAL();//进入临界段{/* The task timed out, just return the current event bit value. */
uxReturn = pxEventBits->uxEventBits;// 获取当前事件位/* It is possible that the event bits were updated between this
task leaving the Blocked state and running again. *//* 判断是否已经置位 */if(prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits )!= pdFALSE ){/* 如果需要清除,清除触发后的标志位 */if( xClearOnExit != pdFALSE ){
pxEventBits->uxEventBits &=~uxBitsToWaitFor;}else{mtCOVERAGE_TEST_MARKER();}}else{mtCOVERAGE_TEST_MARKER();}}taskEXIT_CRITICAL();/* Prevent compiler warnings when trace macros are not used. */
xTimeoutOccurred = pdFALSE;}else{/* The task unblocked because the bits were set. */}/* The task blocked so control bits may have been set. */
uxReturn &=~eventEVENT_BITS_CONTROL_BYTES;}traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred );return uxReturn;}
Django开发入门 – 1.搭建基于Python Web框架Django的IDE开发环境
Build A Integrated Development Environment(IDE) for Python Web Framework - django
By JacksonML
1. 获取及安装最新版Python
打开Chrome浏览器,访问Python官网链接:https://www…