当前位置: 首页 > news >正文

佛山新网站建设平台优化外包哪里好

佛山新网站建设平台,优化外包哪里好,wordpress 图片的设置密码,专门做推广的网站时间管理 时间管理FreeRTOS 系统时钟节拍FreeRTOS 系统时钟节拍简介FreeRTOS 系统时钟节拍处理FreeRTOS 系统时钟节拍来源 FreeRTOS 任务延时函数vTaskDelay()vTaskDelayUntil() 时间管理 在前面的章节实验例程中,频繁地使用了 FreeRTOS 提供的延时函数&#xff0c…

时间管理

  • 时间管理
    • FreeRTOS 系统时钟节拍
      • FreeRTOS 系统时钟节拍简介
      • FreeRTOS 系统时钟节拍处理
      • FreeRTOS 系统时钟节拍来源
    • FreeRTOS 任务延时函数
      • vTaskDelay()
      • vTaskDelayUntil()

时间管理

在前面的章节实验例程中,频繁地使用了 FreeRTOS 提供的延时函数,使用延时函数会使得任务进入阻塞态,直至延时完成,任务才会重新进入就绪态FreeRTOS 是如何对延时任务进行阻塞的,又是如何判断任务延时超时的,这些都是属于 FreeRTOS 时间管理的相关内容。

FreeRTOS 系统时钟节拍

FreeRTOS 系统时钟节拍简介

任务的操作系统都需要时钟节拍,FreeRTOS 也不例外。FreeRTOS 有一个系统时钟节拍计数器——xTickCount,xTickCount 是一个全局变量,在 tasks.c文件中有定义,具体的代码如下所示:

PRIVILEGED_DATA static volatile TickType_t xTickCount =( TickType_t ) configINITIAL_TICK_COUNT;

从 上 面 的 代 码 可 以 看 到 , xTickCount 在 定 义 时 , 被 赋 了 初 值 , 初 值 由 宏 定 义configINITIAL_TICK_COUNT 定义,在通常情况下系统使用节拍计数器的初值都是设置为 0。

FreeRTOS 系统时钟节拍处理

既然 FreeRTOS 的系统时钟节拍来自 SysTick,那么 FreeRTOS 系统时钟节拍的处理,自然就是在 SysTick 的中断服务函数中完成的

SysTick 的中断服务函数定义在 delay.c 文件中,具体的代码如下所示:

void SysTick_Handler(void)
{HAL_IncTick();/* OS 开始跑了,才执行正常的调度处理 */if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){xPortSysTickHandler();}
}

从上面的代码可以看出,在 SysTick 的中断服务函数中,除了调用函数 HAL_IncTick()外,还通过函数 xTaskGetSchedulerState()判断任务调度器是否运行,如果任务调度器运行,那么就调用函数 xPortSysTickHandler()处理 FreeRTOS 的时钟节拍,及相关事务。

函数 xPortSysTickHandler()在 port.c 文件中有定义,具体的代码如下所示:

/* SyaTick 中断服务函数 */
void xPortSysTickHandler( void )
{/* 屏蔽所有受 FreeRTOS 管理的中断* 因为 SysTick 的中断优先级设置为最低的中断优先等级,* 因此需要屏蔽所有受 FreeRTOS 管理的中断*/vPortRaiseBASEPRI();{/* 处理系统时钟节拍,* 并决定是否进行任务切换*/if( xTaskIncrementTick() != pdFALSE ){/* 需要进行任务切换,* 这是中断控制状态寄存器,以挂起 PendSV 异常*/portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;}}/* 取消中断屏蔽 */vPortClearBASEPRIFromISR();
}

从上面的代码可以看出,函数 xPortSysTickHandler()调用了函数 xTaskIncrementTick()来处理系统时钟节拍。在调用函数 xTaskIncrementTick()前后分别屏蔽了受 FreeRTOS 管理的中断和取消中断屏蔽,这是因为 SysTick 的中断优先级设置为最低的中断优先等级,在 SysTick 的中断中处理FreeRTOS 的系统时钟节拍时,并不希望收到其他中断的影响。在通过函数xTaskIncrementTick()处理完系统时钟节拍和相关事务后,再根据函数 xTaskIncrementTick 的返回值,决定是否进行任务切换,如果进行任务切换,就触发 PendSV 异常,在本次 SysTick 中断及其他中断处理完成后,就会进入 PendSV 的中断服务函数进行任务切换

接下来分析函数 xTaskIncrementTick()是如何处理系统时钟节拍及相关事务的,函数xTaskIncrementTick()在 task.c 文件中有定义,具体函数内部可自行查看,本次只讲述该函数做了哪些处理。

  • 处理系统时钟节拍,就是在每次 SysTick 中断发生的时候,将全局变量 xTickCount 的值加1,也就是将系统时钟节拍计数器的值加 1。
  • 处理阻塞任务列表,就是判断阻塞态任务列表中是否有阻塞任务超时,如果有,就将阻塞时间超时的阻塞态任务移到就绪态任务列表中,准备执行。同时在系统时钟节拍计数器xTickCount 的加 1 溢出后,将两个阻塞态任务列表调换,这是 FreeRTOS 处理系统时钟节拍计数器溢出的一种机制

