嵌入式开发:周期调度和代码执行时间理解

2023-05-16

已剪辑自: https://mp.weixin.qq.com/s/gaT7D1IgkBxxEOj-DNaLPw

汽车嵌入开发中,我们常常听到这样的名词:1ms Task、5ms Task、10ms Task…试问:"1ms Task是说这个任务要执行1ms吗?"本文,带着这个疑问,展开讨论。

程序员按照需求,负责写代码,这些代码最终被CPU执行,进而控制执行器,以此达到预期功能。如果想要达到预期功能,对应的功能代码就要被CPU执行,多长时间执行一次呢?:这取决于具体的功能。比如:收音机开启检测功能,此功能对应一段代码(eg:Check_AF_Switch())。驾驶员想要打开车载收音机,触发动作10s以后,收音机打开可以吗?:可以,但是,驾驶员的体验会非常不好。所以,对于打开车载收音机的检测就应设计一个合理的检测周期,以便于及时捕获驾驶员的意图。假设:10ms周期检测驾驶员是否有打开车载收音机的请求,那这10ms如何理解呢?:10ms就是收音机开启与否的检测频率,在这10ms的时间内,CPU要完整执行一次Check_AF_Switch()代码。所以,代码开发中,往往会将Check_AF_Switch()这段代码放到10ms Task中,即:让Check_AF_Switch()这段代码每10ms执行一次。

那么,Check_AF_Switch()这段代码执行时间等于10ms吗?:显然不是。10ms,是CPU去执行Check_AF_Switch()这段代码的频率,并不是Check_AF_Switch()这段代码执行一次所要花费的时间,实际上,Check_AF_Switch()这段代码执行一次花费的时间要远远低于10ms(eg:100ns)。Check_AF_Switch()调度频率与执行时间示意如下所示:

图片

(一)CPU时钟周期与指令执行时间理解

我们知道,高级语言代码(eg:C语言)汇编后,变成一个一个汇编指令(注意:不同架构的单片机,汇编指令不同),一个汇编指令具体需要多少个CPU时钟周期,在芯片的用户手册中会有说明。比如:Aurix单片机的指令,需要的指令时钟周期,示例如下:

图片

eg:ADD指令,需要一个CPU Clock即可完成。如果CPU的主频为300MHz,意味着ADD指令仅需要1 / 300000000 ≈ 3.33ns即可完成。我们对CPU执行一个指令花费的时间有了一定认知,也就能认识到:CPU执行一段代码,实际花费的时间并不多。假设:Check_AF_Switch()有100行代码,汇编后有200个指令,每个指令需要1个CPU Clock,则Check_AF_Switch()代码执行一次,需要耗费200*3.33≈666ns,都不到1us,所以,相对于一个10ms的Task,Check_AF_Switch()这段代码执行的时间是极小的。

既然CPU执行速度很快,一个Task的代码量有限,那么,CPU执行完一次Task中的代码,下一次执行时间还没到,CPU在干啥呢?:“偷懒”。假设:CPU仅有一个10ms周期性Task,Task中代码执行需要2ms,这意味着CPU有8ms时间可以去"偷懒"。既然偷懒,就别让人看到,去空闲Task呆着去,这也就是工程上常说的Idle Task(空闲任务,优先级最低)或者Background Loop(背景loop),示意如下:

图片

(三)如何理解CPU使用率和CPU负载

在汽车嵌入式开发中,我们往往会关注一个参数:CPU负载。CPU负载和CPU使用率有什么不同呢?假设:系统只有一个CPU,也就是单核处理器,这个CPU仅需要处理一个10ms周期的Task,执行这个Task中的代码需要花费2ms,则CPU有效使用率就是20%,这和我们常说的CPU负载有什么关系呢?:个人理解,工程中常说的CPU负载应该是这里的CPU使用率。真正的CPU负载又怎么理解呢?假设:一个CPU分配了3个Task:

  • 20ms Task1,优先级最低,对应代码完整执行一次需要6ms;
  • 5ms Task2,优先级中等,对应代码完整执行一次需要1ms(下图中的10应该是5);
  • 5ms Task3,优先级最高,对应代码完整执行一次需要3ms。

