实用的嵌入式编码技巧:第四部分

news2024/11/17 8:38:13

嵌入式工程师详细的结构模式分析甚至确定了系统将如何振动,从而避免了残酷的发射阶段引起的破坏性共振。尽管他们创建的产品可以在恶劣且经常未知的环境中工作,但他们的详细计算却描述了系统的运行方式。

想想土木工程师。今天,没有人不做数学就架起一座桥梁。支撑薄薄的舞蹈之路的那条细腻的电缆只是在起作用。期。计算证明了承包商开始浇筑混凝土的时间。

飞机设计师还使用定量方法来预测性能。您最后一次听说不会飞的新飞机设计是什么时候?然而,机翼的形状很复杂,并且极难采用分析方法。在缺乏适当理论的情况下,工程师们依赖于数十年来风洞实验获得的大量表格。在弯曲金属之前,工程师仍然可以理解其产品的工作原理。

将此与我们的领域进行比较。尽管进行了数十年的研究,但是证明软件正确性的形式方法对于实际系统仍然不切实际。我们的嵌入式工程师在构建并测试之后,并没有真正的证据证明我们的产品能够正常工作。当我们选择一个CPU,时钟速度,内存大小时,我们押注我们的即席猜测就足够了,一年后,我们开始测试100,000多行代码。

经验在正确解决资源需求方面起着重要作用。通常,运气更加重要。但是,希望是我们的主要工具,而有了足够的英雄学知识,我们通常就能克服大多数挑战。

在我作为的职位上,研究了成千上万个项目,我认为仅由于使用不足的资源而造成的总失败率为10“ 15%。8051根本无法处理这些数据。PowerPC部分是一个不错的选择,但是该程序增长了两倍,是可用Flash的大小,并且采用新的成本模型,该产品不可行。

最近,我已经看到很多关于使我们的嵌入式系统更可预测的方法的文章,以确保它们对外部刺激足够快地做出反应,以确保过程按时完成。不知所措,没有实际有用的方法来计算可预测性。在大多数情况下,如果系统运行速度太慢,我们会构建系统并开始更改内容。

与航空航天和土木工程师相比,我们在黑暗中工作。异步活动改变程序流程时,很难预测行为。多任务处理和中断都会导致无法分析的问题。

USENET上的最新主题以及嵌入式工程师大会上的一些讨论都建议完全禁止中断!艾格斯(Iguess)认为,这确实导致了一个更易于分析的系统,但是这个解决方案使我感到非常激进。我已经建立了轮询系统。

更糟糕的是,必须在不使用多任务的情况下或多或少地并发处理几种不同的事情。两种情况下的软件始终都是一团糟。

大约20年前,我天真地建造了没有RTOS的钢测厚仪,后来又不得不穿上鞋拔钉子。发生了太多的异步事情,内联代码变得异常复杂。我仍在设法弄清楚向圣保罗解释那个特殊的罪过 彼得

一个特别令人烦恼的问题是确保系统将及时响应外部输入。我们如何保证中断能够被足够快地识别和处理以保持系统的可靠性?

让我们详细了解第一个要求:及时识别中断。看起来很简单。翻阅处理器的数据手册,您会发现一个称为“延迟”的规范,该规范始终以亚微秒级别列出(请参见下面的图9.3)。毫无疑问,脚注将延迟定义为发生中断与CPU暂停当前处理上下文之间的最长时间。这似乎是中断响应时间,但实际上并非如此。

图9.3:延迟是从中断信号出现直到ISR开始的时间

CPU供应商定义的等待时间从零(处理器准备好立即处理中断)到指定的最大时间不等,它是正在执行哪种指令的乘积。显然,在执行指令的中间更改上下文是个坏主意,因此处理器通常要等到当前指令完成后才能对中断输入进行采样。

现在,如果它正在执行一个简单的寄存器到寄存器的移动(可能只是一个时钟周期),则零等待状态的20 MHz处理器仅需50 ns。完全没有延迟。

其他说明要慢得多。乘法可能需要数十个时钟。读-修改-写指令(例如“增量存储器”)本质上也是关键。最大延迟数来自于这些最慢的指令。

许多CPU包含循环结构,这些结构可能要花费数百毫秒的时间。例如,由一条指令启动的块内存到内存传输可能会运行很长时间,从而使等待时间变得不明显。