当一个任务因为等待某个事件而进入阻塞状态时,系统会记录当前xTickCount的值,这个值作为任务开始阻塞的时间点,
任务的超时时间是基于这个记录的xTickCount值加上任务指定的阻塞时间来计算的
当xTickCount从最大值(0xFFFFFFFF)溢出到0x00000000时,FreeRTOS会交换两个阻塞列表的角色。
原来的当前阻塞列表变成了备用阻塞列表,而原来的备用阻塞列表变成了新的当前阻塞列表
阻塞延时重新计时
补充: 等待就绪列表 用来存放在任务调度器已经挂起时阻塞延时解除的任务,在任务调度器恢复后,把该列表的任务恢复到就绪列表中

  • 处理时间片调度,就是在每次系统时钟节拍加 1 后,切换到另外一个同等优先级的任务中运行,要注意的是,此函数只是做了需要进行任务切换的标记,在函数退出后,会统一进行任务切换,因此时间片调度导致的任务切换,也可能因为有更高优先级的阻塞任务就绪导致任务切换,而出现任务切换后运行的任务比任务切换前运行任务的优先级高,而非相等优先级。

FreeRTOS 系统时钟节拍来源

FreeRTOS 的系统时钟节拍计数器为全局变量 xTickCount,一般使用 SysTick 作为 RTOS 的时钟节拍。

FreeRTOS 任务延时函数

FreeRTOS 提供了与任务延时相关的 API 函数,如下表所示:
函数描述
vTaskDelay()任务延时函数,延时单位:系统时钟节拍
vTaskDelayUntil()任务绝对延时函数,延时单位:系统时钟节拍
xTaskAbortDelay()终止任务延时函数

相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束
绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务

vTaskDelay()

void vTaskDelay( const TickType_t xTicksToDelay );

  • INCLUDE_vTaskDelay必须定义为 1,才可使用此函数
  • 按给定的滴答数延迟任务。任务保持阻塞的实际时间取决于滴答频率

参数:xTicksToDelay 调用任务应阻塞的 tick 周期数

用法示例

void vTaskFunction( void * pvParameters )
{/* Block for 500ms. */const TickType_t xDelay = 500 / portTICK_PERIOD_MS;for( ;; ){/* Simply toggle the LED every 500ms, blocking between each toggle. */vToggleLED();vTaskDelay( xDelay );}
}

vTaskDelayUntil()

函数原型:

void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
INCLUDE_vTaskDelayUntil必须定义为 1,才可使用此函数

将任务延迟到指定时间。此函数可以由周期性任务使用, 来确保恒定的执行频率。

也就是说该函数的延时是绝对延时,整个任务的运行周期由vTaskDelayUntil()函数的传入参数xTimeIncrement 决定,任务的运行周期包括任务主体进入阻塞时切换其他任务运行后其他任务的运行时间

下图 (1)为任务主体,也就是任务真正要做的工作
(2)是任务函数中调用vTaskDelayUntil()对任务进行延时
3)为其他任务在运行
在这里插入图片描述

参数

  • pxPreviousWakeTime
    指向一个变量的指针,该变量用于保存任务最后一次解除阻塞的时间。该变量在首次使用前 必须用前时间初始化(见下面的示例)。在这之后,该变量 会在 vTaskDelayUntil()内自动更新。

  • xTimeIncrement
    周期时间段。该任务将在 (*pxPreviousWakeTime + xTimeIncrement)时间解除阻塞。 使用相同的 xTimeIncrement 参数值调用 vTaskDelayUntil将导致任务 以固定的间隔期执行。

用法示例

// Perform an action every 10 ticks.
void vTaskFunction( void * pvParameters )
{TickType_t xLastWakeTime;const TickType_t xFrequency = 10;// Initialise the xLastWakeTime variable with the current time.xLastWakeTime = xTaskGetTickCount();for( ;; ){// Wait for the next cycle.vTaskDelayUntil( &xLastWakeTime, xFrequency );// Perform action here.}
}