三者使用CPU的关系如下所示:

图片

如上图,Task1并不能在20ms时间内,完整执行一次对应的代码,虽然此期间,CPU一直在干活(CPU使用率100%)。由于Task1的优先级最低,在执行Task1程序期间,不断地被Task2和Task3抢占,因此,CPU要完整的执行一次Task1中的代码,至少需要26ms。而这26ms地时间内,Task2、Task3中代码,均按照预期,完整地执行了6次。提示:工程开发中,除了Task之间的抢占,中断也会抢占Task。

当出现上述工况时,CPU的负载率>1。如何理解CPU负载率>1呢?举一个例子:一个5座小汽车,最多可以承载5人,如果超过5人乘车,小汽车则无法承载,即:小汽车的负载>1。类比CPU,如果让CPU处理上述的Task2、Task3,CPU游刃有余,还可以"偷懒",此时,CPU的负载率<1。当CPU同时处理Task1、Task2、Task3时,即使CPU一直不停的工作(CPU使用率100%),也无法在Task1规定的期限内(20ms),有效的将Task1中的任务,完整的执行一次,此时,CPU的负载>1。

所以,CPU负载<1,是CPU可以有序处理Task的前提,CPU负载和CPU使用率是两个概念。也就是说,CPU使用率≤100%,也可以有效的处理任务,但是,CPU负载>1,则不能按照预期处理Task。

2、Task超时引发的工程问题

(一)问题描述

在某Task中增加一段复杂代码后,此Task中的软件定时器失准,具体表现:时间明明过了1s,软件定时器只计时0.5s。

(二)原因分析

在Task中,增加复杂代码以后,意味着此Task的代码执行时间更长。此Task被高优先级任务/中断服务打断的概率增加。假设:增加复杂代码所在Task为Task1,Task1、Task2、Task3属性同上,三者使用CPU的工况如下:

图片