我知道的所有处理器都将在这些长循环中间接受一个中断,以使中断响应合理。块移动将被挂起,但是将保留足够的上下文,以允许在ISR(中断服务程序)完成时恢复传输。

因此,数据表中的等待时间数据告诉我们处理器不能处理中断的最长时间。该编号对于固件工程师完全没有用。好的,如果您要构建一个极端周期计数,纳秒级的,灰白头发诱人的系统,那么也许300 ns的延迟时间确实是系统性能的关键部分。

对于我们其他人来说,真正的延迟(即中断响应的99%组成部分)不是来自CPU的工作,而是来自我们自己的软件设计。而且,我的朋友,在设计时很难预测。没有正式的方法,我们需要经验方法来管理延迟。

如果延迟是从获取中断到进入ISR之间的时间,那么肯定会发生大多数,因为我们已禁用了中断!这是因为我们编写了织补代码。即使中断几条C语句,中断也可能长达数百微秒,远远超过CPU供应商所引用的那几纳秒。

无论您多么仔细地构建应用程序,您都将经常关闭中断。实际上,即使是从不发出“ disableinterrupt”指令的代码也确实经常禁用它们。因为,每次硬件事件发出中断请求时,处理器本身都会执行自动禁用,直到您在ISR内部显式重新启用它们后,该禁用才会生效。结果,暴涨的等待时间就可以指望了。

当然,在许多处理器上,我们不会像更改优先级那样将中断关闭。在第5级收到68 K的中断将禁止该级别及更低级别的所有中断,直到我们的代码在ISR中明确启用它们为止。优先级较高的设备仍然可以运行,但是所有1到5级设备的等待时间都是无限的,直到代码执行该操作为止。

因此,在ISR中,尽快重新启用中断。在阅读代码时,我的“经验法则”之一是在返回之前可能启用的代码可能有缺陷。

我们大多数人都被教导将中断使能推迟到ISR结束。但这会延长延迟时间,这是无法接受的。所有其他中断(至少等于或低于该优先级)都将关闭,直到ISR完成。更好的方法是,进入例程,执行所有不可重入的操作(例如处理硬件),然后启用中断。运行带有中断的ISR的其余部分,该ISR管理可重入变量等。您将减少延迟并提高系统性能。

如果该中断可以重新调用自身,则可能需要更多堆栈空间。在设计合理且可重入的ISR中,这没有任何问题,但是堆栈会不断增长,直到所有待处理的中断得到处理为止。

延迟的第二大原因是过度使用disableinterrupts指令。当两个异步活动尝试同时访问它们时,共享资源(全局变量,硬件等)将导致不稳定的崩溃。

我们需要通过使所有此类访问保持原子性或通过限制一次访问单个任务来保持代码可重入。经典方法是禁用此类访问周围的中断。尽管是一种简单的解决方案,但它以增加延迟为代价。

收集您将需要的数据

那么系统的延迟是多少?你知道吗?为什么不?令人震惊的是,我们中的许多人都以“如果愚蠢的东西行之有效,就出货”的理念来构建系统。在我看来,为了正确开发和维护产品,必须理解某些关键参数。像,有没有可用的ROM空间?系统是否已加载20%。。。还是99%?最大延迟有多糟糕?

延迟很容易测量,有时这些测量会产生令人惊讶和可怕的结果。获得中断响应感觉的最简单方法可能是,通过在例程启动时将并行输出位切换为高电平的指令来对每个ISR进行检测。退出时将其拉低。将此位连接到示波器的一个输入,将另一输入连接到中断信号本身。

这个简单的设置所提供的信息量令人叹为观止。测量从发出中断直到并行位变高的时间。那就是等待时间,减去管理仪器位的开销。调整示波器的时基以将其测量到所需的任何精度水平。

该位保持高电平的时间是ISR的总执行时间。厌倦了猜测您的代码运行速度有多快?这是定量的,便宜的和准确的。在实际系统中,中断经常发生。延迟会根据其他情况而变化。

在存储模式下使用数字示波器。断言中断输入后,您将看到一个空白空间-这是此输入的最小系统延迟。然后会有哈希值,因为仪器位在相对于中断输入的不同时间变高,因此会产生模糊。这些代表延迟的变化。当模糊将自身分解为稳定的高电平时,这就是最大延迟。

