本文共 4806 字,大约阅读时间需要 16 分钟。
FreeRTOS??????????????
static List_t xDelayedTaskList1;static List_t xDelayedTaskList2;static List_t * volatile pxDelayedTaskList;static List_t * volatile pxOverflowDelayedTaskList;static volatile TickType_t xNextTaskUnblockTime???????????????????????????????????????xTickCount?uint32_t???????????FreeRTOS?????????????????????????????
?xTickCount?????????pxDelayedTaskList?pxOverflowDelayedTaskList????xNextTaskUnblockTime??????????????????????????
vTaskDelay????????????????????????????????????????????????????????????????????????
void vTaskDelay(const TickType_t xTicksToDelay) { BaseType_t xAlreadyYielded = pdFALSE; if (xTicksToDelay > (TickType_t)0U) { configASSERT(uxSchedulerSuspended == 0); vTaskSuspendAll(); prvAddCurrentTaskToDelayedList(xTicksToDelay, pdFALSE); xAlreadyYielded = xTaskResumeAll(); } if (xAlreadyYielded == pdFALSE) { portYIELD_WITHIN_API(); }} vTaskDelay?????????????????????10ms???????????10msvTaskDelayUntil??????????????????????????????????????xTimeIncrement??????????????????
void vTaskDelayUntil(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(); { const TickType_t xConstTickCount = xTickCount; xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; if (xConstTickCount < *pxPreviousWakeTime) { if ((xTimeToWake < *pxPreviousWakeTime) && (xTimeToWake > xConstTickCount)) { xShouldDelay = pdTRUE; } } else { if ((xTimeToWake < *pxPreviousWakeTime) || (xTimeToWake > xConstTickCount)) { xShouldDelay = pdTRUE; } } *pxPreviousWakeTime = xTimeToWake; if (xShouldDelay != pdFALSE) { prvAddCurrentTaskToDelayedList(xTimeToWake - xConstTickCount, pdFALSE); } } xAlreadyYielded = xTaskResumeAll(); if (xAlreadyYielded == pdFALSE) { portYIELD_WITHIN_API(); }} ?????????????????????????
?????????xTimeIncrement????????????????????????????????????
????????????????????????????????
SysTick??Cortex-M?????????24??????????????FreeRTOS??SysTick??????????????????????
SysTick?4????????
vPortSetupTimerInterrupt();
configTICK_RATE_HZ?configSYSTICK_CLOCK_HZ?????SysTick????????????xTaskIncrementTick????????????????????
BaseType_t xTaskIncrementTick(void) { if (uxSchedulerSuspended == pdFALSE) { xTickCount++; if (xTickCount == (TickType_t)0U) { taskSWITCH_DELAYED_LISTS(); } if (xTickCount >= xNextTaskUnblockTime) { while (listLIST_IS_EMPTY(pxDelayedTaskList) == pdFALSE) { pxTCB = listGET_OWNER_OF_HEAD_ENTRY(pxDelayedTaskList); xItemValue = listGET_LIST_ITEM_VALUE(pxTCB->xStateListItem); if (xTickCount < xItemValue) { xNextTaskUnblockTime = xItemValue; break; } uxListRemove(pxTCB->xStateListItem); if (listLIST_ITEM_CONTAINER(pxTCB->xEventListItem) != NULL) { uxListRemove(pxTCB->xEventListItem); } prvAddTaskToReadyList(pxTCB); #if (configUSE_PREEMPTION == 1) if (pxTCB->uxPriority >= pxCurrentTCB->uxPriority) { xSwitchRequired = pdTRUE; } #endif } xNextTaskUnblockTime = portMAX_DELAY; } #if (configUSE_PREEMPTION == 1 && configUSE_TIME_SLICING == 1) if (listCURRENT_LIST_LENGTH(pxReadyTasksLists[pxCurrentTCB->uxPriority]) > 1) { xSwitchRequired = pdTRUE; } #endif } else { uxPendedTicks++; } #if (configUSE_PREEMPTION == 1) if (xYieldPending != pdFALSE) { xSwitchRequired = pdTRUE; } #endif return xSwitchRequired;} xTickCount??????taskSWITCH_DELAYED_LISTS???????xNextTaskUnblockTime???????????????????????????????FreeRTOS??????????????????????????
转载地址:http://kqwx.baihongyu.com/