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

几何背景生成器网站深圳网站建设 百业

几何背景生成器网站,深圳网站建设 百业,手机网站建设设计,虚拟主机网站500错误时间管理 时间管理FreeRTOS 系统时钟节拍FreeRTOS 系统时钟节拍简介FreeRTOS 系统时钟节拍处理FreeRTOS 系统时钟节拍来源 FreeRTOS 任务延时函数vTaskDelay()vTaskDelayUntil() 时间管理 在前面的章节实验例程中#xff0c;频繁地使用了 FreeRTOS 提供的延时函数#xff0c… 时间管理 时间管理FreeRTOS 系统时钟节拍FreeRTOS 系统时钟节拍简介FreeRTOS 系统时钟节拍处理FreeRTOS 系统时钟节拍来源 FreeRTOS 任务延时函数vTaskDelay()vTaskDelayUntil() 时间管理 在前面的章节实验例程中频繁地使用了 FreeRTOS 提供的延时函数使用延时函数会使得任务进入阻塞态直至延时完成任务才会重新进入就绪态FreeRTOS 是如何对延时任务进行阻塞的又是如何判断任务延时超时的这些都是属于 FreeRTOS 时间管理的相关内容。 FreeRTOS 系统时钟节拍 FreeRTOS 系统时钟节拍简介 任务的操作系统都需要时钟节拍FreeRTOS 也不例外。FreeRTOS 有一个系统时钟节拍计数器——xTickCountxTickCount 是一个全局变量在 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://www.dnsts.com.cn/news/200678.html

相关文章:

  • 网站index.php被修改wordpress 函数教程视频
  • 中国最大的网站制作公司个人网站可以做淘客
  • 黑龙江建设网网站一体化平台域名网站建设流程
  • 心雨在线高端网站建设专业建设公司董事长致辞网站范文
  • 成品网站货源1688免费怎样申请微信公众平台账号
  • 网站建设行业数据wordpress博客模板查询
  • 南充做网站的公司外贸建站用什么平台好
  • 生物信息网站建设wordpress 会员函数
  • 淘客怎么用网站做便民信息免费发布平台
  • 淄博网站制作定制改版百度教育官网登录入口
  • 小说网站开发 公司离婚协议书模板免费下载
  • 成都网站建设公司有哪几家昆山做网站企业
  • 邯郸网站制作公司生产管理软件定制开发
  • 凤岗镇网站仿做寻找邯郸网站建设
  • 网站的字体做多大百度广州给做网站公司
  • wordpress全站cdn教程七宝做网站
  • 青岛网站建设 新视点网站备份查询
  • 邮箱发网站建设主题怎么写ico网站图标
  • 烟台网站排名优化价格wordpress 购物模板
  • wordpress 微信 插件开发防疫优化措施
  • 地方志网站建设广西医科大学网站建设
  • 网站模板 asp pc wap自学学网页设计
  • 网摘网站推广法公司申请域名流程
  • 网站建设课程的感想云速建站与传统网站的区别
  • 北京专业做网站的使用网站的mysql
  • 网站建设凡科合肥知名网站制作
  • 炒域名 网站苏州网站建设费用
  • 河北企业建站天津最新紧急通知
  • 网站权重查询工具室内设计图网站有哪些
  • 电子商务网站怎么建设网站内的链接怎么做