所有这些,仅需花费一个未使用的并行位。

如果您有备用计时器通道,那么还有另一种方法既不需要额外的位,也不需要范围。构建ISR仅用于测量目的,以服务于计时器的中断。

初始化时,启动计时器递增计数,将其编程为在计数溢出时中断。让它尽可能快地计数。使ISR完全简单,开销最小。用汇编语言编写代码以减少不必要的代码是一件好事。太多的Ccompiler将所有内容推送到中断处理程序中。

ISR本身读取计时器的计数寄存器,然后将数字求和成一个长变量,可能称为total_time。还增加一个计数器(迭代)。清理并返回。

这里的窍门是,尽管定时器在抛出溢出中断时读取零,但即使CPU忙于准备调用ISR,定时器寄存器也继续计数。如果系统忙于处理另一个中断,或者可能停留在禁止中断的状态,则计数器将继续递增。

没有延迟的无限快速的CPU将以计数器寄存器等于0的方式启动仪器ISR。经常发生延迟问题的实时处理器会发现计数器处于某个非零值,该值指示系统停止执行其他操作的时间。

因此,平均等待时间就是累计到总时间(标准化为微秒)中的时间除以ISR运行的次数(迭代次数)。扩展想法以提供更多信息很容易。关于中断我们可能知道的最重要的事情是最长的延迟。添加几行代码以进行比较并记录最大时间。

方法完美吗?当然不是。数据有些统计,因此可能会遗漏单点外围事件。速度非常快的处理器可能比计时器的滴答速度快得多,以至于它们总是记录为零的延迟,尽管这可能表明从所有实际目的来看,延迟都足够短而不重要。

关键是,一旦我们了解了丢失中断的延迟原因,知识就是力量。

尝试在购买的软件组件上运行这些实验。运行于100 MHz 486上的嵌入式DOS产生的延迟只有几十毫秒!嵌入式工程师资料点击领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1084080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商家制作回收小程序有什么作用呢

商家制作回收小程序的作用主要体现在以下几个方面: 一、提升品牌形象 回收小程序是商家向外界展示自身社会责任感和环保意识的重要窗口。在当今社会,企业的环保形象日益受到消费者的关注,拥有一个专业、高效的回收小程序无疑可以让商家在消费…

想玩配音的小伙伴,赶快来试试这个款配音神器~

手机玩配音真的很方便,平时没事的时候直接打开就可以配音。而且手机上可以配音的软件都很简单,操作也不复杂,完成一个配音真的是分分钟的事。今天就给大家分享一款好玩又有趣的配音软件! 一、悦音配音,一款可以媲美真人…

uniapp 微信小程序 vue3.0+TS手写自定义封装步骤条(setup)

uniapp手写自定义步骤条&#xff08;setup&#xff09; 话不多说 先上效果图&#xff1a; setup.vue组件代码&#xff1a; <template><view class"stepBox"><viewclass"stepitem"v-for"(item, index) in stepList":key"i…

Python 之 sqrt函数浅析

一、函数介绍 Python中的sqrt( )函数。sqrt是square root的简写&#xff0c;用于求非负实数的平方根。 return sqrt(x) # x为非负实数函数定义&#xff08;位于math.py中&#xff09;&#xff1a; 二、函数使用 sqrt( )函数位于数学运算库math当中&#xff0c;使用前需要先…

latex如何对.pdf格式的图片实现裁剪

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在使用draw.io进行绘图&#xff0c;导出的时候不知道为什么周围会有留白&#xff0c;比如下图&#xff1a; 在导入latex的时候&#xff0c;会因为两侧的留白导致整张图片缩小。 如果直接进行裁剪.pdf&a…

TVS选型:瞬态抑制二极管选型!|深圳比创达EMC

提到TVS&#xff0c;大部分电子工程师基本都知道是用来端口防护的&#xff0c;防止端口瞬间的电压冲击造成后级电路的损坏。 一、工作原理 TVS即瞬态电压抑制器&#xff0c;又称雪崩击穿二极管。它是采用半导体工艺制成的单个PN结或多个 PN结集成的器件。TVS有单向与双向之分…

