文源址:https://arxiv.org/abs/1606.02147
tensorflow github: https://github.com/kwotsin/TensorFlow-ENet
在移动端上进行实时的像素级分割十分重要。基于分割的深度神经网络中存在大量的浮点运算而且需要经过较长的时间才可以进行投入使用。该文提出的ENet目的是减少潜在的计算。ENet相比现存的分割网络,速度快18倍,参数量要少79倍,同时分割得到的准确率不有所损失,甚至有所提高。
目前,增强现实可穿戴设备,家庭智能设备,自动驾驶的兴起,迫切需要将语义分割(场景理解)算法移植到较低性能的移动端设备上。分割算法对图像中的每一个像素点进行类别标记。进来,较大的数据集与较强的计算资源(GPU,TPU)的出现促进了卷积神经网络超越传统的计算机视觉算法。尽管卷积网络在分类和识别任务取得较好的效果,但进行像素级分割时,仍生成较为粗糙的空间结果。因此,经常会在此算法基础上拼接其他算法来对结果进行增强,像基于颜色的分割,条件随机场等。
为了对图片进行空间分类和进行精细的分割,已经出现了像SegNet,FCN等网络结构,这些结构都是基于VGG-16的大型多分类网络。但其有大量的参数和长时间的推理时间。因此,这些网络并不适用于要求处理图片速度高于10fps的移动端或者电池供电的应用设备上。
该文所提出的网络结构主要应用于快速的推理与进行较高准确率的分割。
语义分割对于图片理解与寻找目标发挥着重要的作用。在增强现实与自动驾驶中,语义分割发挥着举足轻重的作用,此外,实时性的要求也是极高的。当下的计算机视觉应用普遍使用深度神经网络。场景分析较好的卷积网络使用两阶段网络结构:编码层和解码层。受自编码器的启发。编码-解码结构的网络在SegNet中出现并得到了改进。编码部分类似于VGG的卷积网络用于对输入进行分类,而解码部分主要用于对编码网络部分的输出进行上采样。但这些网络的一个重大缺点是数量巨大的参数延长了其推理时间。不同于FCN,在SegNet中,VGG16的全连接层被移除,为了减少其浮点操作和内存的占用。但SegNet这种轻量级的网络仍无法做到实时分割。
其他结构基于较简单的分类器后接CRF作为一个后处理的步骤。这些复杂的后处理操作经常无法标记一帧图片中较小的物体。CNN可以结合RNN来提高准确率,但无法解决速度消失的问题。但RNN可以作为一种后处理手段与任何其他技术进行结合。
ENet网络结构如下表格,该文参考ResNet,将其结构描述为一个主分支与一个带有卷积核的附加分支,最后进行像素级的相加融合。
ENet中的每个block如下图b所示,每个block包含有三个卷积层:一个1x1的映射用于减少维度,一个主卷积层,一个1x1的扩张。将BN层与PReLU层穿插其中,将此结构组合定义为bottleneck 模型。如果bottleneck为下采样,则在主分支上添加一个最大池化层,同时,bollteneck中第一个1x1的映射被一个大小为2x2,stride为2的卷积进行替换,对激活值进行padding操作,使其与feature map的尺寸相匹配。卷积大小为3x3的,类型有普通卷积,空洞卷积,及转置卷积等,有时,用1x5或者5x1的非对称卷积对其替换。对于正则化处理,在bottleneck2.0之前使用p=0.01,其他条件下使p=0.1。
ENet的初始部分包含单独的一个block。如上图a.第一阶段包含5个bottleneck部分。第二,三阶段结构相同,但第三阶段的开始处并未有下采样的过程。前三个阶段属于编码阶段。第四五阶段属于解码阶段。由于cuDNN使用分离的内核进行卷积与偏差项的计算,为了减少内核的调用与内存的占用,该网络并未使用偏差项,结果发现,准确率也并未受很大的影响。在每个卷积层与pReLU层之间添加了一层BN层。在解码网络部分,最大池化层,被最大上采样层代替,padding被无偏差项的空间卷积替换。ENet在最后一个上采样过程中并未使用最大池化的索引,因为输入图片的通道为3,而输出通道数为类别数,最终,用一个全卷积模型作为网络的最后模型,占用部分解码网络的处理时间。
Feature map的尺寸:语义分割中对图片进行下采样操作有两处缺点:
(1)feature map分辨率的减少意味着空间位置信息的损失,如准确的边界信息等。
(2)进行全像素的语义分割要求网络的输出大小要与输入的大小相同。这意味着对图片进行了下采样,就要进行形同程度的上采样。增加了模型的大小与计算资源。对于第一个问题,FCN通过添加编码层的feature map,SegNet通过保留编码网络中最大池化过程中最大值的索引,并借此在解码网络中生成稀疏的上采样maps。考虑到内存需要,该文使用SegNet的方式。同时,过分的下采样,十分不利于分割的准确率。
下采样的一个优点是:在下采样过的图片中进行卷积操作会有较大的感受野,从而可以获得更多的上下文信息。上下文信息十分利于不同类别的区分。该文发现使用空洞卷积的效果会更好。
Early downsampling: 要想实现较好的分割效果和实时的操作,要意识到处理较大的输入图片是十分消耗资源的。ENet的前两个block极大的减少了输入的尺寸,同时,只使用了一小部分feature map。由于可视化信息是高度空间冗余的,可以将其压缩为一种更有效的表达形式。网络的初始部分作用为特征提取及后续网络对输入的预处理。
解码尺寸大小:SegNet是一个极其对称的网络结构,ENet网络结构是非对称的,包含一个较大的编码层和一个小的解码网络。原因是编码层应该像原始分类网络的结构相似。用于处理较小的数据,同时进行信息的处理与滤波,解码网络对编码网络的输出进行上采样用于对细节的微调。
非线性操作:该文发现去掉网络初始层中的大部分ReLU层会提升分割的效果,作者认为此网络的深度不够深。然后,该文将所有ReLU替换为PReLUs,针对每张feature map增加了一个额外的参数。
信息保留的维度变化: 前半部分进行下采样是有必要的,但剧烈的维度衰减不利于信息的流动。为解决这个问题,该文任务在池化层后接一个卷积层增加了维度,进而增加了计算资源。为此,该文将池化操作与卷积操作进行并行操作,然后进行拼接。同时,在原始的ResNet的结构中,进行下采样时,第一个1x1的映射,在所有维度上进行的是步长为2的卷积,丢弃了75%左右的输入信息。将卷积核增加至2x2利于信息的保留。
分解卷积核: 一个二维的卷积可以被分解为两个维度为1的卷积核。(nxn=> nx1,1xn),该文使用5x1,1x5的非对称卷积,减弱了函数学习的过拟合同时增加了感受野。卷积核的分解带来的另一个好处是可以减少大量的参数。加上非线性处理,使计算功能更加丰富。
空洞卷积:该文将bottleneck中的卷积层替换为空洞卷积并进行串联,增大了感受野,提高了分割的IOU。
正则化:目前的分割数据集有限,因此网络的训练很容易达到过拟合。该文使用空间Dropout进行处理。
[1] Y. LeCun and Y. Bengio, “Convolutional networks for images, speech, and time series,” The handbook of brain theory and neural networks, pp. 255–258, 1998.
[2] A. Krizhevsky, I. Sutskever, and G. E. Hinton, “Imagenet classi?cation with deep convolutional neural networks,” in Advances in Neural Information Processing Systems 25, 2012, pp. 1097–1105.
[3] K. Simonyan and A. Zisserman, “Very deep convolutional networks for large-scale image recognition,” arXiv preprint arXiv:1409.1556, 2014.
对于MFB的类别权重预处理得到的分割结果:
作者:fourmi_gsj
原文链接:http://www.deepsmart.ai/297.html
微信交流联系:DeepSmart_AI
更多信息关注公众号:DeepSmartAI
于许多跨国公司来说,在中国开展业务意味着同时存在着巨大的机遇和挑战。
中国被称为世界工厂,为满足全球范围内商品和服务的需求,中国将生产的各类产品供给全球供应链。作为人口超过十亿的世界大国,中国毫无疑问是全球最大的消费市场之一。不论你是销售商还是生产商,如果你的公司立志为全球领导者,在中国开展业务是极为重要的一环。
在网络方面,跨国公司需要将公司现有的广域网延伸至中国,以支持本地业务的快速增长。如果你的公司属于汽车、制造、物流等行业,那么提高公司与中国地区的网络连接就非常重要,尤其对于使用Microsoft 365和Salesforce CRM等云服务、或是将中国境内的分支机构与客户骨干网络连接的公司。
与世界互联
对于跨国公司而言,其面临一个重大挑战就是如何应对中国网络安全法规。企业需要确保所有的网络接入和传输都符合中国的法律法规。
通常来说,大多数跨国公司在中国运营时会面临三种网络连接场景:
a)利用VPN网络连接站点和用户
例如,一家跨国公司在中国境内外都设有站点,并将其总部、分支机构与数据中心连接起来。大多数本地服务供应商可以提供基础设施运营,但无法提供连接中国境内与境外的站点或数据中心的之间的跨境VPN连接。这类的公司正在为跨境广域网(WAN)服务寻求具备集中管理、网络灵活性和自动化的方案。
b)分支机构网络节省之道: SD-WAN方案
企业希望降低昂贵的MPLS费用,并为非关键应用程序部署更经济的SD-WAN方案。跨国公司一般在中国境内外都有第三方站点连接(通常是托管在外部云环境中的SaaS服务),但第三方连接无法提供连接中国境内外站点和境外数据中心的跨境VPN。
c)在中国境内实现多云、混合IT平台的安全连接
尽管近年来中国的公共云使用量呈指数级增长,但对于将关键应用程序和数据进行托管的跨国公司来说,网络安全仍然是一个主要问题。企业希望通过在多云环境中实现集中管理,使混合广域网服务获得更佳的网络灵活性和自动操作能力。
总体来说,中国国内的互联网连接非常稳定,大多数中国网络服务供应商都能够提供稳定可靠的服务。但是按照现行的网络安全法规,在使用互联网和云服务时,与境外服务器连接的网络接入速度将会受到一定影响。这可能会导致部分公司的日常运营中出现数据丢包和访问延迟等情况。
SD-WAN时代,如何保证国内外业务通畅
为了解决这些问题,许多跨国公司通过SD-WAN方案,为中国之外的站点提供连接。通常情况下,使用轴辐式的网络模型,通过MPLS连接的VPN,允许通过充当中间传递的SD-WAN设备访问香港和内地站点的公司服务器。
还有一些公司只部署了MPLS,特别是那些在中国有分支工厂的公司。尽管比混合MPLS和SD-WAN方案的成本高得多,但通过基于MPLS的安全VPN传递数据可以避免出现网络覆盖不全、数据包丢失的情况,并避免违规。另一种策略是部署两条不同供应商的MPLS线路,以确保跨区域的连接。在备用方案上,许多跨国公司的中国分支机构在香港使用动态多点VPN集线器,通过Internet将业务数据路由到香港、美国、欧洲或其他地方。
2018年,中国监管部门颁布了新政策来规范VPN的使用,禁止非法连接,以保证互联网接入服务合法合规。虽然SD-WAN的使用率在迅速上升,但新政策还是一定程度上影响了部分跨国公司通过Internet部署SD-WAN服务的计划。
值得称赞的是,工信部竭尽全力确保新政策不会影响公司现有的VPN、SD-WAN和IP SEC服务。工信部强调,只要遵守中国相关的规章制度,就不会对企业的跨境业务造成干扰。很多跨国公司已寻求中国本地网络服务供应商的协助,以确保在新政下互联网接入100%合规,避免违规或造成误解。
保持合规:在中国安全经营
对于在中国境内运营并需要与国外数据中心建立连接的跨国公司而言,为确保分支机构网络合规。熟悉中国互联网的专业人士推荐以下准则:
总之,跨国公司想要进入中国市场并顺利开展业务,必须了解中国的网络安全法,并根据相关法律要求制定策略,以确保运营合法合规、业务100%正常运行。所以与了解中国市场的互联网服务合作伙伴一起,携手开拓市场,不失为最佳选择。
关于作者
胡淑仪 天维信通CBC副总裁-产品、方案和市场
关于CBC
CBC成立于2008年,由宽带资本等私募基金投资组建,是中国领先的托管网络服务提供商,具备完整资质,可为客户提供完整的下一代通信服务组合,帮助客户的海内外业务建立连接。CBC 为客户提供独特的服务组合,包括:裸光纤、波道、专线、IP VPN、IDC以及最新的SD-WAN和云服务。
CBC总部位于北京,在上海、苏州、香港、新加坡设立了分公司,在广州、深圳、天津、杭州、南京、武汉、成都、长沙设立了办公室,业务覆盖中国主要的商业区域。
成立12年来,CBC为全球制造、金融、保险、物流、供应链、贸易等行业的全球500强和国内外企业提供优质服务。CBC已获得TL9000、ISO9001、ISO20001、ISO27001等多项国际管理体系认证,在各业务领域为企业提供可靠、安全的服务。
1)非隔离DC-DC拓扑介绍
Buck型拓扑变换器
Buck型变换器的拓扑结构如图所示,Buck型变换器也称降压型电源拓扑。在开关管S导通时,二极管VD负极电压高于正极反偏截止,此时电流经过电感L向电容和负载供电,同时电感L中储存了能量。在开关管S关断时,电感L中储存的能量不能立即释放,产生的感应电流通过负载、二极管VD形成续流通路,继续给负载供电。该二极管也因此称为续流二极管。在降压型电源拓扑中,当驱动开关管的PWM占空比为D时,输出与输入满足的关系为:
Boost型拓扑变换器
Boost变换器基本拓扑结构如图所示。Boost变换器也称为升压型电源拓扑。当开关管S导通时,二极管正极电压低于负极电压反偏关断,电源和电感形成通路,电感L流过电流储存能量,此时负载由电容提供能量。当开关管S断开时,此时二极管正向导通,电源和电感L储存的能量同时向电容、负载供电。在升压型变换器中,当驱动开关管的控制信号占空比为D时,输出与输入满足关系为:
Buck-Boost型拓扑变换器
Buck-Boost变换器基本拓扑结构如图所示,Buck-Boost变换器也称为升降压型开关电源拓扑,。在开关管S导通时,二极管负极电压高于正极电压反偏截止,电源和电感形成通路,电感L储存能量。当开关管S关断时,二极管正向导通,电感电流不会立即释放与负载、二极管形成续流通路。但是,此时负载电压与输入电压极性相反。在Buck-Boost变换器中,当驱动开关管的控制信号的占空比为D时,输出与输入满足的关系为:
2)隔离式DC-DC拓扑介绍
正激式拓扑变换器
正激式变换器基本拓扑结构如图所示。将变压器放在降压型变换器的开关管和二极管之间就可以得到正激式的拓扑结构,变压器的原边和副边的隔离就使输入和输出隔离。正激时变换器因电路设计简单、经济便捷,在50W~400W的场合应用很广。但是由于变压器上所有线圈电流在开关管关断的时候,全部断开,为了保证变压器的磁芯不发生磁饱和现象,附加绕组W3的加入起到磁芯复位的功能。
当开关管S导通时,电源电压加到初级绕组W1上,根据N1、N2同名端的关系,此时初级绕组能量传递到次级绕组W2,VD1导通,电感L,电容C共同获得初级输入的能量。当开关管S关断时,W1中剩余能量通过辅助绕组W3返回到电源的输入,VD1截止,次级的电感L、 二极管VD2、负载形成续流通路。
在正激式变换器中特别注意开关S关断到下个周期开关S导通的时间内要使磁芯剩余的能量得到释放,否则在后续的时间内,该剩余的能量值不断的增加,最后达到磁芯所能承受的极限值而饱和。
反激式拓扑变换器
反激式变换器基本拓扑结构如图所示。在Buck-Boost型变换器中将高频变压器放在电感的位置就有了反激式的电路。反激式变换器设计非常容易,价格低廉,常常用在多路输出的小功率开关电源场合。
当开关管S导通时,电源电压加在初级绕组W1两端,根据N1、N2同名端的关系,绕组W2的高电位在下端,二极管VD1此时不导通。当开关S关断时, 绕组W2的高电位在上端,二极管VD1正向导通,负载获得能量。
推挽式拓扑变换器
推挽式变换器其拓扑结构如图所示。原边开关管S1、S2交替导通,变压器磁芯中的能量能够正常的储存和释放,从而将能量从原边向副边传递。
当开关S1导通,S2关断时,副边绕组二极管VD1导通,负载获得能量。当S2导通,S1关断时,副边二级管VD2导通,负载仍能获得能量。当开关管S1,S2都关断时,电感L通过二极管VD1、VD2和负载形成通路,根据并联分流,负载电流只有一半通过每个二极管,但此时开关管承受的电压均为。,所以为了保证开关管的电压应力不会过大,推挽式变换器用在低压大电流的场合具有一定的优势。
半桥拓扑变换器
半桥变换器其拓扑结构如图所示。一条桥臂由两个电容组成,另一条桥臂由两个功率开关管组成。在电路正常工作时,原边绕组在控制信号整个周期均有电流,磁芯的利用率得到提高。所以半桥变换器用在高电压、大功率的情况下比较有优势。
电容C1和C2容值、型号一致,则每个电容上的电压为。当开关S1导通S2关断时,二极管VD1导通,VD2截止,此时N21绕组向负载传递能量。当开关S1关断,S2导通时,二极管VD2导通,VD截止,此时N22绕组能向负载传递能量,即副边绕组N21和N22交替释放能量。
全桥拓扑变换器
全桥变换器其拓扑结构如图所示。四个开关管组成H桥电路,变压器原变绕组接在桥式电路的负载位置。当开关S1和S4导通,S2和S3关断时,初级绕组的高电位在上端。当开关S2和S3导通,S1和S4关断时,初级绕组的高电位在下端。因此,在一个周期内初绕组流过的电流方向相反,变压器不存在磁芯饱和问题,这也使得全桥变换器的效率和功率密度可以做的很高。全桥变换器的次级绕组带有一个中心抽头,输出采用全波整流的方式,因此适合应用在大功率的条件下。
各类型拓扑比较如下表所示:
隔离式DC-DC拓扑电路的比较
查看原文:https://www.dianyuan.com/eestar/article-8316.html
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法。
接着上篇文章 《MCUXpresso IDE下SDK工程导入与workspace管理机制》 接着聊,痞子衡说过不建议从零开始创建新工程项目,最好就是导入一个SDK里的现成项目(尽量跟你最终需求相近,主要是需要的SDK基础驱动都要包含),然后在这个项目基础上修改成自己想要的最终工程。
如果你是一个习惯于IAR或者MDK这种非Eclipse式集成开发环境的用户,你可能会对MCUXpresso IDE下管理工程(主要是在工程里增加源文件)的方式感到不适应。本文痞子衡将为你指明MCUXpresso IDE下增加源文件让你不适应的地方。
一、准备测试环境
上篇文章 《MCUXpresso IDE下SDK工程导入与workspace管理机制》 里我们导入了RT500的一个hello world项目进workspace空间,让我们将这个项目拷贝到如下自定义的路径,然后在MCUXpresso IDE下使用 Import project(s) from file system 方式并且不勾选 Copy projects into workspace 选项去打开自定义路径下的hello world工程。
为简单起见,我们再创建三组源文件:sw_delay1.c/h、sw_delay2.c/.h、sw_delay3.c/.h,我们会用这三组源文件来测试三种不同路径类型下添加源文件进工程的情况。
////////////////sw_delayx.c////////////////
#include "sw_delayx.h"
void sw_delayx(uint32_t n)
{
while (n !=0U)
{
n--;
}
}
////////////////sw_delayx.h////////////////
#include <stdint.h>
#if defined(__cplusplus)
extern "C" {
#endif
void sw_delayx(uint32_t n);
#if defined(__cplusplus)
}
#endif
二、已有路径下添加源文件进工程
第一种测试情况最简单,我们直接把sw_delay1.c/h文件放到\mcux_test\evkmimxrt595_hello_world\source\路径下,跟主函数源文件hello_world.c放在一起。当我们将新源文件放到已有路径下时,在MCUXpresso IDE工程里新文件就立刻显示在了界面左上角的workspace里(可以理解为直接被添加进工程了),根本不用你手动添加(这是跟IAR/MDK相比第一个不同的地方,也是你可能不适应的地方),这时候我们可以在主函数文件里直接引用和调用sw_delay1.c/h里的内容,不需要再额外做任何工程设置。
自动刷新工程路径下源文件进工程是Eclipse型IDE的特色,这个特色其实挺好,只有一种情况下不太方便,那就是多个不同源文件中均有相同函数定义(可能是测试目的,或者刻意保留不同版本函数实现),这种情况下在工程编译时会报错,需要在IDE里主动右击你不想添加进工程的源文件,在Properties框里勾选上 Exclude resource from build。
三、新路径下添加源文件进工程
3.1 在工程文件所在路径下
现在我们换一种情况,还是在当前工程路径\mcux_test\evkmimxrt595_hello_world下,但是新建一个名为sw_delay2的文件夹,并且将sw_delay2.c/h文件放到\mcux_test\evkmimxrt595_hello_world\sw_delay2\路径下。因为有了新路径,此时还需要在工程Properties选项的MCU C Compiler / Includes里(最好在MCU Assembler / General 里也同样设置)将该新路径添加进去。
此时新文件夹sw_delay2及其中源文件好像同样被自动更新到了工程workspace中,我们试试在主函数源文件中调用sw_delay2(),并编译工程。很遗憾,工程编译报错,提示undefined reference to `sw_delay2',就是找不到sw_delay2()函数,这是为什么?
这里要介绍第二个让你不适应的地方,那就是工程文件所在路径下的新建文件夹看起来被自动更新显示到工程workspace中了,但其实其中源文件并没有真正被添加进工程,还需要你手动做一次路径添加,在工程Properties选项的C/C++ General的Paths and Symbols下做如下操作。做完之后,你可以在workspace里看到此时sw_delay2文件夹被提到了Debug上面显示(在SDK工程里,Debug和doc文件夹一般显示在最下面,这两个并没有被真正添加进工程源文件路径,凡是显示在它们后面的文件夹都是没有被真正加入工程的),现在工程可以正常编译了。
3.2 非工程文件所在路径下
最后介绍一种最复杂的情况,这次不在工程路径\mcux_test\evkmimxrt595_hello_world下做文章,我们在\mcux_test\路径下新建一个名为sw_delay3的文件夹,并且将sw_delay3.c/h文件放到\mcux_test\sw_delay3\路径下。因为这个新路径跟工程路径不相关,因此工程workspace没有自动显示它,此时当然需要我们手动来添加这个文件夹进工程。右击工程选择 New / Folder,使用Folder选项里Advanced下面的 Link to alternate location 功能将sw_delay3文件夹及其源文件添加进工程。
此时工程workspace中已经显示了sw_delay3文件夹,但是显示在最下面(Debug和doc之后),这时候我们可以当sw_delay3文件夹刚刚被放到\mcux_test\evkmimxrt595_hello_world\下面一样,按3.1节里的方法走一遍,MCU C Compiler / Includes和C/C++ General - Paths and Symbols下都分别再设置一下。
这里有第三个让你不适应的地方,非工程文件所在路径下的源文件夹在被强制链到工程里时,其Include路径直接转变成了当前工程路径/${ProjName}/下,并不需要像IAR/MDK那样使用 ../ 去回退寻找具体的相对路径。
至此,MCUXpresso IDE下添加新路径下源文件进工程编译的方法痞子衡便介绍完毕了,掌声在哪里~~~
查看原文:https://www.dianyuan.com/eestar/article-8340.html
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题。
我们知道,i.MXRT1xxx家族早期型号(RT1050/RT0160/RT1020)的硬件解密外设名字叫BEE,这个外设主要是配合FlexSPI外设去实现外接串行NOR Flash在线解密XIP执行用的。而到了最近的i.MXRT1xxx新型号(RT1010/RT1170)上,BEE外设被替换成了OTFAD外设,功能不变,解密效率得到了很大提升,但客户在使能OTFAD加密启动时常常遇到App无法正常运行问题,这其实跟OTFAD自身的一个时钟小限制有关(这个限制在BEE上不存在),今天痞子衡就来好好聊一聊OTFAD的这个小限制:
一、问题描述
我们以i.MXRT1010为例,从恩智浦官网下载一个SDK包(痞子衡下的是v2.9.1),随便选择其中一个例程,就以最简单的 \SDK\boards\evkmimxrt1010\demo_apps\led_blinky 为例吧。编译这个 led_blinky 工程(选择 flexspi_nor_debug build,即XIP工程),得到可执行文件(实际bin文件大小为10KB左右),使用 NXP-MCUBootUtility 工具将可执行文件(led_blinky.out)下载进MIMXRT1010-EVK开发板中(下载时启动模式为2'b01,启动时切换到2'b10),可以看到板载绿色LED小灯(D25)会闪,例程是可以正常工作的。
现在让我们尝试使能OTFAD加密,回到芯片下载模式依然借助 NXP-MCUBootUtility 工具,将工具 Secure boot type 选项切换为 OTFAD Encrypted Image Boot,其他设置均默认(此时加密范围是 0x60001000 - 0x60001fff,仅加密IVT等启动头,不含app),再次下载可执行文件(led_blinky.out),换到芯片启动模式复位板子,例程依旧是正常工作的,看起来OTFAD加密启动似乎没有问题。
让我们再进一步,将加密范围设置为0x60002000 - 0x60004fff,这时加密区域覆盖到了整个app,重新按上述流程操作一遍,发现例程没能正常工作,这时候OTFAD加密启动出了问题,难道app区域不能被加密?那OTFAD加密还有啥意义?
app区域当然可以被加密,跟着痞子衡再做一次实验,在 led_blinky.c 文件的 main() 函数中,我们将时钟配置函数 BOARD_BootClockRUN() 直接注释掉或者在链接文件里将其全部搞成 __ramfunc(即在芯片内部RAM里执行这部分时钟配置代码),这个例程仅是利用SysTick定时翻转GPIO,因此时钟配置代码去掉不影响正常运行,重新编译工程再按上面流程操作一遍,这时候例程又能正常工作了,说明加密后的app是能被OTFAD正常解密执行的。
现在的问题变成了为何OTFAD加密启动时,BOARD_BootClockRUN() 函数不能在Flash里执行,这就是问题所在。
二、原因分析
关于上述问题的原因,痞子衡先直接给答案,这是OTFAD外设本身的时钟小限制,当OTFAD被使能时,如果被加密的app代码是XIP执行,app里做系统时钟配置时要始终保证Core时钟高于FlexSPI外设时钟。如果Core时钟低于FlexSPI时钟,此时Core去访问加密Flash区域,OTFAD无法正常解密,会导致指令错乱,发生系统故障。
我们配合上面的i.MXRT1010系统时钟树来认真分析下OTFAD这个时钟限制问题。芯片上电总是从BootROM执行,BootROM会先将Core配置到396MHz,将FlexSPI时钟根据用户放置在Flash偏移0x400处的FDCB里的设定配到30MHz - 200MHz不等,再读取Flash偏移0地址处OTFAD DEK KeyBlob数据使能OTFAD,然后读取IVT等头信息去跳转到App。很显然只加密IVT部分根本不受OTFAD限制的影响,这部分解析是在BootROM里完成的,BootROM里时钟配置符合OTFAD时钟限制要求。
// BootROM里对Core时钟配置
CCM_ANALOG->PFD_528[PFD3_FRAC]=24, PLL2 PFD3输出 (528MHz * 18) / 24=396MHz
CCM->CBCMR[PRE_PERIPH_CLK_SEL]=2, 时钟来自PLL2 PFD3
CCM->CBCDR[PERIPH_CLK_SEL]=0, 内核时钟来自CCM->CBCMR[PRE_PERIPH_CLK_SEL]
CCM->CBCDR[AHB_PODF] =0, 内核时钟不分频
// BootROM里对FlexSPI时钟配置
CCM_ANALOG->PFD_480[PFD0_FRAC]=x, PLL3 PFD0输出 (480MHz * 18) / x
CCM->CSCMR1[FLEXSPI_CLK_SEL]=3, 时钟来自PLL3 PFD0
CCM->CSCMR1[FLEXSPI_CLK_SRC]=0, FlexSPI时钟来自CCM->CSCMR1[FLEXSPI_CLK_SEL]
CCM->CSCMR1[FLEXSPI_PODF]=y, FlexSPI时钟做(y+1)分频
当BootROM跳转到了App之后,我们再来看看App里对时钟是怎么配置的,就是BOARD_BootClockRUN()函数,可以看到这个函数里将内核频率从BootROM设置的396MHz切换到外部OSC 24MHz。无论此时用户FDCB里对FlexSPI时钟是多少配置,至少也会大于30MHz,那么此时24MHz内核频率一定会低于FlexSPI时钟频率,此时只要发生内核对Flash加密区域的访问(时钟配置代码就在Flash里执行),就触发了OTFAD时钟限制问题,App就会跑飞。
三、解决方案
知道了原因,解决方案就简单了,在App时钟配置里,不要按照寻常套路去先将内核时钟源切换到外部OSC再切到PLL,而是直接切到PLL上。比如i.MXRT1010内部有个PLL6(也叫Audio PLL),固定500MHz,正好是App要的最终内核频率,我们在BOARD_BootClockRUN()里将Audio(Enet) PLL初始化设置代码提到前面,删掉原来的切换OSC设置代码即可。
void BOARD_BootClockRUN(void)
{
// 此处略去...
/* Set Oscillator ready counter value. */
CCM->CCR=(CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);
- /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */
- CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */
- CLOCK_SetMux(kCLOCK_PeriphMux, 1); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
// 此处略去...
/* Set IPG_PODF. */
CLOCK_SetDiv(kCLOCK_IpgDiv, 3);
+ /* Init Enet PLL. */
+ CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);
+ /* Set preperiph clock source. */
+ CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);
// 此处略去...
/* Enable Audio PLL output. */
CCM_ANALOG->PLL_AUDIO |=CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;
- /* Init Enet PLL. */
- CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);
- /* Set preperiph clock source. */
- CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);
// 此处略去...
/* Set SystemCoreClock variable. */
SystemCoreClock=BOARD_BOOTCLOCKRUN_CORE_CLOCK;
}
最后再提一下,这个OTFAD时钟限制问题在i.MXRT1170上同样存在,解决思路与上面类似,痞子衡就不再赘述了。
至此,系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题痞子衡便介绍完毕了,掌声在哪里~~~
查看原文:https://www.dianyuan.com/eestar/article-8335.html
上期推送对反激电路的工作模式和简单原理计算进行了介绍反激拓扑2—反激电路工作原理分析,文中提到反激电路工作模式分为CCM、CRM和DCM,那么CCM和DCM模式的边界条件是什么?很明显,就是上文中说的CRM即临界模式,我们在同一个图中绘制出三个模式下的励磁电流波形进行分析。
从图中,可知:
①CCM模式下,励磁电流的平均电流存在一个直流分量,其平均电流Im>Im_peak/2,t1+t2+t3=T,t1=ton,t2+t3=toff;
②DCM模式下,励磁电感在每个周期内都可以被完全去磁,其平均电流Im<Im_peak/2,t1+t2+t3=T,t1=ton,t2=toff,t3时间段内,反激变压器的原副边均无电流;
③CRM边界模式下,励磁电感充磁和去磁能量正好相等,其平均电流Im=Im_peak/2,t1+t2+t3=T,t1=ton,t2+t3=toff;
反激变压器初级侧的电流波形如图所示
变压器次级电流波形如图所示
根据电感伏秒平衡定律:
带入上式简化得:
这个就是CCM和DCM的边界条件,其中f为反激电源的开关频率,D为占空比,N为原副边的匝数比,Lm为励磁电感,R为等效负载电阻。有如下结论:CCM模式下:
DCM模式下:
查看原文:https://www.dianyuan.com/eestar/article-8437.html
更多精彩内容,尽在电子星球 APP(https://www.eestar.com/)
六篇技术文章,让你秒懂电容的脾气秉性
七篇DIY技术文章献给你,让你脑洞全开
五篇文章帮你开启DSP的学习思路
汇总篇:关于PID知识,重点在此
*请认真填写需求信息,我们会在24小时内与您取得联系。