static void vDNSDoCallback( TickType_t xIdentifier, const char *pcName, uint32_t ulIPAddress ) { const ListItem_t *pxIterator; const MiniListItem_t* xEnd = ( const MiniListItem_t* )listGET_END_MARKER( &xCallbackList ); vTaskSuspendAll(); { for( pxIterator = ( const ListItem_t * ) listGET_NEXT( xEnd ); pxIterator != ( const ListItem_t * ) xEnd; pxIterator = ( const ListItem_t * ) listGET_NEXT( pxIterator ) ) { if( listGET_LIST_ITEM_VALUE( pxIterator ) == xIdentifier ) { DNSCallback_t *pxCallback = ( DNSCallback_t * ) listGET_LIST_ITEM_OWNER( pxIterator ); pxCallback->pCallbackFunction( pcName, pxCallback->pvSearchID, ulIPAddress ); uxListRemove( &pxCallback->xListItem ); vPortFree( pxCallback ); if( listLIST_IS_EMPTY( &xCallbackList ) ) { vIPSetDnsTimerEnableState( pdFALSE ); } break; } } } xTaskResumeAll(); }
void vDNSCheckCallBack( void *pvSearchID ) { const ListItem_t *pxIterator; const MiniListItem_t* xEnd = ( const MiniListItem_t* )listGET_END_MARKER( &xCallbackList ); vTaskSuspendAll(); { for( pxIterator = ( const ListItem_t * ) listGET_NEXT( xEnd ); pxIterator != ( const ListItem_t * ) xEnd; ) { DNSCallback_t *pxCallback = ( DNSCallback_t * ) listGET_LIST_ITEM_OWNER( pxIterator ); /* Move to the next item because we might remove this item */ pxIterator = ( const ListItem_t * ) listGET_NEXT( pxIterator ); if( ( pvSearchID != NULL ) && ( pvSearchID == pxCallback->pvSearchID ) ) { uxListRemove( &pxCallback->xListItem ); vPortFree( pxCallback ); } else if( xTaskCheckForTimeOut( &pxCallback->xTimeoutState, &pxCallback->xRemaningTime ) != pdFALSE ) { pxCallback->pCallbackFunction( pxCallback->pcName, pxCallback->pvSearchID, 0 ); uxListRemove( &pxCallback->xListItem ); vPortFree( ( void * ) pxCallback ); } } } xTaskResumeAll(); if( listLIST_IS_EMPTY( &xCallbackList ) ) { vIPSetDnsTimerEnableState( pdFALSE ); } }
BaseType_t xProcessReceivedUDPPacket( xNetworkBufferDescriptor_t *pxNetworkBuffer, uint16_t usPort ) { xListItem *pxListItem; BaseType_t xReturn = pdPASS; xFreeRTOS_Socket_t *pxSocket; BaseType_t xHigherPriorityTaskWoken = pdFALSE; vTaskSuspendAll(); { /* See if there is a list item associated with the port number on the list of bound sockets. */ pxListItem = pxListFindListItemWithValue( &xBoundSocketsList, ( TickType_t ) usPort ); } xTaskResumeAll(); if( pxListItem != NULL ) { /* The owner of the list item is the socket itself. */ pxSocket = ( xFreeRTOS_Socket_t * ) listGET_LIST_ITEM_OWNER( pxListItem ); vTaskSuspendAll(); { #if( ipconfigSUPPORT_SELECT_FUNCTION == 1 ) { /* Is the socket a member of a select() group? */ if( pxSocket->xSelectQueue != NULL ) { /* Can the select group be notified that the socket is ready to be read? */ if( xQueueSendFromISR( pxSocket->xSelectQueue, &pxSocket, &xHigherPriorityTaskWoken ) != pdPASS ) { /* Could not notify the select group. */ xReturn = pdFAIL; iptraceFAILED_TO_NOTIFY_SELECT_GROUP( pxSocket ); } } } #endif if( xReturn == pdPASS ) { taskENTER_CRITICAL(); { /* Add the network packet to the list of packets to be processed by the socket. */ vListInsertEnd( &( pxSocket->xWaitingPacketsList ), &( pxNetworkBuffer->xBufferListItem ) ); } taskEXIT_CRITICAL(); /* The socket's counting semaphore records how many packets are waiting to be processed by the socket. */ xSemaphoreGiveFromISR( pxSocket->xWaitingPacketSemaphore, &xHigherPriorityTaskWoken ); } } if( xTaskResumeAll() == pdFALSE ) { if( xHigherPriorityTaskWoken != pdFALSE ) { taskYIELD(); } } } else { xReturn = pdFAIL; } return xReturn; }
/** * Sjodin */ BaseType_t xWcrtCalculateTasksWcrt( void ) { TickType_t xW = 0U; const ListItem_t * pxAppTasksListEndMarker = listGET_END_MARKER( pxAllTasksList ); ListItem_t * pxAppTasksListItem = listGET_HEAD_ENTRY( pxAllTasksList ); struct TaskInfo *pxTask = ( struct TaskInfo * ) listGET_LIST_ITEM_OWNER( pxAppTasksListItem ); /* First task WCRT. */ TickType_t xT = pxTask->xWcet; pxTask->xWcrt = xT; /* Check first task deadline. */ if( pxTask->xWcrt > pxTask->xPeriod ) { return pdFALSE; } /* Next task. */ pxAppTasksListItem = listGET_NEXT( pxAppTasksListItem ); /* Process all the periodic tasks in xTasks. */ while( pxAppTasksListEndMarker != pxAppTasksListItem ) { pxTask = ( struct TaskInfo * ) listGET_LIST_ITEM_OWNER( pxAppTasksListItem ); xT = xT + pxTask->xWcet; while( xT <= pxTask->xDeadline ) { xW = 0; /* Calculates the workload of the higher priority tasks than pxTask. */ ListItem_t * pxAppTaskHigherPrioListItem = listGET_HEAD_ENTRY( pxAllTasksList ); do { struct TaskInfo * pxHigherPrioTask = ( struct TaskInfo * ) listGET_LIST_ITEM_OWNER( pxAppTaskHigherPrioListItem ); xW = xW + ( U_CEIL( xT, pxHigherPrioTask->xPeriod ) * pxHigherPrioTask->xWcet ); pxAppTaskHigherPrioListItem = listGET_NEXT( pxAppTaskHigherPrioListItem ); } while( pxAppTaskHigherPrioListItem != pxAppTasksListItem ); xW = xW + pxTask->xWcet; if( xT == xW ) { break; } else { xT = xW; } } if( xT > pxTask->xDeadline ) { return pdFALSE; } pxTask->xWcrt = xT; pxAppTasksListItem = listGET_NEXT( pxAppTasksListItem ); } return pdTRUE; }