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

想建设一个网站在线网站优化公司

想建设一个网站,在线网站优化公司,用阳寿做交易的网站,网站升级每天自动更新1.开发背景 基于上一篇指引#xff0c;成功创建并启动线程后#xff0c;线程已经开始运行了#xff0c;但是有时我们需要线程暂停运行#xff0c;例如某个线程是控制 LED 闪灯的#xff0c;如果现在需要让 LED 停止工作#xff0c;单纯的关闭 LED 是没用的#xff0c;因…1.开发背景 基于上一篇指引成功创建并启动线程后线程已经开始运行了但是有时我们需要线程暂停运行例如某个线程是控制 LED 闪灯的如果现在需要让 LED 停止工作单纯的关闭 LED 是没用的因为下一时刻线程可能就会重新打开 LED 导致程序没有达到预期所以线程引入了一个挂起的状态如下图FreeRTOS 引入了线程的多个状态。 其中包含 Running、Ready、Suspended、Blocked 等状态。 Running即运行态是成功获取了 CPU 使用权的线程。 Ready即准备态单核 CPU 在同一时刻只能做一件事情所以如果当前有其他线程获取了 CPU 的使用权一般是高优先级线程这个时候等待运行的线程就是准备态。 Suspended即挂起态正如上文说到的如果我们想让某个线程暂时停止工作就可以挂起对应线程被挂起的线程就是挂起态。 Blocked即阻塞态因为线程存在高低优先级如果高优先级线程一直运行会导致低优先级线程一直抢占不到 CPU 的使用权如果使用挂起的方式去挂起高优先级线程那么高优先级线程的实时性就会大打折扣所以就引入了阻塞的概念高优先级线程可以一直阻塞在某个事件在阻塞期间会让出 CPU 的使用权但是一旦高优先级线程满足指定事件就会立刻抢占低优先级线程的 CPU 使用权这样就保证了高优先级线程的实时性。 上述纯粹个人理解如有误请见谅可以参考链接FreeRTOS task states and state transitions described 2.开发需求 挂起、恢复和删除已有线程 3.开发环境 window10 MDK STM32F429 FreeRTOS10.3.1 4.实现步骤 4.1 线程挂起其他线程 1创建控制线程和 2 个测试线程 /* 测试初始化 */ void aTest_Init(void) {/* 创建动态任务 */xTaskCreate(TaskCtrl, TaskCtrl, 500, NULL, 5, p-taskCtrl);/* 共用一个任务函数 创建多个任务 */static char whichTask[TASK_LIST_SIZE][3] {0};for (int i 0; i TASK_LIST_SIZE; i){snprintf(whichTask[i], 2, %d, i);xTaskCreate(TaskList, TaskList, 500, (void*)whichTask[i], 5, p-taskList[i]);} } 2测试线程循环打印 /* 动态任务组 */ static void TaskList(void *pvParameters) {int count 0;int whichTask atoi(pvParameters);Log_Debug(%s [%d]\r\n, __func__, whichTask);for ( ; ; ){vTaskDelay(1000);Log_Debug(%s [%d] count %d\r\n, __func__, whichTask, count);} } 3控制线程间断挂起和恢复使用 vTaskSuspend 挂起线程vTaskResume 恢复线程。 /* 动态任务 */ static void TaskCtrl(void *pvParameters) {Log_Debug(%s\r\n, __func__);/* 挂起线程 0 */vTaskDelay(3000);vTaskSuspend(p-taskList[0]);vTaskDelay(3000);vTaskResume(p-taskList[0]);for ( ; ; ){vTaskDelay(1000);} } 4测试结果 如图所示可以看出线程0 中间有 3 个周期是停止工作的。 4.2 线程挂起线程本身 1基于上面试验的基础上修改测试线程为打印日志后挂起自身这里做这个试验是为了验证 vTaskSuspend 如果传入参数为 NULL即指向线程本身。 /* 动态任务组 */ static void TaskList(void *pvParameters) {int count 0;int whichTask atoi(pvParameters);Log_Debug(%s [%d]\r\n, __func__, whichTask);for ( ; ; ){vTaskDelay(1000);Log_Debug(%s [%d] count %d\r\n, __func__, whichTask, count);vTaskSuspend(NULL);} } 2控制线程只需定期恢复线程即可 /* 动态任务 */ static void TaskCtrl(void *pvParameters) {Log_Debug(%s\r\n, __func__);/* 挂起线程 0 */vTaskDelay(3000);vTaskResume(p-taskList[0]);for ( ; ; ){vTaskDelay(1000);} } 3测试结果 如图所示测试线程执行了一次就挂起了本身控制线程间隔 3s 之后唤醒了一次测试线程0 4源码解析 vTaskSuspend - prvGetTCBFromHandle /** Several functions take an TaskHandle_t parameter that can optionally be NULL,* where NULL is used to indicate that the handle of the currently executing* task should be used in place of the parameter. This macro simply checks to* see if the parameter is NULL and returns a pointer to the appropriate TCB.*/ #define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) NULL ) ? pxCurrentTCB : ( pxHandle ) )如源码所示如果传入指针为空即获取当前控制块 pxCurrentTCB 4.3 中断中恢复线程 1基于上面的实验使用中断来代替控制线程来恢复已挂起的测试线程 /* Key2 PC13 Key0 PH3 Key1 PH2 */ void Exti13_TriggerInterrupt(void) {if (mspGpio_GetInput(PC13) 0){Log_Debug(%s 按键执行测试线程0 恢复\r\n, __func__);BaseType_t xYieldRequired;xYieldRequired xTaskResumeFromISR(p-taskList[0]);portYIELD_FROM_ISR(xYieldRequired);mspExti_Close(13);} } 在中断中使用 FreeRTOS 接口需要带 FromISR 后缀的如 xTaskResumeFromISR需要portYIELD_FROM_ISR 切换上下文否则实时性会收到一定的影响为了调试和演示方便在中断中打印了数据在实际项目中切记不要在中断中停留特别是打印等高延时操作。 2测试结果 如图所示在中断中恢复已经挂起的线程也是可以的。 4.4 线程删除 1线程删除后会释放内存由于现在的线程都是在系统堆栈动态开辟的所以线程删除后内存会回归系统内存堆栈。 /* 动态任务 */ static void TaskCtrl(void *pvParameters) {Log_Debug(%s\r\n, __func__);/* 挂起线程 0 */vTaskDelay(3000);Log_Info(FreeRTOS Remain Space %d Bytes\r\n, xPortGetFreeHeapSize());vTaskDelete(p-taskList[0]);Log_Info(Delete Task0 And FreeRTOS Remain Space %d Bytes\r\n, xPortGetFreeHeapSize());vTaskDelete(p-taskList[1]);Log_Info(Delete Task1 And FreeRTOS Remain Space %d Bytes\r\n, xPortGetFreeHeapSize());for ( ; ; ){vTaskDelay(1000); // Log_Debug(%s\r\n, __func__);} }2测试结果 如图所示删除2个任务后系统内存由 49472Bytes - 51584Bytes - 53696Bytes
http://www.w-s-a.com/news/388539/

