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

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

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/

你可能感兴趣的文章
NLP三大特征抽取器:CNN、RNN与Transformer全面解析
查看>>
NLP学习笔记:使用 Python 进行NLTK
查看>>
NLP度量指标BELU真的完美么?
查看>>
NLP的不同研究领域和最新发展的概述
查看>>
NLP的神经网络训练的新模式
查看>>
NLP采用Bert进行简单文本情感分类
查看>>
NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
查看>>
NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
查看>>
NLP:使用 SciKit Learn 的文本矢量化方法
查看>>
nmap 使用方法详细介绍
查看>>
Nmap扫描教程之Nmap基础知识
查看>>
nmap指纹识别要点以及又快又准之方法
查看>>
Nmap渗透测试指南之指纹识别与探测、伺机而动
查看>>
Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
查看>>
NMAP网络扫描工具的安装与使用
查看>>
NMF(非负矩阵分解)
查看>>
nmon_x86_64_centos7工具如何使用
查看>>
NN&DL4.1 Deep L-layer neural network简介
查看>>
NN&DL4.3 Getting your matrix dimensions right
查看>>
NN&DL4.7 Parameters vs Hyperparameters
查看>>