如上图,设计中,每20ms,预期Task1中的计数器加1,而实际上,需要经过26ms,计数器才能加1,进而软件计数器失准。为什么Task1会被频繁的抢占呢?:工程中,Task有优先级,高优先级Task会抢占低优先级Task,同时,中断可以打断任何Task,所以,当Task的优先级较低时,被打断的频率会大大增加。(三)解决测试解决措施可根据实际情况选择:

  1. 优化算法,减少复杂代码运行时间,降低所在Task被打断或者抢占次数;
  2. 如果算法要求的执行频率不高,可将算法放到周期更长的Task中,比如:100ms
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式开发:周期调度和代码执行时间理解 的相关文章

  • 怎么做串口调试软件?

    嗯 说一下我自己写的串口助手吧 xff0c 名字叫 Bittly xff0c 样子呢长下面这个样子 Bittly 指令调试界面 1 需求确认 一开始使用的是类似于XCOM或者SSCOM之类的串口调试助手 xff0c 他们的优点是体积小 xf
  • 【需求专题】如何写好需求——INCOSE需求编写指南(1)

    已剪辑自 https mp weixin qq com s Z5VBTyV6j07JylDdOsFSxQ 编者按 如何写好需求是INCOSE 需求工作组编写的需求文本化表达指南 本指南是专门讲述如何在系统工程中对需求进行文本化表达 xff0
  • 怎么提高自己的系统设计和架构理论水平?

    文章目录 前言 1 无锁化 1 1 串行无锁 1 2 结构无锁 2 零拷贝 2 1 内存映射 2 2 零拷贝 3 序列化 3 1 分类 3 2 性能指标 3 3 选型考量 4 池子化 4 1 内存池 4 2 线程池 4 3 连接池 4 4
  • 30+男生程序员中年如何破局

    已剪辑自 https zhuanlan zhihu com p 596751971 1 最顶级的程序员根据自己的经验拼paper 拼专利 xff0c 成为不可替代的专家 最厉害的程序员拼的不是代码写的多牛逼 而是有多少paper多少顶尖专利
  • 为啥AI难落地?

    总在说AI落地难 xff0c 那为啥难落地 xff1f 以最典型的智慧城市业务来说 xff0c 就是接入网络摄像头 xff0c 然后识别里面的人 xff0c 判断是不是抽烟 打架 闯红灯 不带安全帽等 首先是连接网络摄像机 xff0c GB
  • 搞技术,如何写好技术文档?

    已剪辑自 https mp weixin qq com s OtSwtMyeifoc7ED35a vEA 嵌入式方案设计文档 xff0c 到底应该怎么写 xff1f 你是不是从来没有想过这个问题 xff1f 很多技术人自己非常轻视技术文档的
  • 用125行C语言编写一个简单的16位虚拟机

    已剪辑自 https mp weixin qq com s ikrpGtssoKpumHXhrQdh8Q 博文地址 xff1a 改博文用图文代码的方式详细描述了实现的具体过程 xff0c 包含每一条指令的含义 系统虚拟机 xff0c 可完全
  • RT-Thread操作系统的FreeRTOS兼容层

    已剪辑自 https mp weixin qq com s 2BjJyieMr97NQhO76DQ3hw Github地址 https github com RT Thread packages FreeRTOS Wrapper 本项目是2
  • 嵌入式开发既要代码小,又想速度快,该如何优化?

    已剪辑自 https mp weixin qq com s HaoPN0upS8OEheXpSHWBFA 素材来源 xff1a 网络素材 整理 xff1a 技术让梦想更伟大 李肖遥 对程序进行优化 xff0c 通常是指优化程序代码或程序执行
  • 小白学C语言编程(for语句无限制循环)

    问题 xff1a 怎么样无限制输出一个比1大的数 xff1f span class token macro property span class token directive keyword include span span clas
  • 嵌入式开发打印,我放弃了printf

    已剪辑自 https mp weixin qq com s GGZ38dUITlS6w9hnMbzsvg 对于printf xff0c 相信不用我过多介绍 xff0c 大家在初学C语言时用得最多的信息输出接口函数应该就是printf了 对于
  • 自动驾仿真测试平台干货内容梳理

    已剪辑自 https mp weixin qq com s Ftv2rgiGW6FGVQgMz4A9PQ 1 自动驾驶仿真平台的关键构成 自动驾驶仿真平台需支持车辆动力学仿真 环境感知传感器仿真 交通场景仿真等 xff1b 车辆动力学仿真
  • 自动驾驶域控制器开发和量产的挑战

    已剪辑自 https mp weixin qq com s Sh4ONJxrmvDbfWlcDnXYtQ 过去十多年的汽车智能化和信息化发展产生了一个显著结果就是ECU芯片使用量越来越多 从传统的引擎控制系统 安全气囊 防抱死系统 电动助力
  • STM32属于哈佛结构还是冯诺依曼结构?

    现代的CPU基本上归为冯诺伊曼结构 xff08 也称普林斯顿结构 xff09 和哈佛结构 我们常见的X86架构是冯 诺依曼结构 xff0c 而ARM架构是哈佛结构 一个广泛用于桌面端 xff08 台式 笔记本 服务器 工作站等 xff09
  • 2022年度复盘和2023年目标:在焦虑中探索,在体验中成长,在开放中升华

    文章目录 2022年度复盘工作 xff1a 焦虑 xff0c 认知 xff0c 提升个人工作 xff1a 工作态度需要提升团队工作 xff1a 尊重 真诚 准确清晰完善感悟 个人成长硬能力 xff1a 学习 博客软能力 xff1a 知乎 B
  • 技术部门Leader是不是一定要技术大牛担任?

    现在在腾讯做技术Leader xff0c 之前在阿里 xff0c 绿厂也带过技术团队 xff0c 每家的情况有共同点也有区别 现在总结下来 xff0c 除去特别通用的技术 责任心 沟通 主动性这些 xff0c 作为Leader很关键的个人素
  • 一个人该怎样找到自己真正热爱和擅长的事,并以此规划自己的人生?

    文章目录 一个人该怎样找到自己真正热爱和擅长的事 xff0c 并以此规划自己的人生 xff1f 一 有关擅长的4个错误认知 二 做好这3步 xff0c 拥有擅长之事 1 生成兴趣清单 2 缩小选择范围 3 练练看 三 写在最后 下面这张图
  • 一个适用于单片机的开源网络协议栈

    已剪辑自 https mp weixin qq com s Vpi4E9T5BUo cdCE692V A 移植及使用说明 协议栈支持主流的ARM Cortex系列MCU xff0c 支持Keil MDK IAR等常见IDE 移植的核心工作就
  • 嵌入式软件分层隔离的典范

    已剪辑自 https mp weixin qq com s T7EJEAuXo1CCJa5vPAPVvg 引言 xff1a 嵌入式软件开发分层 模块化是理想状态 xff0c 实际开发中因各种限制而有所取舍 xff0c 但这不妨碍学习参考优秀
  • 软件定时器库

    前后台系统和多任务操作系统 xff0c 在简单功能上差别不大 xff0c 唯一不顺手的就是前后台系统没有合适的软件定时器 封装一层软件定时器接口 xff0c 对后续功能开发事半功倍 定义结构体数组 xff0c 其基础成员如下 xff1a s