相关文章:

  • 网站建设属于技术开发吗网页制作团队
  • 做家常菜的网站哪个好哪个网站做图片外链
  • 眼科医院网站设计怎么做6深圳宝安是什么风险等级
  • 网站制作容易吗logo免费生成网站
  • 建设厅官方网站下载专区网络托管公司
  • 祥云平台官方网站网线制作实验原理
  • 把网站做成app的软件下载国外做兼职的网站有哪些
  • 网站建设 海豚弯专业的网站开发服务商
  • 那个网站有免费模板中国家装公司十大排名
  • 中铁建设集团有限公司门户网站余杭区建设规划局网站
  • 天猫网站建设的目标是什么做网站常见问题模板
  • 做php网站需要什么软件天津建设网官方网站
  • 南漳网站开发上海网站推广方法
  • 深圳seo网站大连旅顺房价
  • dede网站 地图什么做有没有做黑市网站
  • 做网站参考文献域名如何做网站
  • 怎么选择网站开发英文网站建设用途
  • 怎样做电子商务网站织梦生成手机网站
  • 公司网站建设选什么服务器网站里怎样添加关键词
  • 深圳建设局网站深业中城绿化项目营销型网站开发流程包括
  • 找销售的网站九江市建设项目服务中心
  • 东原ARC网站建设公司合肥seo网站推广外包
  • 那个网站是做房产中介的网站制作软件小学
  • 做网页怎么建站点视频解析网站
  • 做网站的系统设计网站设计论文前言
  • 做外贸网站多久更新汕头市建设局网站首页
  • 如何建设专业化的网站手机管理网站模板
  • 花生壳做网站如何用腾讯云做网站
  • 搭建集团网站开发app需要哪些软件
  • 网站建设 中企动力福州阀门wordpress 多说评论