Print()函数用法实例详解

Print() 函数用于打印输出&#xff0c;是python中最常见的一个内置函数。其基本语法为 Print(value, sep’ ‘, end’\n’, filesys.stdout, flushFalse) 。因此可见&#xff0c;它主要由4个参数构成。 其中 sep (separate) 代表分隔符&#xff0c;默认为 ’ ’ 和 end ‘\n’…

vs中集成vcpkg

文章目录 安装vcpkg将vcpkg集成到vs中将vcpkg集成到项目中使用vcpkg安装boost库在项目中使用boost库 参考 VS2022 vcpkg 使用 Vcpkg包管理器的使用 安装vcpkg 从github上下载。 将vcpkg集成到vs中 命令说明vcpkg integrate install将所安装的包集成到VSvcpkg integrate rem…

10月11-12日上课内容 Ansible、

Ansible Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机。比…

3.2 学生-课程数据库

思维导图&#xff1a; 3.2 学生-课程数据库 **3.2 学生-课程数据库** 本节重点&#xff1a; - 通过学生-课程数据库例子&#xff0c;探讨SQL中的数据定义、数据操纵、数据查询和数据控制语句。 - 提到学生-课程模式S-T(具体可参考3.3.1小节中例3.1)。 - 介绍三个主要的表格。…

C++ 与复合数据类型:透过类理解结构体

文章目录 参考描述结构体概念结构体与类结构体还是类&#xff1f; 默认访问级别struct 与其默认访问级别class 与其默认访问级别 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTC Primer Plus &#xff08;第六版&#xff09;中…

做SEO要选择什么代理IP?2023最新综合指南

在 SEO 领域&#xff0c;代理IP在取得成功方面发挥着至关重要的作用。它们提供了一种隐藏您的 IP 地址并通过不同位置访问网络的方法&#xff0c;使您能够收集数据、分析竞争对手的策略并提高网站的可见性。在这篇博文中&#xff0c;我们将深入研究代理服务器的世界&#xff0c…

虚拟列表本质以及解决方式

前言 简述&#xff1a;虚拟列表是一种优化长列表渲染的技术&#xff0c;它可以在保持流畅性的同时&#xff0c;渲染大量的数据。在传统的列表渲染中&#xff0c;如果列表非常长&#xff0c;会导致渲染时间过长&#xff0c;页面卡顿&#xff0c;用户体验变得非常差。而虚拟列表…

AVL 树的初步认识与基本操作

历史 AVL 树是一种自平衡二叉搜索树&#xff0c;由托尔哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字&#xff1a;Adelson-Velsky 和 Landis&#xff0c;他们是苏联数学家&#xff0c;于 1962 年发表了一篇论文&#xff0c;详细介绍了 AVL 树的概念和…

nginx配置https 访问

nginx 解压目录有configure文件 [rootoracledb10 ~]# which nginx1、检查nginx是否包含http_ssl_module 模块 如果出现 --with-http_ssl_module 就是已经安装了[rootoracledb10 sbin]# pwd /usr/local/nginx/sbin [rootoracledb10 sbin]# nginx -V nginx version: nginx/1.23…

技术分享| 二进制部署MySQL

一、介绍 ​MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#x…

华为手环8全新炫酷表盘上线,这些免费表盘,你绝对不能错过

在现今忙碌的生活节奏中&#xff0c;保持身心健康已逐渐成为大众的共同追求。华为手环8以时尚的设计、轻巧的体积、精确的传感器、丰富的健康模式以及智慧生活的无缝拓展&#xff0c;成为了潮流先锋达人的理想之选。华为手环8还支持多种表盘样式&#xff0c;满足不同用户的个性…

Vue开发中Jwt的使用

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

ai智能语音机器人必须具备的功能

近年来&#xff0c;大多数互联网公司都进入了智能化领域。 随着人工智能技术的不断升级和突破&#xff0c;智能出境行业涌现出许多新品牌。 这些品牌有的以价格取胜&#xff0c;有的以产品性能取胜&#xff0c;这确实给消费者增加了很多选择。 ​ 然而&#xff0c;智能外呼产品…

【Java每日一题】——第二十八题:编程定义一个学生类汽车类Car(2023.10.12)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…