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

上海网站设计公司联系方式工业设计公司收费标准

上海网站设计公司联系方式,工业设计公司收费标准,WordPress订阅下载插件,设计一个手机网站平面多少钱1.开发背景 基于上一篇指引,成功创建并启动线程后,线程已经开始运行了,但是有时我们需要线程暂停运行,例如某个线程是控制 LED 闪灯的,如果现在需要让 LED 停止工作,单纯的关闭 LED 是没用的,因…

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.yayakq.cn/news/426583/

相关文章:

  • 圣弘建设股份有限公司网站wordpress 禁用版本
  • 网站访问拒绝网页关键词优化软件
  • 贵阳网站建设方案策划wordpress 网膜
  • 温州网站建设选择乐云seo东莞浩智网站建设公司
  • 网站建设模板下载福田网站建设哪家便宜
  • 域名访问网站南宁网站建设公司排名
  • 025网站建设网站设计公司圣辉友联
  • 精通网站建设电子档品牌推广软文
  • 长沙岳麓区网站开发个人网站是请人做还是自己编写好
  • 个网站做淘宝客推广可以吗网页设计代码是怎么加链接
  • 优质的中小型网站建设建设飞鹰摩托车官方网站
  • 一个网站多少钱?中国建设银行网站下载
  • 装饰网站方案旅游网站模板 手机
  • vs做的网站案例济南做网站优化
  • 济南外贸网站制作深圳的网站建设
  • 为什么要做手机网站开发外贸怎样做网站
  • 重庆网站设计平台设计官网需要留言吗
  • 开发一套网站价格学校网站建设方案论文
  • 如何做拍卖网站WordPress快速入门视频
  • 电商网站开发文献汇总网站建设仟首选金手指
  • php做彩票网站吗南京公司网页制作
  • 网站建设硬件架构设计做爰全过程免费视频网站
  • 申请备案网站首页在哪家网站做淘宝客最好
  • 怎么做网站自动响应增加wordpress阅读量
  • 网站制作运营公司组建网站需多少钱
  • 建网站郑州如何开发小程序商城
  • 江苏建设科技网站二建报考条件
  • php网站开发流程逻辑将wordpress主题改为插件
  • 烟台城乡建设学校96级给排水网站wordpress 删除rss
  • 网站手机版跳转代码国外自助建站系统