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

手机网站布局国外可以用什么网站做问卷

手机网站布局,国外可以用什么网站做问卷,南宁中考招生信息网,旅游网页前言 本文在前面文章的基础上实现了延时列表#xff0c;取消了 TCB 中的延时参数。 本文是对野火 RTOS 教程的笔记#xff0c;融入了笔者的理解#xff0c;代码大部分来自野火。 一、如何更高效地查找延时到期的任务 1. 朴素方式 在本文之前#xff0c;我们使用了一种朴…前言 本文在前面文章的基础上实现了延时列表取消了 TCB 中的延时参数。 本文是对野火 RTOS 教程的笔记融入了笔者的理解代码大部分来自野火。 一、如何更高效地查找延时到期的任务 1. 朴素方式 在本文之前我们使用了一种朴素的思想进行延时任务的查找 在 TCB 中设置一个延时参数需要延时的时候进行初始化将延时任务挂起清除就绪优先级位 uxTopReadyPriority当 SysTick 中断时扫描就绪列表中每个 TCB如果延时参数不为 0 就减 1如果延时参数被减到 0就置对应的就绪优先级位 uxTopReadyPriority然后进行任务切换 可以看到上面这种想法非常朴素但是每次 SysTick 中断的时候都需要扫描一遍就绪列表中的所有任务当任务多的时候耗时将会很多。 2. 更高效的方式 设置除就绪列表外的另一个列表——延时列表当任务要进入延时的时候将延时到期的值设置为节点的排序值根据排序值按升序插入延时列表中然后将该任务从就绪列表中删除同时更新下一个任务的解锁时刻的变量 xNextTaskUnblockTime这个变量的意思是当系统时基计数器 xTickCount 的值与 xNextTaskUnblockTime 相等时就表示有任务延时到期了需要将该任务就绪 可以看到FreeRTOS 用这种方式避免了扫描所有任务的延时这点是优于 RT-Thread 和 μC/OS 的。 实际上有两个延时列表这是为了解决延时时间溢出的问题。 如图 二、代码详解 我们添加或修改以下的代码 两条延时列表的定义和初始化下一任务到期时间点变量的定义及初始化修改延时函数延时时将任务从就绪列表中删除并添加到延时列表修改时基计数器中断每次计时时查看是否有任务到期 还有一些辅助的函数主要是解决当计时溢出或者延时溢出时两条延时列表的切换 切换当前延时列表指针和溢出延时列表指针函数更新任务到期时间点变量的函数 1. 延时列表的定义及初始化 ① 定义 定义了两个任务延时列表当系统时基计数器xTickCount 没有溢出时用一条列表当 xTickCount 溢出后用另外一条列表pxDelayedTaskList 指向 xTickCount 没有溢出时使用的那条列表pxOverflowDelayedTaskList 指向 xTickCount 溢出时使用的那条列表 //延时列表 static List_t xDelayedTaskList1; static List_t xDelayedTaskList2; //延时列表指针用于切换 static List_t * volatile pxDelayedTaskList; static List_t * volatile pxOverflowDelayedTaskList;② 初始化 /* 初始化任务相关的列表 */ void prvInitialiseTaskLists( void ) {UBaseType_t uxPriority;//就绪列表初始化for( uxPriority ( UBaseType_t ) 0U; uxPriority ( UBaseType_t ) configMAX_PRIORITIES; uxPriority ){vListInitialise( ( pxReadyTasksLists[ uxPriority ] ) ); //初始化每个就绪列表}//延时列表初始化vListInitialise( xDelayedTaskList1 );vListInitialise( xDelayedTaskList2 );pxDelayedTaskList xDelayedTaskList1;pxOverflowDelayedTaskList xDelayedTaskList2; }2. 下一任务到期时间点变量的定义和初始化 xNextTaskUnblockTime 用于表示下一个任务的解锁时刻xNextTaskUnblockTime xTickCount xTicksToDelay当前时间 延时时间当系统时基计数器 xTickCount 的值与 xNextTaskUnblockTime 相等时就表示有任务延时到期了需要将该任务就绪 ① 定义 //下一个延时任务到期的时间 static volatile TickType_t xNextTaskUnblockTime ( TickType_t ) 0U;② 初始化 在 vTaskStartScheduler 任务调度器函数中初始化为 portMAX_DELAYportMAX_DELAY 是一个 portmacro.h 中定义的宏默认为 0xffffffffUL #define portMAX_DELAY ( TickType_t ) 0xffffffffULvoid vTaskStartScheduler( void ) { /*创建空闲任务start*/ TCB_t *pxIdleTaskTCBBuffer NULL;StackType_t *pxIdleTaskStackBuffer NULL;uint32_t ulIdleTaskStackSize;/* 获取空闲任务的内存任务栈和任务TCB */vApplicationGetIdleTaskMemory( pxIdleTaskTCBBuffer, pxIdleTaskStackBuffer, ulIdleTaskStackSize ); xIdleTaskHandle xTaskCreateStatic( (TaskFunction_t)prvIdleTask, /* 任务入口 */(char *)IDLE, /* 任务名称字符串形式 */(uint32_t)ulIdleTaskStackSize , /* 任务栈大小单位为字 */(void *) NULL, /* 任务形参 */(UBaseType_t) tskIDLE_PRIORITY, /* 任务优先级数值越大优先级越高 */(StackType_t *)pxIdleTaskStackBuffer, /* 任务栈起始地址 */(TCB_t *)pxIdleTaskTCBBuffer ); /* 任务控制块 */ /*创建空闲任务end*/ xNextTaskUnblockTime portMAX_DELAY;xTickCount ( TickType_t ) 0U;/* 启动调度器 */if( xPortStartScheduler() ! pdFALSE ){/* 调度器启动成功则不会返回即不会来到这里 */} }3. 延时函数的修改 任务调用延时函数时将任务从就绪列表中转移到延时列表中 void vTaskDelay( const TickType_t xTicksToDelay ) {TCB_t *pxTCB NULL;/* 获取当前任务的TCB */pxTCB pxCurrentTCB;/* 将任务插入到延时列表 */prvAddCurrentTaskToDelayedList( xTicksToDelay );/* 任务切换 */taskYIELD(); }任务插入延时列表使用 prvAddCurrentTaskToDelayedList()这个函数除了插入操作还处理了延时溢出的情况笔者画了个流程图方便大家理解 //将任务插入到延时列表 static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait ) {TickType_t xTimeToWake;/* 获取系统时基计数器xTickCount的值 */const TickType_t xConstTickCount xTickCount;/* 将任务从就绪列表中移除 */if( uxListRemove( ( pxCurrentTCB-xStateListItem ) ) ( UBaseType_t ) 0 ){/* 将任务在优先级位图中对应的位清除 */portRESET_READY_PRIORITY( pxCurrentTCB-uxPriority, uxTopReadyPriority );}/* 计算延时到期时系统时基计数器xTickCount的值是多少 */xTimeToWake xConstTickCount xTicksToWait;/* 将延时到期的值设置为节点的排序值 */listSET_LIST_ITEM_VALUE( ( pxCurrentTCB-xStateListItem ), xTimeToWake );/* 溢出 */if( xTimeToWake xConstTickCount ){vListInsert( pxOverflowDelayedTaskList, ( pxCurrentTCB-xStateListItem ) );}else /* 没有溢出 */{vListInsert( pxDelayedTaskList, ( pxCurrentTCB-xStateListItem ) );/* 更新下一个任务解锁时刻变量xNextTaskUnblockTime的值 */if( xTimeToWake xNextTaskUnblockTime ){xNextTaskUnblockTime xTimeToWake;}} }4. 修改时基计数器中断 修改时基计数器中断每次计时时查看是否有任务到期并且处理时基计数器溢出情况函数流程图如下 函数代码如下 //系统时基计数 void xTaskIncrementTick( void ) {TCB_t * pxTCB;TickType_t xItemValue;//系统时基计数 1const 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 );}}}/* xConstTickCount xNextTaskUnblockTime *//* 任务切换 */portYIELD(); }5. 交换非溢出延时指针和溢出延时指针 使用一个中间变量进行交换切换延时列表后记得更新 xNextTaskUnblockTime 的值 /* * 当系统时基计数器溢出的时候延时列表pxDelayedTaskList 和* pxOverflowDelayedTaskList要互相切换*/ #define taskSWITCH_DELAYED_LISTS()\ {\List_t *pxTemp;\pxTemp pxDelayedTaskList;\pxDelayedTaskList pxOverflowDelayedTaskList;\pxOverflowDelayedTaskList pxTemp;\xNumOfOverflows;\prvResetNextTaskUnblockTime();\ }6. 更新任务到期时间点变量的函数 函数流程图 函数代码 //重新设置变量xNextTaskUnblockTime的值 static void prvResetNextTaskUnblockTime( void ) {TCB_t *pxTCB; // 定义一个指向TCB_t类型的指针变量pxTCBif( listLIST_IS_EMPTY( pxDelayedTaskList ) ! pdFALSE ){/* 新的延时任务列表为空。将xNextTaskUnblockTime设置为最大可能值以确保在延时列表中有任务项之前if( xTickCount xNextTaskUnblockTime )的测试不会通过。 */xNextTaskUnblockTime portMAX_DELAY;}else{/* 新的延时任务列表不为空获取延时列表头部任务的值。这个值表示了延时列表头部任务应该从阻塞状态中解除的时间。 */( pxTCB ) ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );xNextTaskUnblockTime listGET_LIST_ITEM_VALUE( ( ( pxTCB )-xStateListItem ) );} }后记 如果您觉得本文写得不错可以点个赞激励一下作者 如果您发现本文的问题欢迎在评论区或者私信共同探讨 共勉
http://www.w-s-a.com/news/751725/

