博客
关于我
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/

你可能感兴趣的文章
npm前端包管理工具简介---npm工作笔记001
查看>>
npm包管理深度探索:从基础到进阶全面教程!
查看>>
npm升级以及使用淘宝npm镜像
查看>>
npm发布包--所遇到的问题
查看>>
npm发布自己的组件UI包(详细步骤,图文并茂)
查看>>
npm和package.json那些不为常人所知的小秘密
查看>>
npm和yarn清理缓存命令
查看>>
npm和yarn的使用对比
查看>>
npm如何清空缓存并重新打包?
查看>>
npm学习(十一)之package-lock.json
查看>>
npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
查看>>
npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
查看>>
npm安装教程
查看>>
npm报错Cannot find module ‘webpack‘ Require stack
查看>>
npm报错Failed at the node-sass@4.14.1 postinstall script
查看>>
npm报错fatal: Could not read from remote repository
查看>>
npm报错File to import not found or unreadable: @/assets/styles/global.scss.
查看>>
npm报错TypeError: this.getOptions is not a function
查看>>
npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
查看>>
npm淘宝镜像过期npm ERR! request to https://registry.npm.taobao.org/vuex failed, reason: certificate has ex
查看>>