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

网站建设zvge怎么在网站上做视频

网站建设zvge,怎么在网站上做视频,深圳住建局最新通知,微信小程序怎么一键删除前言 本文以野火的教程和代码为基础#xff0c;对 FreeRTOS 中时间片的概念作了解释#xff0c;并且给出了实现方式#xff0c;同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中#xff0c;我们已经知道任务根据不同的优先级被放入就绪列表中不…前言 本文以野火的教程和代码为基础对 FreeRTOS 中时间片的概念作了解释并且给出了实现方式同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中我们已经知道任务根据不同的优先级被放入就绪列表中不同下标的链表中先执行优先级高的链表。而且我们知道在一条相同优先级的就绪链表中可以存放多个 TCB。 那么你有没有想过当一条相同优先级的就绪链表中存放了多个 TCB 时怎么执行有些人可能会想相同优先级的话就顺序执行呗执行完任务1就接着执行任务2这样一直往下执行就可以啦。 那如果我们在一个任务中放入了耗时很长的代码或者更极端一些放入一个死循环那我们的任务岂不是就永远无法执行完毕也就永远没办法切换到相同优先级的其他任务了。 所以我们在这里引入了对于时间片的支持。**时间片time slice实际上就是为了让 CPU 资源能较为公平地分配到每一个任务中。在相同的优先级中每个任务按照固定顺序依次执行一个时间片的时间然后切换到下一个任务。**如果一个任务在时间片结束之前没有执行完它将被挂起任务的上下文将被保留并在下一个循环中重新获得时间片后继续执行上次没有执行完的代码。 通过划分时间片操作系统能够公平地分享处理器时间给多个任务使得它们能够以看似同时的方式进行处理提高了系统的并发性和响应性能。 二、时间片代码的实现 其实在前面的文章中我们的代码已经可以支持时间片了但是为了让代码效率更高还是需要对代码进行一些优化。主要是以下这些代码 SysTick 中断 xPortSysTickHandler()时基计数函数 xTaskIncrementTick()时间片的核心实现 1. SysTick 中断 xPortSysTickHandler() 的修改 之前的代码是每进入一次 SysTick 中断后都调用一次 taskYIELD() 进行任务的切换。 但实际上进入中断后并不一定需要切换任务。需要进行任务切换的有以下这些情况 当前执行的这个任务的优先级不是最高的当前执行的这个任务的优先级虽然是最高的但是有其他优先级和它一样的任务在等待执行 所以我们在 SysTick 中断中调用时基计数函数 xTaskIncrementTick()并在 xTaskIncrementTick() 对上面所说的情况进行判断返回是否需要进行任务切换再在 SysTick 中断看情况是否进行任务切换。 代码 /* ************************************************************************* * SysTick中断服务函数 ************************************************************************* */ void xPortSysTickHandler( void ) {/* 关中断 */vPortRaiseBASEPRI();{/* 更新系统时基 */if( xTaskIncrementTick() ! pdFALSE ){taskYIELD();}}/* 开中断 */vPortClearBASEPRIFromISR(); }2. 时基计数函数 xTaskIncrementTick() 的修改 添加一个返回值 xSwitchRequired标识是否需要进行任务切换初始化为 pdFALSE表示不需要任务切换遇到这些情况就修改 pdFALSE 为 pdTRUE表示需要进行任务切换 当前执行的这个任务的优先级不是最高的当前执行的这个任务的优先级虽然是最高的但是有其他优先级和它一样的任务在等待执行 定义了 configUSE_PREEMPTION 为 1表示使用任务抢占也就是优先级定义了 configUSE_TIME_SLICING 为 1表示使用时间片 实际上野火的教程中出现了两个 bug 添加了返回值 xSwitchRequired 却没有 returnconfigUSE_TIME_SLICING 的定义被注释掉了也就是说野火的代码实际上没有完全实现时间片的功能 我们把上面这些 bug 修复得到了以下的代码 #define configUSE_PREEMPTION 1 #ifndef configUSE_TIME_SLICING#define configUSE_TIME_SLICING 1 #endif//系统时基计数 BaseType_t xTaskIncrementTick( void ) {TCB_t * pxTCB;TickType_t xItemValue; BaseType_t xSwitchRequired pdFALSE;const TickType_t xConstTickCount xTickCount 1;xTickCount xConstTickCount;/* 如果xConstTickCount溢出则切换延时列表 */if( xConstTickCount ( TickType_t ) 0U ){taskSWITCH_DELAYED_LISTS();}/* 最近的延时任务延时到期 */if( xConstTickCount xNextTaskUnblockTime ){for( ;; ){if( listLIST_IS_EMPTY( pxDelayedTaskList ) ! pdFALSE ){/* 延时列表为空设置xNextTaskUnblockTime为可能的最大值 */xNextTaskUnblockTime portMAX_DELAY;break;}else /* 延时列表不为空 */{pxTCB ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );xItemValue listGET_LIST_ITEM_VALUE( ( pxTCB-xStateListItem ) );/* 直到将延时列表中所有延时到期的任务移除才跳出for循环 */if( xConstTickCount xItemValue ){xNextTaskUnblockTime xItemValue;break;}/* 将任务从延时列表移除消除等待状态 */( void ) uxListRemove( ( pxTCB-xStateListItem ) );/* 将解除等待的任务添加到就绪列表 */prvAddTaskToReadyList( pxTCB );#if ( configUSE_PREEMPTION 1 ){if( pxTCB-uxPriority pxCurrentTCB-uxPriority ){xSwitchRequired pdTRUE;}}#endif /* configUSE_PREEMPTION */}}}/* xConstTickCount xNextTaskUnblockTime */#if ( ( configUSE_PREEMPTION 1 ) ( configUSE_TIME_SLICING 1 ) ){if( listCURRENT_LIST_LENGTH( ( pxReadyTasksLists[ pxCurrentTCB-uxPriority ] ) ) ( UBaseType_t ) 1 ){xSwitchRequired pdTRUE;}}#endif /* ( ( configUSE_PREEMPTION 1 ) ( configUSE_TIME_SLICING 1 ) ) *//* 任务切换 *///portYIELD();return xSwitchRequired; }3. 时间片的核心实现——列表索引的妙用 那么如果要实现时间片也就是说在进行任务切换的时候我们要获取到同一优先级链表下当前任务的下一个任务的指针然后再切换到下一个任务去执行。这要怎么实现呢 我们调用任务切换函数后就会产生 PendSV 中断中断中会调用上下文切换函数而在上下文切换函数中会调用选择优先级最高任务的函数这个函数中首先确定最高的优先级然后更新当前任务指针listGET_OWNER_OF_NEXT_ENTRY()。 实际上listGET_OWNER_OF_NEXT_ENTRY() 就是实现时间片的关键。 还记得我们在进行链表实现时链表中有一个 pxIndex 的索引吗listGET_OWNER_OF_NEXT_ENTRY() 使用这个索引记住了上一次执行的任务的位置这样就能在每次调用时获取当前任务的下一个任务的指针。 代码 /* 获取链表节点的OWNER即TCB */ #define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ { \List_t * const pxConstList ( pxList ); \/* 节点索引指向链表第一个节点调整节点索引指针指向下一个节点如果当前链表有N个节点当第N次调用该函数时pxInedex则指向第N个节点 */\( pxConstList )-pxIndex ( pxConstList )-pxIndex-pxNext; \/* 当前链表为空 */ \if( ( void * ) ( pxConstList )-pxIndex ( void * ) ( ( pxConstList )-xListEnd ) ) \{ \( pxConstList )-pxIndex ( pxConstList )-pxIndex-pxNext; \} \/* 获取节点的OWNER即TCB */ \( pxTCB ) ( pxConstList )-pxIndex-pvOwner; \ }三、时间片代码实现的验证 我们定义两个优先级较低优先级为 2的任务并在这两个任务中使用循环延时改变电平然后再定义一个优先级较高优先级为 3的任务在这个任务中使用阻塞延时改变电平。代码如下 /* 任务1 优先级为2 */ void Task1_Entry( void *p_arg ) {for( ;; ){flag1 1;//vTaskDelay( 1 );delay (100); flag1 0;delay (100);//vTaskDelay( 1 ); } }/* 任务2 优先级为2 */ void Task2_Entry( void *p_arg ) {for( ;; ){flag2 1;//vTaskDelay( 1 );delay (100); flag2 0;delay (100);//vTaskDelay( 1 ); } }/* 任务2 优先级为3 */ void Task3_Entry( void *p_arg ) {for( ;; ){flag3 1;vTaskDelay( 2 );//delay (100); flag3 0;vTaskDelay( 2 );//delay (100);} }结果如下 任务3 延时 2 ms: 任务3 延时 10 ms: 可以看到在任务3 没用接过 CPU控制权改变电平时任务1 任务2 平均分配 CPU 使用时间时间片的实现成功。 而如果我们的时间片功能没有实现那么任务3 在进入阻塞延时后将交出 CPU 使用权开始执行任务1。由于任务1 的延时是循环延时而不是阻塞延时那么 CPU 将一直执行任务1 直到任务3 的阻塞延时结束再跳到任务3 执行而任务2 永远不会得到执行。 四、关于野火代码 bug 的讨论 在野火的官方例程中configUSE_TIME_SLICING 的定义被注释掉了也就是说野火的代码实际上没有完全实现时间片的功能。 以上文定义的验证代码为例注释掉configUSE_TIME_SLICING导致在任务3 交出 CPU 控制权给其他任务后如果其他任务里面是一个循环那么在任务3 重新获得 CPU 控制权前将一直执行这个任务而得益于 listGET_OWNER_OF_NEXT_ENTRY()在任务3 下一次交出 CPU 控制权后将会执行和刚才任务不同的另一个任务。 也就是出现了一种怪异的现象表面看起来优先级较低的任务1 和 2 有轮流执行似乎实现了时间片算法。但实际上正确的表现应该是在任务3 交出 CPU 控制权后此时任务3 中变量电平稳定为1 或者 0任务1 任务2 在任务3 中变量电平稳定期间可以多次切换实现真正的时间片而不是直到任务3 改变电平后再进行任务1 和任务2 之间的相互切换。 同样是任务 3 阻塞延时为2ms 注释后没有真正实现时间片的功能 没有注释真正实现时间片功能 以上就是本文的全部内容啦 后记 如果您觉得本文写得不错可以点个赞激励一下作者 如果您发现本文的问题欢迎在评论区或者私信共同探讨 共勉
http://www.w-s-a.com/news/370412/