随机推荐

  • 解决Raspberry系统ssh默认关闭的问题

    问题描述 xff1a 最近 xff0c 自己动手给树莓派3B安装了一个最新的系统 xff0c 本想通过SSH远程登录系统的时候 xff0c 发现登录不了 xff0c 具体表现为能ping通 xff0c 但是Xshell就是连不上 xff0c
  • mbedtls 库基础及其应用

    文章目录 1 引言1 1 为什么要加密1 2 SSL TLS协议的历史 2 SSL TLS演化2 1 明文时代2 2 对称加密时代2 3 非对称加密时代2 4 公证时代2 5 TLS协议时代2 6 TLS的应用 3 mbedtls3 1 软
  • 动态内存管理及防御性编程

    概述 xff1a C语言的优势是可以直接访问内存地址 xff0c 也就是指针操作 xff0c 但其缺陷也是因为直接内存访问 如何通过防御性编程提前发现问题 xff0c 尽可能减少内存异常产生的后果 xff0c 就是本文的重点 1 内存划分
  • 基于RTOS的软件开发理论

    文章目录 1 RTOS的特点2 任务设计2 1 任务的特性2 2 任务划分的方法2 2 1 设备依赖性任务2 2 2 关键任务2 2 3 紧迫任务2 2 4 数据处理任务2 2 5 触发条件相同的任务2 2 6 运行周期相同的任务2 2 7
  • 面向对象类之间主要的几种关系

    已剪辑自 https mp weixin qq com s ClBuraVUIPhnWceI7m78Xg 嵌入式开发虽然平时C语言用的比较多 xff0c 但面向对象的思维应该是每一位嵌入式软件工程师必备的知识 之前给大家分享过用C语言实现面
  • 世界上最健康的程序员作息表!

    文章目录 7 307 30 8 008 00 8 308 30 9 009 3010 3011 0013 0014 30 15 3016 0017 00 19 0019 3021 4523 0023 30时间 健康的小常识 已剪辑自 htt
  • 30岁了,冒死说几句大实话!

    已剪辑自 https mp weixin qq com s j0yzonrhPPcemDRF6QBVkw 是的 xff0c 我 30 岁了 xff0c 还是周岁 就在这上个周末 xff0c 我度过了自己 30 岁的生日 都说三十而立 xff
  • QT使用QAxObject读取Excel教程-全网最全

    文章目录 一 背景二 介绍基本操作方法获取对象调用动态方法设置和获取属性更多相关 三 使用要求添加模块与excel com连接的方法Excel基本操作 四 具体使用说明五 项目实战实战项目1实战项目2实战项目3实战项目4实战项目5 封装好的
  • 超越内卷-认知差、信息差、时间差

    已剪辑自 https mp weixin qq com s 9pzMQJJnp9ZbkTCVe ao7w 内卷的话题曾经聊过 xff0c 当大家的努力都上不了层次 xff0c 只是原水平重复竞争 xff0c 那么内卷就开始了 最近对这个问题
  • 数十种嵌入式 C 语言代码优化的经验和方法

    文章目录 简介声明哪里需要使用这些方法 xff1f 整形数除法和取余数合并除法和取余数通过2的幂次进行除法和取余数取模的一种替代方法使用数组下标全局变量使用别名变量的生命周期分割变量类型局部变量指针指针链条件执行布尔表达式和范围检查布尔表达
  • 汽车电子国际标准现状与趋势

    已剪辑自 https mp weixin qq com s vLgnrFPtDPglwde1TZUHSQ 在汽车电子系统发展的早期 xff0c 汽车电子基础软件是没有统一标准的 xff0c 各个 OEM Tier1 Tier2 等厂商针对不
  • Linux多线程服务器编程(陈硕)学习总结

    这本书确实是学习多核时代采用现代C 43 43 编写多线程程序的好书 xff0c 下面是学习总结 xff1a 第一章 线程安全的对象生命期管理 对象的创建很简单 xff0c 但是不要在构造期间泄漏this指针 xff0c 比如不要在构造函数
  • 详解 Modbus 通信协议(清晰易懂)

    文章目录 已剪辑自 https mp weixin qq com s dvo1l1GgJ2DtIHnPK5E1tA 本文总结关于 Modbus 相关的知识 xff0c 浅显易懂 xff0c 旨在对 Modbus 有一个很直观的了解 如有错误
  • RTOS应用中的几种调度策略

    从前后台架构的软件开发过渡到使用实时操作系统 RTOS 可能是一项困难的工作 但使用RTOS有许多优势 xff0c 例如简化应用集成 xff0c 支持任务抢占调度 xff0c 当开发人员使用复杂的32位微控制器 xff0c 且可以获取足够的
  • 几款非常棒的使用文本来进行图形化注释的工具

    https mp weixin qq com s NX8feH UPE7oegM7U9W4GA 说明 xff1a 1 程序代码里面非常好的注释方式 2 相关网站 xff1a xff08 1 xff09 https metacpan org
  • 解决Excel打开UTF-8编码CSV文件乱码的问题

    最近在用QT读写CSV文件 xff0c 发现将数据写入到CSV文件中 xff0c 使用记事本打开文件是正常的 xff0c 使用Excel打开 xff0c 中文是乱码的 xff0c 下面把原因和解决方法记录一下 问题产生的原因 为什么exce
  • Windows下查看端口占用情况

    编程的时候经常发现我们需要使用的端口被别的程序占用 xff0c 这个时候需要清楚查看是哪个程序占用了端口 xff0c 用且清除了这个进程 xff01 1 开始 gt 运行 gt cmd xff0c 或者是window 43 R组合键 xff
  • 【C进阶】同事用void把我给秀翻了!

    2 简单认识一下void 今天跟大家介绍的知识是C语言中的void关键字的用法 xff0c void在大部分小伙伴的程序中都只是用于函数无参数传入 xff0c 或者无类型返回 然而我们平时所定义的变量都会有具体的类型 xff0c int x
  • 如何降低代码圈复杂度

    已剪辑自 https mp weixin qq com s biz 61 MzI2MTE4Nzk5MA 3D 3D amp mid 61 2247483685 amp idx 61 1 amp sn 61 26072d6a41ed9abef
  • 嵌入式开发:周期调度和代码执行时间理解

    已剪辑自 https mp weixin qq com s gaT7D1IgkBxxEOj DNaLPw 汽车嵌入开发中 xff0c 我们常常听到这样的名词 xff1a 1ms Task 5ms Task 10ms Task 试问 xff1