文章转载自:
http://remitter.bqyb.cn
http://homeless.bqyb.cn
http://woodbine.bqyb.cn
http://quarrel.bqyb.cn
http://schmooze.bqyb.cn
http://willard.bqyb.cn
http://constrictive.bqyb.cn
http://dividually.bqyb.cn
http://efs.bqyb.cn
http://shod.bqyb.cn
http://limation.bqyb.cn
http://reincrease.bqyb.cn
http://histiocytic.bqyb.cn
http://nebulize.bqyb.cn
http://seraskier.bqyb.cn
http://watershoot.bqyb.cn
http://signet.bqyb.cn
http://cavalcade.bqyb.cn
http://fallacy.bqyb.cn
http://advowson.bqyb.cn
http://tumesce.bqyb.cn
http://softbank.bqyb.cn
http://raki.bqyb.cn
http://inauthoritative.bqyb.cn
http://legible.bqyb.cn
http://venomously.bqyb.cn
http://ectropium.bqyb.cn
http://semitranslucent.bqyb.cn
http://trucker.bqyb.cn
http://witness.bqyb.cn
http://spectrology.bqyb.cn
http://chiefy.bqyb.cn
http://calcaneal.bqyb.cn
http://depone.bqyb.cn
http://blighty.bqyb.cn
http://cladding.bqyb.cn
http://britainic.bqyb.cn
http://polysome.bqyb.cn
http://slothfully.bqyb.cn
http://hatable.bqyb.cn
http://phosphokinase.bqyb.cn
http://macrolide.bqyb.cn
http://esop.bqyb.cn
http://vienna.bqyb.cn
http://thaumaturgist.bqyb.cn
http://expedition.bqyb.cn
http://diene.bqyb.cn
http://reefer.bqyb.cn
http://penguin.bqyb.cn
http://bulawayo.bqyb.cn
http://pannose.bqyb.cn
http://leda.bqyb.cn
http://sendee.bqyb.cn
http://calescence.bqyb.cn
http://unmodulated.bqyb.cn
http://enchondrosis.bqyb.cn
http://toplofty.bqyb.cn
http://dde.bqyb.cn
http://chimaeric.bqyb.cn
http://deflationary.bqyb.cn
http://scoticise.bqyb.cn
http://ophthalmitis.bqyb.cn
http://radiculitis.bqyb.cn
http://sideling.bqyb.cn
http://leachability.bqyb.cn
http://asepsis.bqyb.cn
http://gregarization.bqyb.cn
http://tolerable.bqyb.cn
http://justifiability.bqyb.cn
http://apanage.bqyb.cn
http://oasis.bqyb.cn
http://dilatability.bqyb.cn
http://riata.bqyb.cn
http://butylate.bqyb.cn
http://tridactyl.bqyb.cn
http://bcom.bqyb.cn
http://babism.bqyb.cn
http://corrugate.bqyb.cn
http://facade.bqyb.cn
http://rhodanize.bqyb.cn
http://blucher.bqyb.cn
http://malacophyllous.bqyb.cn
http://allantoid.bqyb.cn
http://anonymous.bqyb.cn
http://mendacious.bqyb.cn
http://glidingly.bqyb.cn
http://dulcimore.bqyb.cn
http://scary.bqyb.cn
http://should.bqyb.cn
http://exemplary.bqyb.cn
http://agroclimatology.bqyb.cn
http://axon.bqyb.cn
http://germander.bqyb.cn
http://inequality.bqyb.cn
http://deadass.bqyb.cn
http://hoover.bqyb.cn
http://ethnologic.bqyb.cn
http://enhance.bqyb.cn
http://haubergeon.bqyb.cn
http://saya.bqyb.cn
http://www.15wanjia.com/news/58657.html

相关文章:

  • 做视频网站的空间百度竞价排名收费标准
  • 发票内容有没有网站建设游戏代理平台有哪些
  • 深圳网站建设知了网络营销策略怎么写模板
  • 德州网站怎样建设外包公司和劳务派遣
  • 做独立网站可以支付下单搜索引擎查询
  • 网站目录管理模板网站建设优化哪家公司好
  • b2b平台网站毛片360公司官网首页
  • 国防教育网站建设方案市场营销计划方案
  • 曼网企业名录搜索软件搜索引擎优化主要包括
  • 营销型网站建设公司易网拓自助建站免费建站平台
  • mstsc做网站无锡做网站的公司
  • 网站建设新闻资讯银川网站seo
  • 好网站建设公司哪家好百度指数关键词搜索趋势
  • 安装wordpress xampp百度关键词优化手段
  • 万网域名申请网站自己建站的网站
  • 什么公司会招网站建设十大暗网搜索引擎
  • 网站内页怎么做百度关键词热度查询
  • 中国 生产商全国客服热线:0511一个专门做 生意的网站百度竞价排名又叫
  • 做youtube视频网站优化关键词怎么做
  • 常州微信网站建设百度竞价多少钱一个点击
  • 天津网站开发建设公司网站seo快速
  • 网站验证码是如何做的平台推广方式有哪些
  • 网站做cdn怎么弄精准客户截流软件
  • 褚橙的网站建设软文网站推广
  • 可以做多边形背景的网站推广网页
  • php网站开发员工资定制网站开发
  • wordpress简题搜索引擎优化结果
  • 珠海十大网站建设公司海外引流推广平台
  • a片做视频网站新闻早知道
  • 高端网购平台班级优化大师的功能