相关文章:

  • 网站开发信息平台项目总结企业网站如何推广
  • 网站备案名称规定手机免费h5制作软件
  • 接网站建设单子的网站网页设计尺寸多大
  • 订制型网站费用做网站的问题
  • 淮阳住房和城乡建设网站桂林新闻桂林人论坛
  • 公司网站建设价格标准老版本网站开发工具
  • 门户网站开发费怎做账做网站交互demo工具
  • 中山最好的网站建设黄村网站建设价格
  • 企业网站首页应如何布局互联网营销师证书报名入口
  • 绍兴做网站哪家好篮球网站设计
  • 鹤岗市城乡建设局网站西域电商平台官网
  • 外贸网网站建设蓝色管理系统网站模版
  • 网站服务器关闭阿里巴巴logo
  • 青岛 网站制作公司乐从网站制作
  • wordpress 微网站模板怎么用wordpress 文档下载
  • ppt网站建设的目的合肥做网站找哪家好
  • wordpress站点路径redis缓存wordpress
  • 专门设计网站的公司叫什么百度 门户网站
  • 网站建设丶金手指专业旅游网站系统哪个好
  • 苏州工业园区两学一做网站成都企业排名
  • 医药网站开发wordpress境外支付
  • 营销自己的网站网站如何做标题优化
  • 玖云建站系统wordpress nodejs版本
  • 网站开发费用计入什么二级科目重庆企业网站推广
  • wordpress 菜单怎么使用方法宜春网站推广优化
  • dede 网站图标怎么自学建筑设计
  • 河北斯皮尔网站建设做微信小程序和做网站
  • 沈阳市住房和城乡建设局网站创意上海专业网站建设
  • 免费学编程国内网站it需要什么学历
  • 相城做网站的公司网站建设范本