博客
关于我
FreeRTOS源码分析与应用开发03:时间管理
阅读量:253 次
发布时间:2019-03-01

本文共 4726 字,大约阅读时间需要 15 分钟。

FreeRTOS?????SysTick???

1. FreeRTOS????

1.1 ??????

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??????????????????????????

1.2 vTaskDelay??

vTaskDelay????????????????????????????????????????????????????????????????????????

1.2.1 ????

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();    }}

1.2.2 ??

  • ???????????????????
  • ???????vTaskDelay????????????????????
  • ??????????????????????
    • ?10ms????
    • ???????10ms

1.3 vTaskDelayUntil??

vTaskDelayUntil??????????????????????????????????????xTimeIncrement??????????????????

1.3.1 ????

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();    }}

1.3.2 ??

  • ?????????????????????????

  • ?????????xTimeIncrement????????????????????????????????????

  • ????????????????????????????????

  • xConstTickCount?xTimeToWake????
  • xConstTickCount????xTimeToWake??
  • xConstTickCount?xTimeToWake???

2. FreeRTOS????

2.1 SysTick???

SysTick??Cortex-M?????????24??????????????FreeRTOS??SysTick??????????????????????

2.1.2 ?????

SysTick?4????????

  • CTRL???????????????
  • LOAD???????????????

2.1.3 ????

vPortSetupTimerInterrupt();

2.1.3 ??

  • ?????SysTick??????configTICK_RATE_HZ?configSYSTICK_CLOCK_HZ?????
  • ??????????????????????????

2.2 SysTick????

2.2.1 xPortSysTickHandler??

SysTick????????????xTaskIncrementTick????????????????????

2.2.2 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;}

2.2.3 ??

  • ????????xTickCount??????taskSWITCH_DELAYED_LISTS???????
  • ?????????????????????xNextTaskUnblockTime?????????????????????

??????????FreeRTOS??????????????????????????

转载地址:http://kqwx.baihongyu.com/

你可能感兴趣的文章
Netwox网络工具使用详解
查看>>
Net与Flex入门
查看>>
net包之IPConn
查看>>
Net操作配置文件(Web.config|App.config)通用类
查看>>
Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
查看>>
New Relic——手机应用app开发达人的福利立即就到啦!
查看>>
NFinal学习笔记 02—NFinalBuild
查看>>
NFS
查看>>
NFS Server及Client配置与挂载详解
查看>>
NFS共享文件系统搭建
查看>>
nfs复习
查看>>
NFS安装配置
查看>>
NFS的安装以及windows/linux挂载linux网络文件系统NFS
查看>>
NFS的常用挂载参数
查看>>
NFS网络文件系统
查看>>
nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
查看>>
NFV商用可行新华三vBRAS方案实践验证
查看>>
ng build --aot --prod生成文件报错
查看>>
ng 指令的自定义、使用
查看>>
nghttp3使用指南
查看>>