相关文章:

  • 手机建网站网店logo设计图片免费
  • 装修网站有哪些wordpress外网访问错误
  • 个人做电影网站服务器放国外安全吗建设通app
  • 西安公司网站开发快站官网平台
  • 北京网站设计公司哪个好网站开发属于哪个部门
  • 现在海外做的比较好一点的网站网站报价书
  • 做整站优化漳州建网站
  • jsp网站建设期末作业搜索引擎优化的定义是什么
  • 网站建设一级页面二级页面WordPress托管如果使用插件
  • 网站导航栏设计代码织梦做泰文网站
  • 网站建设的定位是什么南通网站定制费用
  • 怎么seo网站推广能免费观看所有电视剧的app
  • 大学网站建设做网站的用什么软件呢
  • 网站建设建设公司哪家好seo网站优化推广
  • 网站服务器组建网站案例上海
  • 盘锦949公社最新招聘优化大师免费版
  • 国外有哪些网站是做弱电的中国国家培训网正规吗
  • 30分钟网站建设教程视频全屋整装120平米的多少钱
  • 生成链接的网站aso优化平台
  • 策划网站建设方案电商扶贫网站建设
  • 网站策划建设方法企业网站建设问题研究
  • 昆明专业网站建设的公司帮别人制作wordpress赚钱吗
  • 高校校园网站建设天水市建设局网站公告
  • 北京网站建设需要花多少钱企业建设网站的目的是
  • 网站模板 免费百度seo优化招聘
  • 过年做那些网站能致富怎样免费建立自己网站
  • 网站去哪里备案长沙网络推广
  • 企业网站规划书vue适合什么样的网站开发
  • 个人网站备案名字网站设计的提案
  • 网站自己做还是找人做常州钟楼区邹区建设局网站