新闻资讯
【方辉专栏】ARM嵌入式编译器(六) 内联函数
2022-08-17
摘要: 本文主要对Arm Compiler 6编译器中内联函数进行介绍。关键字:Arm Compiler 6、编译器、内联函数如果Arm Compiler 6认为内联此函数可以提高性能同时不会显著增加代码量,就会自动优化为内联函数。当然您也可以使用编译器选项来控制函数是否进行内联。内联选项或属性说明__inline__提示编译器可以进行内联,但是否内联仍取决于编译器。__attribute__((always_inline))提示编译器始终内联此函数。__attribute__((noinline))提示编译器不要内联此函数。-fon-inline-functions这个编译命令选项会禁止编译器进行内联,同时也使得__inline__失效。注1:自动内联通常只有在优化等级为-O2或更高等级时才会进行,除非您使用了__attribute__((always_inline)),才会在低优化等级中进行。注2:Arm Compiler 6编译器仅在同一个源文件内进行自动内联函数。以下是一个__attribute__((always_inline))的例子:int bar(int a){    a=a*(a+1);    return a;} __attribute__((always_inline)) static int row(int a){    a=a*(a+1);    return a;} int foo (int i){    i=bar(i);    i=i-2;    i=bar(i);    i++;    i=row(i);    i++;    return i;}在以上代码中,函数bar和row功能相同,只是row声明始终内联。使用-O2进行编译,使用一个含有选项-fon-inline-functions,另一个不含有-fon-inline-functions选项进行编译。编译命令分别如下:有-fon-inline-functions选项:armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s -fon-inline-functions无-fon-inline-functions选项:armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s编译后反汇编结果如下:使用-fon-inline-functions代码不使用-fon-inline-functions代码foo: @ @foo .fnstart@ BB#0: .save {r11, lr} push {r11, lr} bl bar sub r0, r0, #2 bl bar add r1, r0, #1 add r0, r0, #2 mul r0, r0, r1 add r0, r0, #1 pop {r11, pc}.Lfunc_end0: .size foo, .Lfunc_end0-foo .cantunwind .fnendfoo: @ @foo .fnstart@ BB#0: add r1, r0, #1 mul r0, r1, r0 sub r1, r0, #2 sub r0, r0, #1 mul r0, r0, r1 add r1, r0, #1 add r0, r0, #2 mul r0, r0, r1 add r0, r0, #1 bx lr.Lfunc_end0: .size foo, .Lfunc_end0-foo .cantunwind .fnend可以看到,使用-fon-inline-functions选项时,就不会对bar进行内联,而不使用的时候就会对bar进行内联,但对于row始终是进行内联的。+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→
创建蒙特卡洛模拟的 4 个简单步骤
2022-08-17
• 20 世纪 40 年代,研究原子弹的科学家应用 Monte Carlo 模拟计算了一个裂变铀原子引起另一个裂变反应的概率,这是该模拟的首次应用,自此以来已经取得了很大进展。今天我们将介绍如何使用 Minitab 为已知的工程公式和 DOE 方程创建 Monte Carlo 模拟。• 由于当时铀供应短缺,试验的试错空间很小,因此 Monte Carlo 模拟一直专注于根据模拟数据计算可靠的概率。如今,从材料工程到医疗设备包装密封再到炼钢,模拟数据经常用于许多场景,例如资源有限的场景,或者收集真实数据过于昂贵或不切实际的场景。使用 Engage 或 Workspace 的 Monte Carlo 模拟工具可以:(1)模拟可能结果的范围以帮助做出决策(2)预测财务结果或估计项目时间表(3)了解过程或系统中的变异性(4)在过程或系统中发现问题(5)通过了解成本/效益关系来管理风险开始使用任何 Monte Carlo 模拟的4 个步骤• 模拟可能非常复杂,具体取决于所涉及因子的数量。但所有 Monte Carlo 模拟基本上都有四个简单的步骤:• 确定传输方程要创建 Monte Carlo 模拟,您需要一个包含要探索的业务活动、计划或过程的定量模型。过程的数学表达式称为“传输方程”。这可以是已知的工程或业务公式,也可以基于根据设计试验 (DOE) 或回归分析创建的模型。借助 Minitab Engage 和 Minitab Workspace 等软件,您能够创建复杂的方程,甚至是具有多个可能相互依赖的响应的方程。• 定义输入参数对于传输方程中的每个因子,确定其数据的分布方式。一些输入可能遵循正态分布,而另一些则遵循三角分布或均匀分布。然后,您需要确定每个输入的分布参数。例如,需要为遵循正态分布的输入指定均值和标准差。如果您不确定数据遵循哪种分布,可以使用 Engage 和 Workspace 提供的工具来确定。• 设置模拟要进行有效的模拟,您必须为每个输入创建一个非常大的随机数据集(大约包含 100,000 个实例)。这些随机数据点模拟在很长一段时间内,对于每个输入将看到的值。尽管听起来工作量很大,但这正是 Engage 和 Workspace 的亮点。一旦我们提交输入和模型,一切都会得到处理。• 分析过程输出有了模拟数据,您就可以使用传输方程来计算模拟结果。考虑到输入中的预期变异,通过模型运行足够多的模拟输入数据将可靠地指出该过程将在一段时间内输出的内容。Monte Carlo 使用已知工程公式的4 个步骤• 一家制造公司需要评估所提议产品的设计,这是一款每分钟必须泵送 12 毫升流体的小型活塞泵。考虑到活塞直径 (D)、冲程长度 (L) 和每分钟冲程数 (RPM) 的自然变异,您想要估计数千个泵的可能性能。理想情况下,数千个泵的泵流量将具有不大于 0.2 毫升的标准差。• 确定传输方程进行 Monte Carlo 模拟的第一步是确定传输方程。在本例中,您只需使用已知的工程公式来测量泵流量:流量(以毫升为单位)= π(D/2)2 ∗ L ∗ RPM• 定义输入参数现在,必须定义传输方程中使用的每个输入的分布和参数。泵的活塞直径和冲程长度是已知的,但必须计算达到所需 12 毫升/分钟流速所需的每分钟冲程数 (RPM)。每个冲程泵送的体积按以下方程计算:π(D/2)2 * L如果 D = 0.8,L = 2.5,则每个冲程排出 1.256 毫升流体。因此,要达到 12 毫升/分钟的流速,RPM 为 9.549。根据贵厂制造的其他泵的性能,您可以假定活塞直径呈正态分布,均值为 0.8 厘米,标准差为 0.003 厘米。冲程长度呈正态分布,均值为 2.5 厘米,标准差为 0.15 厘米。最后,每分钟冲程数呈正态分布,均值为 9.549 RPM,标准差为 0.17 RPM。• 在 Engage 或 Workspace 中设置模拟单击顶部功能区中的插入选项卡,然后选择 Monte Carlo 模拟。我们将它变得非常简单 — 您只需为每个变量提供名称,从下拉菜单中选择一个分布,然后输入参数。我们将按照上面所述的内容进行操作。如果您不确定数据遵循哪种分布,可以选择使用数据确定。这将提示您上传数据的 .csv 文件,可从以下几个选项中进行选择:• 模拟和分析过程输出下一步是给出方程。在这里,操作非常简单,只需为您的输出提供名称(我们提供的名称是 Flow),然后键入我们在上面确定的正确传输方程。您还可以添加规格上限和规格下限以查看模拟的比较情况。然后,在功能区中,选择要运行的模拟数量(100,000 是不错的基准),然后单击用来运行模拟的按钮。对于为了撰写本文而生成的随机数据,基于 100,000 个样本的平均流速为 11.996。从平均值来看,我们达到了目标,但最小值为 8.7817,最大值为 15.7057。这是一个相当大的范围。(所有组件的)传输变异导致标准差为 0.756 毫升,这远远超过目标值 0.2 毫升。看起来这种泵的设计变异太大,需要在投入生产之前进一步完善。从这里,我们看到模拟所带来的好处。如果我们直接投入生产,很可能会生产出太多被退货的泵。借助 Monte Carlo 模拟,我们能够解决所有这些问题,而不会因制造和测试数千个原型或过早投入生产而产生费用。您可能想了解这些模拟结果是否站得住脚,不妨自己尝试一下吧!运行不同的模拟将导致轻微的变化,但每次的最终结果(流速变异量不可接受)都会保持一致。这就是 Monte Carlo 方法的强大之处。另一个可选步骤:参数优化• 了解到标准差过高非常有价值,但 Engage 和 Workspace 真正突出的地方在于它们能够帮助改善状况。这就是参数优化的用武之地。让我们看看第一个输入:活塞直径。平均值为 0.8,大部分数据将接近该值,或者在平均值的一两个标准差内。但是,如果活塞直径越小,流动效率越高,该怎么办?参数优化有助于我们回答这个问题。为了进行参数优化,我们需要为每个输入指定搜索范围。在本例中,为简单起见,我指定的算法搜索范围是 +/- 3 个标准差。然后,Engage 或 Workspace 将帮助我们为每个输入找到要实现目标(在本例中是减小标准差)的最佳设置。选择合适的范围至关重要;确保您输入的整个范围都可以运行;如果找到的最佳解决方案无法在生产环境中复制,则毫无用处。如果您在 Minitab Statistical Software 中用过响应优化器,则原理类似。下面是我们的结果:基于以上结果,如果要减小标准差,则应当减小冲程长度和每分钟冲程数。活塞直径可以保持类似大小。请记住,Monte Carlo 模拟的关键之处在于,能够在不构建单个新原型或进行新试验的情况下找出所有这些结果。Monte Carlo 使用试验设计 (DOE) 响应方程• 如果您不知道要使用什么方程,或者您正在尝试模拟独特过程的结果,该怎么办?此时,我们可以将 Minitab Statistical Software 的设计试验功能与 Engage 或 Workspace 的模拟功能相结合。一家电子制造商已指派您改进其电极清洁操作,该操作为电镀金属部件做准备。制造商通过电镀在原材料上涂上一层不同的金属,以实现所需的特性。电镀不会附着在肮脏的表面上,因此该公司有一个连接到自动电镀机的连续流电极清洗系统。传送带将每个部件浸入槽中,槽中的电压通过部件传送,从而对部件进行清洁。如果清洁不充分,会导致平均粗糙度的均方根(简称 RMS)值太高以及表面光洁度较差。经过正确清洁的部件具有光滑的表面和较低的 RMS。为了优化该过程,可以调整两个关键输入:电压 (Vdc) 和电流密度 (ASF)。对于电极清洁方法,Vdc 的典型工程限值为 3 至 12 伏。电流密度限值为 10 至 150 安培/平方英尺 (ASF)。• 确定传输方程您不能针对该过程使用教材上的已知公式,但可以在 Minitab 中设置响应曲面 DOE 以确定传输方程。响应曲面 DOE 通常用于通过为“关键少数”可控因子寻找最佳设置来优化响应。在本例中,响应将是部件在清洁后的表面质量。要在 Minitab 中创建响应曲面试验,请选择统计 > DOE > 响应曲面 > 创建响应曲面设计。由于我们有两个因子(电压 (Vdc) 和电流密度 (ASF)),因此我们将选择试验次数为 13 的双因子中心复合设计。Minitab 创建设计试验后,您需要执行 13 次试验、收集数据并记录 13 个清洁后部件的表面粗糙度。通过 Minitab,可轻松分析 DOE 结果、简化模型和使用残差图检查假定。使用最终模型和 Minitab 的响应优化器,可以找到变量的最佳设置。在本例中,您将电压设置为 7.74,将 ASF 设置为 77.8,所获得的粗糙度值为 39.4。响应曲面 DOE 为 Monte Carlo 模拟生成以下传输方程:粗糙度 = 957.8 − 189.4(Vdc) − 4.81(ASF) + 12.26(Vdc2) + 0.0309(ASF2)• 定义输入参数现在,您可以为Monte Carlo模拟输入设置参数定义,并将它们带入Engage或Workspace 中。请注意,标准差必须已知或基于现有的过程知识进行估计。这适用于所有 Monte Carlo 输入。电压呈正态分布,均值为 7.74 Vdc,标准差为 0.14 Vdc。每平方英尺安培数 (ASF) 呈正态分布,均值为 77.8 ASF,标准差为 3 ASF。• 在 Engage 或 Workspace 中设置模拟这与步骤 3 完全相同。单击功能区中的插入 > Monte Carlo 模拟,添加您的输入并定义其参数,然后输入您的模型。在本例中,如果您拥有最新版本的 Minitab,则可以单击鼠标右键,然后点击发送到 Engage 或发送到 Minitab Workspace。如果您没有,则可以从 Minitab 输出中手动复制它并将其粘贴到 Engage 或 Workspace 的模型字段中。• 模拟和分析过程输出汇总表明,即使基础输入呈正态分布,RMS 粗糙度的分布也不是正态的。该汇总还显示所有组件的传输变异导致标准差为 0.521,根据您掌握的过程知识判断,这是不错的过程结果。基于试验次数仅为 13 的 DOE,我们可以确定在该过程中将看到的实际情况。同样,由于这基于模拟数据,您的答案会略有不同,但通常而言答案应该是正确的。如有必要,我们可以查看参数优化以微调我们的答案并找到最佳解决方案。(文章来源公众号:Minitab)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→
【方辉专栏】ARM嵌入式编译器(五) 优化循环的4种方法
2022-08-16
摘要: 本文主要对Arm Compiler 6编译器的优化循环对编写优化代码的作用进行介绍。关键字:Arm Compiler 6、编译器、优化循环 、循环展开、pragma、循环向量化、循环终止、无限循环、1. 循环展开循环执行的时间取决于循环的次数,循环中每次检查是否进行循环的条件会降低循环的性能。使用循环展开可以减少检查条件的判断次数,但是展开循环就意味着增加代码量。例如:在精确的时钟周期循环中,可以使用#pragma unroll (n)来展开循环。“pragma”(编译指示)仅在选择优化等级为-O2/-O3/-Ofast和-Omax时有效。 编译指示的相关用法:#pragma unroll (n)展开n次循环#pragma unroll_completely展开所有循环注:虽然给出了循环展开的编译指示,但Arm官方不建议使用,这样会影响编译器的展开优化和其他循环优化。不使用循环展开的代码使用循环展开的代码int countSetBits1(unsigned int n){ int bits = 0; while (n != 0) { if (n & 1) bits++; n >>= 1; } return bits;}int countSetBits2(unsigned int n){ int bits = 0; #pragma unroll (4) while (n != 0) { if (n & 1) bits++; n >>= 1; } return bits;}将代码分别复制到file.c文件中,然后使用以下命令进行编译和反汇编。armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s不使用循环展开的汇编代码使用循环展开的汇编代码countSetBits1: mov r1, r0 mov r0, #0 cmp r1, #0 bxeq lr mov r2, #0 mov r0, #0.LBB0_1: and r3, r1, #1 cmp r2, r1, asr #1 add r0, r0, r3 lsr r3, r1, #1 mov r1, r3 bne .LBB0_1 bx lrcountSetBits2: mov r1, r0 mov r0, #0 cmp r1, #0 bxeq lr mov r2, #0 mov r0, #0LBB0_1: and r3, r1, #1 cmp r2, r1, asr #1 add r0, r0, r3 beq .LBB0_4@ BB#2: asr r3, r1, #1 cmp r2, r1, asr #2 and r3, r3, #1 add r0, r0, r3 asrne r3, r1, #2 andne r3, r3, #1 addne r0, r0, r3 cmpne r2, r1, asr #3 beq .LBB0_4@ BB#3: asr r3, r1, #3 cmp r2, r1, asr #4 and r3, r3, #1 add r0, r0, r3 asr r3, r1, #4 mov r1, r3 bne .LBB0_1.LBB0_4: bx lr可以看到展开循环时,代码执行会更快,但代码量也更大。2. 循环向量化如果编译的目标含有SIMD单元,那么编译器就可以使用向量引擎来优化代码的向量部分。在优化等级为-O1,可以使用-fvectorize 来启动优化,而在-O2或更高等级时向量优化是自动启用。要使用向量优化,在编写代码的时候需要将结构体的成员放到同一个循环中,而不能使用独立的循环。可以进行SIMD优化的代码不能进行SIMD优化的代码typedef struct tBuffer { int a; int b; int c;} tBuffer;tBuffer buffer[8];void DoubleBuffer1 (void){ int i; for (i=0; i<8; i++) { buffer[i].a *= 2; buffer[i].b *= 2; buffer[i].c *= 2; }}typedef struct tBuffer { int a; int b; int c;} tBuffer;tBuffer buffer[8];void DoubleBuffer2 (void){ int i; for (i=0; i<8; i++) buffer[i].a *= 2; for (i=0; i<8; i++) buffer[i].b *= 2; for (i=0; i<8; i++) buffer[i].c *= 2;}对于每个例子,将代码分别复制到file.c文件中,然后使用以下命令进行编译和反汇编。armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s向量优化后汇编代码未进行向量优化的代码DoubleBuffer1:.fnstart@ BB#0: movw r0, :lower16:buffer movt r0, :upper16:buffer vld1.64 {d16, d17}, [r0:128] mov r1, r0 vshl.i32 q8, q8, #1 vst1.32 {d16, d17}, [r1:128]! vld1.64 {d16, d17}, [r1:128] vshl.i32 q8, q8, #1 vst1.64 {d16, d17}, [r1:128] add r1, r0, #32 vld1.64 {d16, d17}, [r1:128] vshl.i32 q8, q8, #1 vst1.64 {d16, d17}, [r1:128] add r1, r0, #48 vld1.64 {d16, d17}, [r1:128] vshl.i32 q8, q8, #1 vst1.64 {d16, d17}, [r1:128] add r1, r0, #64 add r0, r0, #80 vld1.64 {d16, d17}, [r1:128] vshl.i32 q8, q8, #1 vst1.64 {d16, d17}, [r1:128] vld1.64 {d16, d17}, [r0:128] vshl.i32 q8, q8, #1 vst1.64 {d16, d17}, [r0:128] bxlrDoubleBuffer2: .fnstart@ BB#0: movw r0, :lower16:buffer movt r0, :upper16:buffer ldr r1, [r0] lsl r1, r1, #1 str r1, [r0] ldr r1, [r0, #12] lsl r1, r1, #1 str r1, [r0, #12] ldr r1, [r0, #24] lsl r1, r1, #1 str r1, [r0, #24] ldr r1, [r0, #36] lsl r1, r1, #1 str r1, [r0, #36] ldr r1, [r0, #48] lsl r1, r1, #1 str r1, [r0, #48] ldr r1, [r0, #60] lsl r1, r1, #1 str r1, [r0, #60] ldr r1, [r0, #72] lsl r1, r1, #1 str r1, [r0, #72] ldr r1, [r0, #84] lsl r1, r1, #1 str r1, [r0, #84] ldr r1, [r0, #4] lsl r1, r1, #1 str r1, [r0, #4] ldr r1, [r0, #16] lsl r1, r1, #1 ... bx lr在64位运行状态下要避免编译器使用SIMD向量优化可以在-march或-mcpu后+nosimd;例如:armclang --target=aarch64-arm-none-eabi -march=armv8-a+nosimd -O2 file.c -S -o file.s在32位运行状态下要避免编译器使用SIMD向量优化,可以通过设置-mfpu=fp-armv8;例如:armclang --target=aarch32-arm-none-eabi -march=armv8-a -mfpu=fp-armv8 -O2 file.c -S -o file.s3. 循环终止在写循环的时候如果编写不当会使得代码的运行效率降低和代码量增大。建议使用以下的终止条件:1)使用变量类型为:unsigned int2)使用向下减少的计数方式,以减到0作为计数结束。3)使用简单的终止条件。单独或组合使用以上原则的终止条件,可以获得更好的代码大小或效率。例如:这是一个实现n!的计算程序。递增循环递减循环int fact1(int n){ int i, fact = 1; for (i = 1; i <= n; i++) fact *= i; return (fact);}int fact2(int n){ unsigned int i, fact = 1; for (i = n; i != 0; i--) fact *= i; return (fact);}用以下命令反汇编以下armclang -Os -S --target=arm-arm-none-eabi -march=armv8-a递增循环递减循环fact1: mov r1, r0 mov r0, #1 cmp r1, #1 bxlt lr mov r2, #0.LBB0_1: add r2, r2, #1 mul r0, r0, r2 cmp r1, r2 bne .LBB0_1 bx lrfact2: mov r1, r0 mov r0, #1 cmp r1, #0 bxeq lr.LBB1_1: mul r0, r0, r1 subs r1, r1, #1 bne .LBB1_1 bx lr对比反汇编代码可以看出在递减循环中用SUBS指令代替了递增循环中ADD 和CMP两条指令。这是因为SUBS指令会自动更新Z标志。此外在递减循环中变量n不必再循环的过程实时使用,从而减少了寄存器的数量。如果终止条件是一个函数,则循环的每次都调用该函数,这种情况下递减的循环优势就更明显了。例如:for (...; i < get_limit(); ...);说明:这种递减循环计数的方式也适用于while-do 命令。4. 无限循环在某些情况下armclang会删除一些编译器认为没有影响的无限循环,从而导致最终程序无法正常运行。为确保无限循环的正确编译执行,ARM官方建议在无限循环中添加__arm volatile的声明。这个声明的目的是告诉编译器删除这个无限循环会有影响,不能被优化删除。在无限循环中,把处理器设置为低功耗模式是一个不错的做法,当有中断或事件触发时再回到正常模式。下面是一个包含__arm volatile声明的无限循环例子:void infinite_loop(void) {while (1)  __asm volatile("wfe");}注:wfe(Wait for Event)是给处理器一个提示,使处理器进入低功耗状态,直到事件或中断触发。来源:《Arm® Compiler for Embedded User Guide Version 6.18》+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→
Ansys计划于2027年实现减少15%碳排放量
2022-08-16
Ansys致力于通过谨慎衡量资源使用情况,减少其现有业务对环境与气候的影响主要亮点作为仿真软件领域的领导者,Ansys通过旨在减少资源浪费的先进仿真技术,帮助用户实现可持续发展目标Ansys的环境战略侧重于总体减排和基于其全球基础设施能源审计结果的项目实施Ansys计划通过测量、分析和减少资源使用,来减少其业务对环境和气候的影响。目标是到2027年,与其2019年的基线相比,将scope 1和scope 2范畴的排放量减少15%。Ansys还通过仿真解决方案扩大其承诺范围,帮助用户最大限度地减少材料浪费、提高循环利用率、加速产品研发过程,并最大限度地减少物理原型制作。Ansys的环境战略侧重于减少总体排放,并继续实施能源审计项目,包括加强照明与现场可再生能源。这是其降低排放、减少环境影响并优化运营的更广泛举措中的一部分。Ansys的环境战略侧重于减少总体排放,并继续实施能源审计项目,包括加强照明与现场可再生能源,如太阳能电池板(图为 Ansys 印度浦那厂区)Ansys在继续推进其产品手印计划(product handprint initiative)——记录Ansys如何帮助客户减少其对地球的影响。每个产品手印或应用案例,都反映了Ansys在特定领域的工作成果,包括半导体、能源、数字孪生和航空航天领域。通过其在线系列纪录片 “拯救地球(Earth Rescue)” ,Ansys展示了富有远见的客户为应对气候变化在解决方案创新方面所做的努力。“拯救地球” 系列纪录片的新剧集将于今年秋天发布。Ansys副总裁、法律总顾问兼秘书及ESG项目负责人Janet Lee表示:“通过我们的环境、社会和治理(ESG)计划,Ansys致力于为投资者、客户、员工和合作伙伴推动积极的创新发展。我们ESG计划的根本理念是,通过产品促进可持续发展、投资我们的员工、负责任地运营以及与利益相关方合作——确保我们能够在共同建设更美好未来的过程中,为企业和社区带来长期价值。”(文章来源公众号:Ansys)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→
强力赋能汽车与AIoT,“星辰”处理器助攻本土芯片创新
2022-08-15
随着人工智能的纵深发展,物联网设备智能化对处理器的计算性能和计算效率提出了更高需求,而面向工业和车规的设备,则需要高可靠性的计算平台来满足安全性的要求。安谋科技自研“星辰”处理器自2019年首次发布,发展到今年7月发布的第二代产品,以其强劲的处理性能和对Arm®生态的延续,在AIoT、汽车电子等领域被广泛应用,逐步构建起丰富的生态系统。创新不止,“星辰”处理器赋能AIoT和汽车电子“星辰”处理器第一代产品STAR-MC1于2019年9月发布,次年6月,安谋科技推出了STAR-MC1的升级版本,该版本支持Armv8-M架构中所有的特性,支持了可定制指令和协处理器接口,并进一步拓展TrustZone的安全性,满足了AIoT应用对性能、功耗、安全的全面要求。“星辰” STAR-MC2处理器概览2022年7月,安谋科技重磅推出“星辰”处理器第二代产品STAR-MC2。“星辰”STAR-MC2基于最新Armv8.1-M架构设计,是首个本土研发、支持ASIL-D级别功能安全的嵌入式处理器。相较于上一代产品,它不仅拥有更强的人工智能和数字信号处理能力以及更高的计算密度和能效比,还重点优化了智能物联网和车载设备所需的信息安全和功能安全。特别是在中国新能源智能化汽车产业大发展、汽车电气架构变革演化的大背景下,国产车规级芯片逐渐成为市场宠儿,“星辰”STAR-MC2处理器支持ASIL-D级别的功能安全设计,可大幅简化芯片开发并加速符合车规级要求的认证,助力国内芯片厂商加快创新步伐 。目前,“星辰”STAR-MC2处理器已面向客户正式交付,除了满足国内芯片厂商在智能物联网、汽车电子等领域的前沿需求,安谋科技还正与Arm公司探讨面向海外市场授权的计划。授权客户超过60家,“星辰”处理器助攻本土芯片创新推向市场三年以来,“星辰”处理器受到了众多芯片厂商的广泛欢迎。继去年底破亿以后,基于“星辰”处理器的芯片出货已进入快速成长期,授权客户超过60家,集成项目多达70余项。搭载“星辰”处理器的通用控制器、互联芯片、传感器控制、汽车芯片、定位导航、存储等芯片产品,被广泛地应用在智能家居、智慧交通、智能安防等领域,持续推动本土科技产业创新。其中,灵动微电子在今年上半年发布了搭载安谋科技“星辰”STAR-MC1处理器的全新高性能MM32F5微控制器系列。该系列MCU产品在性能、安全性以及连接性等方面均有优异表现,充分满足AIoT市场多领域、多层次的丰富应用场景需求。思澈科技在SF32LB55x系列MCU产品中采用了基于安谋科技“星辰”STAR-MC1处理器的双核架构,不仅实现了240MHz的高性能处理能力,还通过48MHz超低功耗处理器兼顾了低功耗场景,并且集成了功耗和性能俱佳的低功耗蓝牙5.2连接,全面满足智能穿戴场景需求的同时也丰富了其他市场应用。忆芯科技的高性能企业级SSD主控芯片STAR2000中,“星辰”处理器被用于闪存通道控制,使STAR2000完备地支持各类闪存接口协议并保证闪存访问的效率,并在面积、功耗与性能上达到了出色的平衡。安谋科技立足本土创新,坚持以自研IP技术的创新发展与Arm IP相配合,为本土集成电路产业提供丰富的产品组合和解决方案。未来,包括“星辰”处理器在内的自研IP产品矩阵,还将得到进一步拓展和丰富,安谋科技将继续携手合作伙伴一起积极推动创新应用的加速落地,赋能智能计算生态的构建。声明:Arm是Arm公司 (或其子公司)的注册商标。(文章来源公众号:安谋科技)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→
【技术博客】级联电路中使用传递函数的蒙特卡罗分析
2022-08-12
作者:Zachariah Peterson专业电路设计人员在设计电路时不仅仅使用并联和串联的元件。构建电路的一种方法是使用具有输入和输出端口的电路网络。可以通过传统方式(SPICE、手动等)分析每个网络内部发生的情况,但重要的是网络将输入电压/电流对映射到输出电压/电流对。在数学上,这可以用传递函数进行量化。在进行高可靠性设计时,需要了解的一个重要因素是系统某一部分的方差如何传播到系统的输出。但这个因素有时并不直观。它需要手动进行一些数学推导,或者需要一些仿真来确定系统中电气行为的变化和波动。在本文中,我将展示如何使用蒙特卡罗仿真数据来检查元件容差如何影响级联电路网络的电气行为。数学涉及几个常见的概率论要点,但最终结果和所涉及的过程可以很容易在SPICE和Excel中实现。01理论:级联网络中的方差接下来我要介绍一个理论,目的是推导出表达式,该表达式将级联网络的输出电压变化定义为每个网络中各个传递函数的变化。尽管还有温度或随机噪声等情况,我们假定网络传递函数的变异仅由元件容差造成。首先,让我们来看下面所示的级联网络。在这个网络,我们考虑的方案中每个网络有2个端口(输入和输出)。扩展到3个端口稍显复杂,但如果其他端口只是固定的功率输入,我们仍然可以使用此处所示的理论。级联中每个网络都有一个传递函数H。网络输入和输出之间的关系如方程式(1)所示。在这个方程式中,整个网络的传递函数是每个网络传递函数的乘积:方程式(1):级联网络传递函数定义。在方程式(1)中,我们的事实依据是,如上所示的串联级联网络的总传递函数是所有单个传递函数的乘积。这个方程适用于构建为二端口网络的各种电路。现在,我们可以检查给定元件容差值的传递函数中的统计变化。02转移函数的变量每个网络中的元件容差将在每个网络中的传递函数中产生一些变化。我们现在要定义传递函数中的方差。方程式(2):每个网络的传递函数定义为常数部分(平均值)和随机部分(标准差)。在方程式(2)中,Hi是一个随机变量,它与网络i(ẟHi)传递函数的随机变化有关。为了使该表达式为真,分布ẟHi必须允许这种类型的线性转换。一般来说,高斯分布和均匀分布都是如此,因此这在蒙特卡罗仿真中经常考虑的两种主要情况下都是有效的。我们没有将ẟHi与具有特定等式的元件公差联系起来。但是,如果您知道电路网络中所有元件的公差,则可以使用蒙特卡罗仿真来确定ẟHi。只需为单个网络 Hi 进行仿真,然后运行蒙特卡罗仿真以确定传递函数 ẟHi 的方差。03输出电压的变量现在我们已经定义了单个传递函数的随机变量,我们可以通过将公式(2)中所示的相同线性变换应用到公式(1)中的传递函数的乘积来定义输出电压的变量。我将其写成公式(3):公式(3): 输出电压的变量。这里,输出电压也有常数部分(平均值)和随机部分(标准差)。换句话说,现在电压是一个与随机变量乘积相关的随机变量。平均输出电压是右侧的常数项:方程式(4):根据组成级联网络的传递函数平均值表示的平均输出电压。由此可知,传递函数的乘积是整个网络传递函数的平均值:方程式(5):整个级联网络的传递函数平均值以级联中各个网络的平均传递函数值表示。如果我们展开方程式(3)中的乘积,将得到一个包含多个ẟHi 项、Hmean 和输出电压方差的乘积的表达式。在这里,我们将采取近似值,因为任意ẟHi项的乘积非常小,可以忽略不计。考虑到常见的元件公差,这是完全可以接受的,即使它们高达 20%。这里我就省略中间步骤,留给读者自行运算,最终可以得到以下方程式:方程式(6):以传递函数均值和随机变化表示的输出电压。这看起来不像最终答案,但是方程式(6)确实告诉您在传递函数存在一些差异的情况下,您需要了解有关输出电压随机行为的所有信息!在这里,我们根据随机变量的线性组合(ẟHi 项集)定义了一个随机变量(Vout)。从多元概率论中,我们知道这个和的标准差等于ẟHi 项的正交和。换句话说,Vout 的标准偏差为:方程式(7):输出电压基于传递函数方差的标准差。在这个方程式中,st.dev运算指标准差,Var运算指方差。使用方程式(7),我们可以开发一个仿真过程,将输出电压的变化与级联网络中传递函数的变化联系起来。04过程现在我们可以开发一个根据传递函数方差来确定输出电压方差的过程。您的主要工具将是蒙特卡罗仿真和简单的统计分析程序,如Excel:1. 将级联网络电路设计划分为单独的二端口网络。2. 针对#1中的每个网络运行蒙特卡罗仿真。3. 获取每个网络的数据并计算每次蒙特卡罗运行的传递函数。4. 计算每个网络的传递函数结果的平均值。5. 计算#3中每个传递函数的标准差,得出每个网络的ẟHi。6. 使用来自#4、#5和方程式(7)的结果,得出输出电压的变化。根据您在此过程中使用的数据数量,您可以更进一步,得出结果的置信区间。示例计算:为什么要在单个传递函数上进行如此麻烦的运算?让我们来举个例子,了解其中原因。假设您有三个具有不同元件容差(1%、5%和10%)的电路网络,并且您已经完成了上述过程以确定每个网络的传递函数的变化。假设这些元件公差值转化为下图中显示的示例方差。使用方程式(7),我们可以预测这个假设网络的输出电压变化:已知元件容差和传递函数变化的输出电压计算标准差示例。根据应用,13.63%的容差可能过大。由此,我们可以判断是否应该降低某些元件组的容差。现在假设输出电压变化对于我们的应用来说是不可接受的,我们希望得到更小的变化。我们决定将 5% 的容差和 10% 的容差换成 1% 的容差。无需运行任何新的仿真,我们就可以立即知道输出变化是什么。对于线性电路,将容差降低 10 倍应将传递函数方差降低 10 倍,对于其他降低因子,依此类推。然后我们会得到以下结果:针对较小的元件容差,修改输出电压计算的标准差。将输出电压从13.63%降低到2.23%,这一折减幅度非常大,而它所需要的只是一个简单的元件交换。无需添加新电路,无需更改设计,只需选择一些备用元件编号即可。这些类型的方差折减步骤正是您在精确仿真应用中所需要的。现在假设您想改变运行频率。在这种情况下,您可以使用从蒙特卡罗仿真中获得的传递函数数据,使用相同的计算来确定在这个新频率下输出电压将如何变化。05总结与比较通过了解如何增加不同级联网络中的方差,得出输出电压的总方差,您可以执行以下任意操作,直接确定输出电压将如何变化:将网络中的元件换成容差更严格的元件把一个网络换成一个完全不同的网络在级联中添加额外的网络上面显示的扰动方法仅适用于串联级联滤波器或放大器。如果您有并行网络,它们的传递函数相加,使上面显示的方差分析更容易。此外,您可以使用这个想法来推导出串联和并联网络组合的方差表达式。无论您如何安排电路网络以获得方差表达式,都适用上述相同的仿真和分析方法。如果您有兴趣在Altium Designer ®内运行蒙特卡罗仿真和转移函数计算,可以在原理图编辑器中找到SPICE引擎中内置的仿真工具。完成 PCB 并准备好与合作者或制造商分享您的设计后,您可以通过 Altium 365™ 平台分享您完成的设计。设计和生产先进电子产品所需的一切都集成在一个软件包中。Altium 365仅仅是Altium Designer功能的冰山一角。立即开始免费试用Altium Designer + Altium 365吧。(文章来源公众号:Altium)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→
报名 | Meet Qt技术沙龙南京站 (8月30日,星期二)
2022-08-11
感谢您长期以来对Qt的喜爱!诚邀您和其他专业Qt用户参加8月30日(星期二)我们在南京举办的Meet Qt技术沙龙。资深Qt专家将向您介绍产品发展的最新动向和技术,并与您分享经典应用案例,全力为您搭建一个干货分享,灵感碰撞和自由交流的平台。时间:8月30日(星期二) 13:00 - 17:45地点:靠近地铁河定桥站,请等待本微信公众号推送的报名成功和参会通知活动议程:> 13:00 - 13:30 签到> 13:30 - 13:45 Qt公司介绍> 13:45 - 14:15 Qt 6.2 LTS新特性及升级必要性> 14:15 - 14:45 Squish助力自动化跨平台GUI代码测试> 14:45 - 15:15 Qt for MCUs 2.2 LTS最新技术及生态合作> 15:15 - 15:45 茶歇+Demo演示> 15:45 - 16:30 Qt在汽车数字座舱的整体解决方案打造统一的3D用户界面> 16:30 - 17:00 Qt对国产操作系统的支持及相关应用案例> 17:00 - 17:30 Qt Design Studio 3.x全新交互升级、打造高阶生产力> 17:30 - 17:45 抽奖问答本次活动报名将于8月25日截止。参会免费,但因场地有限,不接受现场报名。请扫描下面二维码报名报名后,Qt工作人员将与您电话确认参会资格,并将在活动前一天通过"Qt软件"微信公众号确认地址等信息。谢谢!(文章来源公众号:Qt软件)+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→
【方辉专栏】ARM嵌入式编译器(四) volatile 关键字对Arm Compiler 6编译优化的影响
2022-08-10
摘要: 本文主要对Arm Compiler 6编译器的volatile 关键字对优化的影响进行介绍。关键字:Arm Compiler 6、编译器、volatile 、优化1. volatile关键字的意义当一个变量使用volatile关键字进行声明时,意味着这个变量是可能随时被外部进行修改的。(例如操作系统、硬件)使用此声明可以避免在编译器优化时,假设没有被修改或被使用就进行优化处理。2. volatile关键字的使用volatile用于可能从定义变量的范围之外修改的变量。例如,如果程序在某些计算中使用全局变量,编译器会生成代码以将变量的值加载到寄存器中以执行该计算。如果随后在另一个计算使用相同的全局变量,编译器可能会直接使用寄存器的值,而不是从内存重新加载到寄存器。这样操作时因为编译器优化时认为此变量不会被外部修改,但实际上对于内存映射的外设是不正确的。因为此变量可能会被修改,直接使用上次寄存器值就会导致计算错误。让我们看个实际的例子:不使用volatile声明变量使用volatile声明变量int buffer_full;int read_stream(void){ int count = 0; while (!buffer_full) { count++; } return count;}volatile int buffer_full;int read_stream(void){ int count = 0; while (!buffer_full) { count++; } return count;}这两个例程都在循环中递增一个计数器,直到状态标志buffer_full为真。buffer_full的状态是随程序流异步改变。左边的例子没有将变量声明buffer_full为volatile,而右边的进行了声明。下面显示了两个程序在编译之后再进行反汇编之后的代码。使用的编译命令均为:armclang --target=arm-arm-none-eabi -march=armv8-a -Os -S 反汇编结果如下表所示:不使用volatile声明变量使用volatile声明变量read_stream: movw r0, :lower16:buffer_full movt r0, :upper16:buffer_full ldr r1, [r0] mvn r0, #0.LBB0_1: add r0, r0, #1 cmp r1, #0 beq .LBB0_1 ;infinite loop bx lrread_stream: movw r1, :lower16:buffer_full mvn r0, #0 movt r1, :upper16:buffer_full.LBB1_1: ldr r2, [r1] ; buffer_full add r0, r0, #1 cmp r2, #0 beq .LBB1_1 bx lr在不使用volatile声明的例子中,buffer_full没有声明为外部会改变的变量,因此编译器假定它的值不能在程序之外被修改,因此优化时省略了重新加载过程,就变成了一个无限循环。在使用volatile声明的例子中,编译器假定buffer_full可以在程序外部更改不执行优化。因此buffer_full的值每次重新加载到r2寄存器中。此时生成的汇编代码是正确的。3. volatile关键字对编译器优化的影响当变量可能随时被外部进行修改时,如果编译器假定其值不能从定义它的范围之外修改。因此,编译器可能会执行不必要的优化。这个问题可能有以下两种表现方式:1)轮询时,代码可能会陷入死循环。2)可能会导致删除故意延时的代码。来源:《Arm® Compiler for Embedded User Guide Version 6.18》+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++关于九游会J9电子九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。欢迎关注“九游会J9电子”公众号了解更多研发工具软件知识
查看更多→