实用的嵌入式编码技巧:第三部分
每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。
这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间;其他人则需要少一个数量级。
图9.1:建立和保持时间
如果我们倾向于编织,我们将尊重这些参数,并且触发器将始终是完全可预测的。但是,当区域同步时(例如,腕部以其自己的速度旋转,并且只要需要数据,该软件便会读取数据),这很可能会违反设置或保持时间。
假设触发器需要3纳秒的设置时间。我们的数据在该窗口内发生变化,可能在时钟转换之前翻转状态一纳秒。该设备将进入稳态,其输出确实变得非常奇怪。
通过违反规范,设备实际上不知道我们表示的是零还是一。它的输出不是逻辑状态,而是半电平(在数字规范之间),或者会振荡,在状态之间疯狂地切换。触发器是亚稳态的。
图9.2:亚稳态
这种疯狂不会持续很长时间。通常在几秒到50纳秒后,振荡衰减或半态消失,使输出保持有效的1或0。但是是哪一个?这是一个数字系统,我们期望一个为1,并将零为零。
输出是随机的。 那个,那个 您无法预测它将采用的级别。这肯定使设计可预测的数字系统变得困难!
硬件人员认为随机输出不是问题。由于输入几乎在时钟选通的同一时间发生变化,因此零或一是合理的。无论如何,如果我们只是在先发制人或落后,我们将获得不同的价值。从哲学上讲,谁知道我们测量的状态?这真的很重要吗?也许不影响EE,但这将在很大程度上影响我们的软件,我们将很快看到。
仅当时钟和数据几乎同时到达时才发生亚稳态。随着时钟频率的飙升,赔率增加。同样重要的因素是所使用的逻辑组件的类型:较慢的逻辑(如74HCxx)比较快的器件(例如74FCTxx)具有更宽的亚稳态窗口。
显然,以适当的速率,两个异步信号及时到位足以引起亚稳态的可能性很低,可测量,是的,很重要。在使用10 MHz时钟和10KHz数据速率的情况下,使用典型但并非十分快速的逻辑,亚稳态错误大约每分钟发生一次。尽管很少见,但没有可靠的系统可以承受该故障率。
经典的亚稳态修正使用串联的两个触发器。它的输出馈入第二个的数据输入。两者都使用相同的时钟输入。两个时钟后,第二个触发器的输出将是“正确的”,因为两个背对背发生的亚稳态事件的几率几乎为零。使用两个触发器,合理的数据速率误差相隔数百万甚至数十亿年,对于大多数系统来说已经足够了。
但是,“正确”意味着第二阶段的输出将无可挑剔:它没有振荡,也没有处于非法电压电平。该值处于两种法律状态的机会仍然相等。
固件,而不是硬件
据我所知,没有关于亚稳性如何影响软件的文献,但它对构建可靠的系统却构成了真正的威胁。
嵌入式开发工程师使用所述的两阶段触发器自鸣得意地解决了他们的亚稳性问题。它们的域是单个位的域,其输入几乎在时钟转换的同一时间改变。用这么狭义的思想思考,接受触发器产生的固有随机输出确实是合理的。
但是,我们的嵌入式开发工程师正在读取并行的I / O端口,每个端口可能都是8位宽。这意味着输入捕捉寄存器中有8个触发器,它们均由相同的时钟脉冲驱动。
让我们看看会发生什么。编码器从0xff变为0x100。这种小的差异可能只是角度的微小变化。我们要求在数据改变的几乎同一时间读取数据,我们的输入操作会选通捕捉寄存器的时钟,从而会破坏建立时间或保持时间。
每个输入位都会变化,寄存器中的每个触发器都将变为亚稳态。短时间后,振荡消失,但寄存器中的每个位都是随机的。尽管硬件人员可能耸耸肩并抱怨没有人知道正确的值,但是由于时钟的到来,一切都发生了变化,实际上数据大约是0xf表示0x100。例如,0x12的随机结果是荒谬的,是完全不可接受的,并且可能导致疯狂的系统行为。
数据从0xff变为0x100的情况是病理性的,因为每个位都立即更改。每当许多位更改时,系统都会面临相同的风险。0x0f至0x10。0x1f至0x20。不变的高位数据始终会正确锁存,但每个变化位都有风险。
为什么不使用多重触发器解决方案?串联连接两个输入捕捉寄存器,它们均由同一时钟驱动。尽管这将消除非法的逻辑状态和振荡,但第二级的输出也将是随机的。
一种选择是忽略亚稳态,并希望获得最好的结果。或使用建立时间/保持时间窗口非常窄的快速逻辑来减少故障几率。如果代码很少在输入中进行采样,则有可能将亚稳定性降低到几百万甚至数十亿的机会。建立安全关键系统?感觉很幸运?
可以构建一个同步器电路,该电路接收从处理器读取的请求,并将其与I / O设备的可用数据位组合在一起,并以数据OK信号响应返回到CPU,这是不平凡的,并且容易出错。
一种替代方法是对I / O设备使用不同的编码方案。例如,购买带有格雷码输出的编码器(如果可以找到的话)。格雷码是一种计数方案,其中数字之间只有一个位更改,如下所示:
0 000
1 001
2 011
3 010
4 110
5 111
6 101
7 100
只有当您的代码读取设备的速度比可能更改的速度快,并且更改以相当可预测的方式发生(例如递增计数)时,格雷码才有意义。那么,如果输入变为亚稳态,那么只有一位是错误的,那么读取之间的变化就不会超过一个位。结果仍然是合理的。
另一种解决方案是在捕获寄存器之前计算输入数据的奇偶校验或校验和。也将其锁存到寄存器中。如果有错误,请执行代码计算奇偶校验并将其与该读取进行比较,然后再进行一次读取。
尽管我已经讨论过添加输入捕获寄存器,但是请不要以为这是问题的根本原因。没有那个寄存器-如果您仅将异步输入直接输入到CPU中-很有可能会违反处理器的固有设置/保持时间。
没有免费的午餐,所有逻辑都有我们必须遵守的身体限制。有些设计永远不会出现亚稳性问题。它总是防止违反设置或保持时间,而这又源于不良的设计或异步输入。
当时钟和数据在时间上不相关时,到目前为止,所有讨论都围绕异步输入展开。警惕任何不属于处理器时钟的东西。中断是问题的根源。
如果是由某人按下按钮引起的,请确保中断本身以及矢量生成逻辑不会违反处理器的建立和保持时间。
但是,在计算机系统中,大多数事情确实是同步发生的。如果您正在读取一个以CPU时钟为基础的计时器,则它与代码本身是同步的。从亚稳定性的角度来看,这是完全安全的。
但是,不良的设计会困扰任何电子系统。每个逻辑组件都需要花费时间来传播数据。当信号经过许多设备时,延迟可能会显着增加。如果数据随后进行分配,则延迟很可能导致输入与时钟同时转换。即时亚稳。
但是,嵌入式开发工程师非常小心,避免出现这些情况。请注意FPGA和其他组件的延迟,延迟取决于软件如何路由设备。此外,当锁存数据或为计数器计时时,通过使用错误的时钟沿不难引起亚稳性问题。拾取使设备有时间在读取之前稳定的边缘。
那模拟输入呢?将一个12位A / D转换器连接到两个8位端口,我们似乎会遇到类似的问题:模拟数据会遍历整个状态,在读取两个端口的过程中会发生变化。
但是,不需要输入捕获寄存器,因为转换器本身通常包括一个“采样和保持”模块,该模块在A / D数字化时存储模拟信号。然后,大多数A / D都会存储数字值,直到我们开始下一次转换为止。
我们所有使用的其他输入都会遇到这个问题。假设机器人使用10位编码器监视腕关节的角度位置,当腕部旋转时,编码器会发回10位宽的二进制代码,以表示关节的当前位置。一个8位处理器需要两个不同的I / O指令(两个字节宽的读取)才能获取数据。无论计算机速度有多快,读取之间的时间间隔都是有限的,在此期间编码器数据可能会更改。
手腕在旋转。“ get_position”例程从位置数据的下部读取0xff。然后,在下一条指令之前,编码器将翻转到0x100。“ get_position”读取数据的大部分(现在为0x1)并返回0x1ff的位置,显然是错误的,甚至可能是不可能的。
这是一个常见的问题,需要处理两轴控制器的输入,如果在读取过程中硬件继续移动,则X和Ydata会略有不相关,可能无法得到结果。
一位朋友追踪了一种罕见的自动驾驶仪故障,该故障是代码读取磁通门罗盘的方式,该罗盘的输出是一对相关的正交信号。在船只继续移动的同时,在不同的时间读取它们,无法获得航向数据。嵌入式开发工程师
相关文章:
实用的嵌入式编码技巧:第三部分
每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。 这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间;其他人则需要少一个数量…...
8个很棒的Vue开发技巧
1.路由参数解耦 通常在组件中使用路由参数,大多数人会做以下事情。 export default { methods: {getParamsId() {return this.$route.params.id} } } 在组件中使用 $route 会导致与其相应路由的高度耦合,通过将其限制为某些 URL 来限制组件的灵活性。…...
Python - 小玩意 - 文字转语音
import pyttsx3 from tkinter import *def recognize_and_save():try:say pyttsx3.init()rate say.getProperty(rate) # 获取当前语速属性的值say.setProperty(rate, rate - 20) # 设置语速属性为当前语速减20text text_var.get()# 语音识别say.say(text)say.runAndWait()…...
聚焦数据库和新兴硬件的技术合力 中科驭数受邀分享基于DPU的数据库异构加速方案
随着新型硬件成本逐渐降低,充分利用新兴硬件资源提升数据库性能是未来数据库发展的重要方向之一,SIGMOD、VLDB、CICE数据库顶会上出现越来越多新兴硬件的论文和专题。在需求侧,随着数据量暴增和实时性的要求越来越高,数据库围绕处…...
哨兵模式(sentinel)
为什么需要哨兵模式 redis的主从复制模式能够缓解“读压力”,但是存在两个明显问题。 主节点发生故障,进行主节点切换的过程比较复杂,需要人工参与,导致故障恢复时间无法保障主节点通过主从复制模式将读压力分散出去,…...
b站老王 自动驾驶决策规划学习记录(十二)
自动驾驶之速度规划详解:SL与ST迭代 上一讲:b站老王 自动驾驶决策规划学习记录(十一) 接着上一讲学习记录b站老王对自动驾驶规划系列的讲解 参考视频: 自动驾驶决策规划算法第二章第七节(上) 速度规划详解:SL与ST迭代…...
服务器租用机房机房的类型应该如何选择
服务器租用机房机房的类型应该如何选择 1.单电信机房 单电信服务器机房业务模式比较固定,访问量也不是很大,适合新闻类网站或政务类网站。如果网站的PV流量持续增加,建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。 2.双线…...
大数据运维一些常见批量操作命令
大数据运维中,批量操作是一项常见的任务。在使用flume进行数据采集的过程中,有时会出现故障导致采集停止,此时积累了大量的文件。如果想要将这些文件迁移到新的目录,直接使用"mv"命令可能会因为文件数目过多而报错。为了…...
测试人职场生存必须避开的5个陷阱
在互联网职场的工作发展道路上,软件测试人员其实在公司中也面临着各种各样的职场陷阱,有些可能是因为项目业务不熟练造成的,有些可能是自身技术能力不足导致的...等等。软件测试入门相对来说比较容易些,但是想要在测试行业长久发展…...
力扣538 补9.18
538.把二叉搜索树转换为累加树 可以做,主要还是分类讨论并找规律。 当前结点如果是左节点的话,root.valroot.valpre.valdfs(root.right); 如果是右结点的话, root.valpre.val-preval-dfs(root.left); 都和前一个结点有关系,如…...
[Linux入门]---Linux编译器gcc/g++使用
文章目录 1.背景知识2.gcc如何完成编译运行工作预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)链接(生成可执行文件) 3.函数库动态库静态库动静态库的区别 4.gcc选项 1.…...
[Git入门]---gitee注册及代码提交
文章目录 1.Gitee是什么2.gitee注册3.git工具及图形化界面工具安装4.gitee仓库创建5.进行本地仓库与远端gitee仓库的链接6.git三板斧addcommitpush 7.gitee提交代码常见问题 1.Gitee是什么 gitee是基于git代码托管和研发协作的国内平台,在上面可以托管个人或公司代…...
企业架构LNMP学习笔记46
PHP测试连接代码: php代码测试使用memcached: 示例代码: <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…...
ELFK之zookeeper+kafka
目录 kafkazookeeper的系统架构 Zookeeper 一、zookeeper概述 二、zookeeper特点 三、zookeeper选举机制 四、应用场景 五、zookeeper实验实例 Kafka 一、概述 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 Kafka 定义 二、Kafka 的特性 三、Ka…...
ECharts
ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的…...
jsoup框架技术文档--java爬虫--架构体系
阿丹: 在学习以及认知使用一个新技术之前一定要搞清楚有关框架的架构体系。了解一下该技术的底层会对后面编写代码以及寻找报错都是很有用处的,前期做的铺垫多一点,后期开发的时候就很方便。 jsoup框架的关键组件 JSoup框架的关键组件主要包…...
OpenStack创建云主机并连接CRT
文章目录 OpenStackT版创建云主机并连接CRT命令行操作(1)创建镜像(2)创建实例(3)创建网络创建内网创建外网 (4)创建安全组(5)创建路由(6ÿ…...
linux-sed命令
目录 1.linux-shell sed获取某一段字符串 2.linux-shell shell脚本中 sed -n取出某一行赋给一个变量 3.linux-shell sed查询某一行 1.linux-shell sed获取某一段字符串 如果要获取的是某一段字符串,可以在 sed 命令中使用正则表达式来指定需要获取的字符串。例如…...
Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?
Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 矢量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库…...
JOSEF约瑟 剩余电流继电器PFR-5 PFE-W-20 国产化改造ZLR-G81 ZCT-45
系列型号: PFR-003剩余电流继电器 PFR-03剩余电流继电器 PFR-5剩余电流继电器 PFR-W-105互感器 PFR-W-140互感器 PFR-W-20互感器 PFR-W-210互感器 PFR-W-30互感器 PFR-W-35互感器 PFR-W-70互感器 一、用途 PFR剩余电流继电器(以下简称继电器…...
分别用Python和Go实现对文件夹及其子文件夹里的文件进行批量重命名
文章目录 问题阐述上代码结果如何 问题阐述 最近在继续提高自己的go技术时,从网上一些平台获取到了一些学习资料,然后下载到本地后,文件的命名是真的像衣托答辩: 除了上述的文件,还有一mol多神奇的命名,害…...
redis深度历险 千帆竞发 —— 分布式锁
分布式应用进行逻辑处理时经常会遇到并发问题。 比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个…...
C#根据中文首字母排序
第一种方式: 这种方式会受制于服务器的区域和语言设置。 1.首先添加一个排序类ChineseNameComparer public class ChineseNameComparer : IComparer<string> {public int Compare(string x, string y){if (x null || y null)return 0;var xFirstChar x.Su…...
仪表基础知识培训
压力传感器:E+H PMX5x/FMX5x 一、安装:安装注意事项: 1、水平安装时仪表的呼吸孔(1)需要向下安装,并远离污染物。 2、请勿用坚硬的物体擦拭或接触膜片。 3、请勿安装在水泵的入口和搅拌叶附近 二、供电、接线、信号、:二线制,仪表输出4-20mA 三、量程:设置最大最小量程…...
无涯教程-JavaScript - PI函数
描述 PI函数返回数字3.14159265358979,数学常数pi,精确到15位数字。 语法 PI ()争论 PI函数语法没有参数。 适用性 Excel 2007,Excel 2010,Excel 2013,Excel 2016 Example JavaScript 中的 PI函数 - 无涯教程网无涯教程网提供描述PI函数返回数字3.14159265358979,数学常…...
前端防抖和节流
前端防抖和节流 概述 防抖: 防止抖动,个人字面理解此处防的不是页面的抖动,而是用户手抖。为了防止用户快速且频繁的触发事件而导致多次执行事件函数,这样的场景有很多,比如监听滚动、鼠标移动事件onmousemove、频繁…...
[pai-diffusion]pai的easynlp的clip模型训练
EasyNLP带你玩转CLIP图文检索 - 知乎作者:熊兮、章捷、岑鸣、临在导读随着自媒体的不断发展,多种模态数据例如图像、文本、语音、视频等不断增长,创造了互联网上丰富多彩的世界。为了准确建模用户的多模态内容,跨模态检索是跨模态…...
期权如何交易?期权如何做模拟交易?
买卖期权的第一步就是要有期权账户,国内的期权品种有商品期权和ETF期权以及股指期权,每种的开户方式和要求都不同,下文为大家介绍期权如何交易?期权如何做模拟交易? 一、期权交易需要开立一个期权账户,可以…...
【新书推荐】大模型赛道如何实现华丽的弯道超车 —— 《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》
文章目录 大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率,降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署01 通过数据抽象化统一数据孤岛02 …...
Calendar对象获取当前周的bug
项目场景: 双周项目管理,需要获取当前周为一年之中的第几周,原先的代码是用Calendar对象,先用setTime()把当前时间传入,再用get(3)获取一年中的第几周 问题描述 实际发…...
越南国家建设部网站/正规淘宝代运营去哪里找
本文首发于政采云前端团队博客:五分钟看懂 Nginx 负载均衡https://www.zoo.team/article/nginx前言对于电商平台而言,随着业务的不断发展壮大,网站访问量和数据量也随之急剧增长,该情况的产生给服务器带来了一定的负担。从用户体验…...
可以免费做商业网站的cms/网上怎么发布广告
混迹网络并且喜欢在线视频的朋友,作为一名“豆粉”,相信对“土豆网”的视频播客不会陌生,尽管在线观看非常方便,但也不得不面临播放不够流畅、视频短片上传分享比较麻烦、想把片子的对白提取出来随时收听困难等问题,其…...
永久免费网站建设/长沙网站优化排名推广
关注"无线技术联盟"提供有价值的物联网市场信息和最新的技术分析利用Python爬取了蓝牙联盟上近一年BQB认证公司的清单,把爬到的有价值的东西写出来分享给大家。1蓝牙认证产品如果配备了蓝牙功能且要在产品外观上注明蓝牙的标识在国际市场上流通࿰…...
怎样给公司产品做网站/百度一下 官方网
Java运算符 优先级 运算符的优先级决定了存在多个运算符时一个表达式各部分的运算顺序。Java 对运算顺序作出了特别的规定。其中,最简单的规则就是乘法和除法在加法和减法之前完成。程序员经常都会忘记其他优先级规则,所以应该用括号明确规定运算顺序。…...
建设网站费用入会计分录/做抖音seo排名软件是否合法
面试中经常碰到要创建链表的题目,今天做个小总结: 1.创建链表(头插法) 该程序完成了建立个各节点的链表,并将链表数据初始化为整数的程序,且该链表为无头结点的链表,代码如下: #include <math.h> ty…...
长宁区网站建设设计话色/培训心得简短200字
某查查app sign研究 从上次抓取某查查app数据之后,一直有一个问题 昨天一个偶然机会,得到某查查的sign算法,并未进行脱壳和逆向,是使用js的方式找到相关算法,虽然是js找得到的 关于token的破解:其实某查查的…...