当前位置:首页 > 嵌入式
  • 嵌入式微控制器应用中的无线(OTA)更新:设计权衡与经验教训

    嵌入式微控制器应用中的无线(OTA)更新:设计权衡与经验教训

    摘要 许多嵌入式系统部署在操作人员难以或无法接近的地方。物联网(IoT)应用尤其如此,这些应用通常大量部署并且电池寿命有限。实例包括监控人员或机器健康状况的嵌入式系统。这些挑战加上快速迭代的软件生命周期,导致许多系统需要支持无线(OTA)更新。OTA更新用新软件替换嵌入式系统的微控制器或微处理器上的软件。虽然很多人非常熟悉移动设备上的OTA更新,但在资源受限的系统上设计和实施会带来许多不同的挑战。本文将介绍针对OTA更新的若干不同软件设计,并讨论其优缺点。我们将了解OTA更新软件如何利用两款超低功耗微控制器的硬件特性。 构建模块 服务器和客户端 OTA更新用新软件替换器件上的当前软件,新软件以无线方式下载。在嵌入式系统中,运行此软件的器件通常是微控制器。微控制器是一种小型计算器件,其存储器、速度和功耗均很有限。微控制器通常包含微处理器(核心)和用于执行特定操作的数字硬件模块(外设)。工作模式下典型功耗为30μA/MHz至40μA/MHz的超低功耗微控制器是此类应用的理想选择。使用这些微控制器上的特定硬件外设并将其置于低功耗模式,是OTA更新软件设计的重要组成部分。图1显示了一个可能需要OTA更新的嵌入式系统实例。可以看到,一个微控制器与无线电和传感器相连,这可用在物联网应用中,利用传感器收集有关环境的数据,并利用无线电定期报告数据。系统的这一部分称为边缘节点或客户端,是OTA更新的目标。系统的另一部分称为云或服务器,是新软件的提供者。服务器和客户端利用收发器(无线电)通过无线连接进行通信。 图1.示例嵌入式系统中的服务器/客户端架构 何为软件应用程序? OTA更新过程的大部分操作是将新软件从服务器传输到客户端。软件从源格式转换为二进制格式之后,作为一个字节序列进行传输。转换过程会编译源代码文件(例如c、cpp),将其链接成一个可执行文件(例如exe、elf),然后将可执行文件转换为可移植的二进制文件格式(例如bin、hex)。概言之,这些文件格式包含一个字节序列,此字节序列属于微控制器中存储器的特定地址。通常,我们将通过无线链路发送的信息概念化为数据,例如更改系统状态的命令或系统收集的传感器数据。就OTA更新而言,数据就是二进制格式的新软件。在很多情况下,二进制文件非常大,无法通过单次传输从服务器发送到客户端,这意味着需要将二进制文件放入多个不同的数据包中,此过程称为“分包”。为了更好地说明此过程,图2演示了软件的不同版本如何生成不同的二进制文件,从而在OTA更新期间发送不同的数据包。在这个简单例子中,每个数据包包含8字节数据,前4个字节表示客户端存储器中用来存储后4个字节的地址。 主要挑战 基于对OTA更新过程的这种高层次描述,OTA更新解决方案必须应对三大挑战。第一个挑战与存储器有关。软件解决方案必须将新软件应用程序组织到客户端器件的易失性或非易失性存储器中,以便在更新过程完成时可以执行它。解决方案必须确保将前一版本的软件保留为后备应用程序,以防新软件出现问题。此外,当复位和断电重启时,我们必须让客户端器件的状态——例如当前运行的软件版本以及它在存储器中的位置——保持不变。第二大挑战是通信。新软件必须以离散数据包的形式从服务器发送到客户端,每个数据包都要放在客户端存储器中的特定地址。分包方案、数据包结构和数据传输协议必须在软件设计中考虑周全。最后一个主要挑战是安全性。当新软件以无线方式从服务器发送到客户端时,我们必须确保服务器是可信任方。这种安全挑战称为身份验证。我们还必须对新软件进行模糊处理以防观察者偷窥,因为其中可能包含敏感信息。这种安全挑战称为保密。安全性的最后一个要素是完整性,即确保新软件在通过无线方式发送时不会损坏。 图2.软件应用程序的二进制转换和分包过程 第二阶段引导加载程序(SSBL) 了解引导序列 主引导加载程序是一种软件应用程序,永久驻留在微控制器的只读存储器中。主引导加载程序所在的存储区域称为信息空间,有时用户无法访问。每次复位都会执行该应用程序,一般完成一些必要的硬件初始化,并且可能将用户软件加载到存储器中。但是,如果微控制器包含片内非易失性存储器(如闪存),则引导加载程序不需要进行任何加载,只需将控制权转移到闪存中的程序即可。如果主引导加载程序不支持OTA更新,则必须有第二阶段引导加载程序。与主引导加载程序一样,SSBL会在每次复位时运行,但将实施OTA更新过程的一部分。此引导序列如图3所示。本节将说明为什么需要第二阶段引导加载程序,并解释如何指定此应用程序的作用是一个重要设计权衡。 经验教训:务必有一个SSBL 从概念上讲,省略SSBL并将所有OTA更新功能放入用户应用程序似乎更简单,因为这样的话,OTA过程可以无缝利用现有的软件框架、操作系统和设备驱动程序。图4显示了一个选择此方法的系统的存储器映射和引导序列。 应用程序A是部署在现场微控制器上的原始应用程序。此应用程序包含OTA更新相关软件,当服务器请求时,利用该软件可下载应用程序B。下载完成且应用程序B经过验证之后,应用程序A将对应用程序B的复位处理程序执行分支指令,以将控制权转移给应用程序B。复位处理程序是一小段代码,用作软件应用程序的入口点,并在复位时运行。在这种情况下,复位是通过执行一个分支来模拟,这相当于函数调用。这种方法有两大问题: ► 许多嵌入式软件应用程序采用实时操作系统(RTOS),其允许将软件拆分为多个并发任务,每个任务在系统中具有不同的职责。例如,图1所示的应用程序可能有用于读取传感器的RTOS任务,对传感器数据运行某种算法的RTOS任务,以及与无线电接口的RTOS任务。RTOS本身始终处于活动状态,负责根据异步事件或特定的基于时间的延迟切换这些任务。因此,从RTOS任务分支到新程序是不安全的,因为其他任务会在后台继续运行。对于实时操作系统,终止某个程序的唯一安全方法是通过复位。 图3.使用SSBL的存储器映射和引导流程示例 图4.没有SSBL的存储器映射和引导流程示例 ► 基于图4,上述问题的解决办法是让主引导加载程序分支到应用程序B而不是应用程序A。但在某些微控制器上,主引导加载程序总是运行具有中断向量表(IVT)的程序;IVT是应用程序的一个关键部分,描述中断处理函数,位于地址0。这意味着必须以某种形式重定位IVT,使其复位映射到应用程序B。如果在IVT重定位期间发生断电重启,则系统可能会处于永久破损状态。 将SSBL固定在地址0可以解决这些问题,如图3所示。SSBL不是RTOS程序,因此可以安全地分支到新应用程序。地址0处的SSBL的IVT永远不会重新定位,所以不必担心断电重启会将系统置于灾难性状态。 设计权衡:SSBL的作用 我们花了很多时间讨论SSBL及其与应用软件的关系,但SSBL程序有何作用?至少,该程序必须确定当前应用程序是什么(其开始位置),然后分支到该地址。微控制器存储器中各种应用的位置一般保存在目录(ToC)中,如图3所示。这是持久内存中的一个共享区域,SSBL和应用软件均利用它来相互通信。当OTA更新过程完成时,新的应用程序信息会更新ToC。OTA更新功能的某些部分也可以被推送到SSBL。开发OTA更新软件时,确定推送哪些部分是重要的设计决策。上述最小SSBL将非常简单,易于验证,并且在应用程序的生命周期中很可能不需要修改。但是,这意味着每个应用程序都要负责下载和验证下一个应用程序。这可能导致无线电堆栈、设备固件和OTA更新软件的代码重复。另一方面,我们可以选择将整个OTA更新过程推送到SSBL。在这种情况下,应用程序只需在ToC中设置一个标志以请求更新,然后执行复位。SSBL随后执行下载序列和验证过程。这将最大限度地减少代码重复并简化应用专用软件。然而,这会引入一个新的挑战,那就是可能需要更新SSBL本身(即更新更新代码)。最终,决定SSBL中放置哪些功能将取决于客户端器件的存储器限制、下载的应用程序之间的相似性以及OTA更新软件的可移植性。 设计权衡:缓存和压缩 OTA更新软件中的另一个关键设计决策是在OTA更新过程中如何组织存储器中传入的应用程序。微控制器上通常有两类存储器:非易失性存储器(例如闪存)和易失性存储器(例如SRAM)。闪存用于存储应用程序的程序代码和只读数据,以及其他系统级数据,例如ToC和事件日志。SRAM用于存储软件应用程序的可修改部分,例如非常数全局变量和堆栈。图2所示的软件应用程序二进制文件仅包含非易失性存储器中存在的程序的某些部分。在启动例程期间,应用程序将初始化属于易失性存储器的部分。 在OTA更新过程中,每次客户端器件从服务器收到一个包含该二进制文件一部分的数据包时,便会将其存储到SRAM中。该数据包可以是压缩的,也可以是未压缩的。压缩应用程序二进制文件的好处是文件会变小,从而要发送的数据包会减少,下载过程中存储数据包所需的SRAM空间相应地减小。这种方法的缺点是压缩和解压缩会增加更新过程的处理时间,并且必须在OTA更新软件中捆绑压缩相关代码。 新应用软件属于闪存,但在更新过程中到达SRAM,因此OTA更新软件需要在更新过程中的某个时刻执行对闪存的写操作。暂时将新应用程序存储在SRAM中的操作称为缓存。概言之,OTA更新软件可以采取三种不同的缓存方法。 ► 不缓存:每次包含新应用程序一部分的数据包到达时,便将其写入闪存中的目标位置。这种方案非常简单,可以最大限度地减少OTA更新软件中的逻辑数量,但要求完全擦除新应用程序对应的闪存区域。此方法会消磨闪存并增加开销。 ► 部分缓存:保留一个SRAM区域用于缓存,当新数据包到达时,将其存储在该区域中。当该区域填满时,将数据写入闪存以清空该区域。如果数据包无序到达或新应用程序二进制文件中存在间隙,这种方案可能会变得很复杂,因为需要一种方法来将SRAM地址映射到闪存地址。一种策略是让缓存充当闪存一部分的镜像。闪存被划分为若干称为页面的小区域,这是可供擦除的最小区域。得益于这种自然划分,一个好办法是在SRAM中缓存闪存的一页,当其填满或下一数据包属于其他页面时,便将该页写入闪存以清空缓存。 ► 完全缓存:在OTA更新过程中将整个新应用程序存储在SRAM中,只有从服务器完全下载好新应用程序之后才将其写入闪存。这种方法克服了前述方法的缺点,写入闪存的次数最少,OTA更新软件无需复杂的缓存逻辑。但是,这会限制所下载新应用程序的大小,因为系统的可用SRAM量通常远小于可用闪存量。 图5.使用SRAM缓存闪存的一页 图5显示了OTA更新过程中的第二种方案——部分缓存,来自图3和图4的应用程序A所对应的闪存部分被放大,并且显示了用于SSBL的SRAM的功能存储器映射。示例闪存页面大小为2 kB。最终,此设计决策将取决于新应用程序的大小和OTA更新软件容许的复杂度。 安全和通信 设计权衡:软件与协议 OTA更新解决方案还必须解决安全和通信问题。如图1所示,许多系统会在硬件和软件中实现通信协议,以支持系统的普通(非OTA更新相关)操作,例如交换传感器数据。这意味着服务器和客户端之间已经建立了(可能是安全的)无线通信的方法。类似图1所示的嵌入式系统可以使用的通信协议有低功耗蓝牙® (BLE)或6LoWPAN等。有时候,这些协议支持安全性和数据交换,OTA更新软件在OTA更新过程中可以利用。 OTA更新软件中必须构建的通信功能量最终将取决于现有通信协议提供的抽象程度。现有通信协议具有用于在服务器和客户端之间发送和接收文件的工具,OTA更新软件可以简单地将该工具用于下载过程。但是,如果通信协议较为原始,只有发送原始数据的工具,那么OTA更新软件可能需要执行分包处理,并提供元数据和新应用程序二进制文件。这也适用于安全挑战。如果通信协议不支持,OTA更新软件可能要负责对无线保密发送的字节进行解密。 总之,在OTA更新软件中实施哪些功能,例如自定义数据包结构、服务器/客户端同步、加密和密钥交换等,将取决于系统的通信协议提供了什么内容以及对安全性和稳健性的要求。下一节将提出一个完整的安全解决方案,其解决了之前介绍的所有挑战,我们将展示如何在此解决方案中利用微控制器的加密硬件外设。 解决安全挑战 我们的安全解决方案需要让新应用程序以无线方式保密发送,检测新应用程序中的任何损坏,并验证新应用程序是从受信任的服务器而不是恶意方发送的。这些挑战可通过加密操作来解决。具体而言,该安全解决方案可以使用两种加密操作:加密和哈希处理。加密使用客户端和服务器共享的密钥(密码)来对无线发送的数据进行模糊处理。微控制器的加密硬件加速器可能支持的特定加密类型是AES-128或AES-256,具体取决于密钥大小。除了加密数据,服务器还可以发送一个摘要以确保没有损坏。摘要通过对数据包进行哈希处理来生成,这是一种用于生成唯一代码的不可逆数学函数。在服务器产生消息或摘要之后,如果其任何部分遭到修改,比如在无线通信期间有一位发生翻转,则客户端在对数据包执行相同的哈希函数处理并比较摘要时,会注意到此修改。微控制器的加密硬件加速器可能支持的特定哈希处理类型是SHA-256。图6显示了微控制器中的加密硬件外设的框图,OTA更新软件驻留在Cortex-M4应用层中。此图还显示了其支持将受保护密钥存储在外设中,OTA更新软件解决方案可以利用这一点来安全存储客户端密钥。 图6.ADuCM4050上的加密加速器的硬件框图 解决身份验证这一最终挑战的常见技术是使用非对称加密。对于此操作,服务器会生成一个公钥-私钥对。私钥只有服务器知道,客户端知道公钥。服务器使用私钥可以生成给定数据块的签名,例如要无线发送的数据包的摘要。签名被发送给客户端,后者可以使用公钥验证签名。这样,客户端就能确认消息是从服务器而不是恶意第三方发送的。此序列如图7所示,实线箭头表示函数输入/输出,虚线箭头表示无线发送的信息。 图7.使用非对称加密验证消息 多数微控制器没有用于执行这些非对称加密操作的硬件加速器,但可以使用Micro-ECC等专门针对资源受限器件的软件库来实现。该库需要一个用户定义的随机数生成功能,这可以利用微控制器上的真随机数发生器硬件外设来实现。虽然这些非对称加密操作解决了OTA更新期间的信任挑战,但是会消耗大量处理时间,并且需要将签名与数据一同发送,这会增加数据包大小。我们可以在下载结束时使用最后数据包的摘要或整个新软件应用程序的摘要执行一次此检查,但如此的话,第三方将能把不受信任的软件下载到客户端,这不太理想。理想情况下,我们希望验证所收到的每个数据包都来自我们信任的服务器,而且没有每次都需要签名的开销。这可以利用哈希链来实现。 哈希链将本节讨论的加密概念整合到一系列数据包中,以便在数学上将它们联系在一起。如图8所示,第一个数据包(编号0)包含下一个数据包的摘要。第一个数据包的有效载荷不是实际的软件应用程序数据,而是签名。第二个数据包(编号1)的有效载荷包含二进制文件的一部分和第三个数据包(编号2)的摘要。客户端验证第一个数据包中的签名并缓存摘要H0以供以后使用。当第二个数据包到达时,客户端对有效载荷进行哈希处理并将其与H0进行比较。如果它们匹配,客户端便可确定该后续数据包来自可信服务器,而无需费力进行签名检查。生成此链的高开销任务留给服务器完成,客户端只需在每个数据包到达时进行缓存和哈希处理,确保到达的数据包完整无损并验明正身。 图8.将哈希链应用于数据包序列 实验设置 解决本文所述存储器、通信和安全设计挑战的超低功耗微控制器是ADuCM3029和ADuCM4050.这些微控制器包含本文讨论的用于OTA更新的硬件外设,例如闪存、SRAM、加密加速器和真随机数发生器。这些微控制器的器件系列包(DFP)为在这些器件上构建OTA更新解决方案提供了软件支持。DFP包含外设驱动,以便为使用硬件提供简单灵活的接口。 硬件配置 为了验证本文讨论的概念,我们利用ADuCM4050创建了OTA更新软件参考设计。对于客户端,一个ADuCM4050 EZ-KIT®使用收发器子板马蹄形连接器连接到ADF7242。客户端器件如图9左侧所示。对于服务器,我们开发了一个在Windows PC上运行的Python应用程序。Python应用程序通过串行端口与另一个ADuCM4050 EZ-KIT通信,后者也以与客户端相同的配置连接一个ADF7242。但是,图9中右边的EZ-KIT不执行OTA更新逻辑,只是将从ADF7242接收到的数据包中继给Python应用程序。 图9.实验硬件设置 软件组件 软件参考设计对客户端器件的闪存进行分区,如图3所示。主要客户端应用程序具有非常好的移植性和可配置性,以便其他方案或其他硬件平台也可以使用。图10显示了客户端器件的软件架构。请注意,虽然我们有时将整个应用程序称为SSBL,但在图10中,并且从现在开始,我们在逻辑上将真正的SSBL部分(蓝色)与OTA更新部分(红色)分开,因为后者不一定需要完全在上述应用程序中实现。图10所示的硬件抽象层使OTA客户端软件可移植并独立于任何底层库(以橙色显示)。 图10.客户端软件架构 软件应用程序实现图3中的引导序列(一个用于从服务器下载新应用程序的简单通信协议)和哈希链。通信协议中的每个数据包都有12字节的元数据头、64字节的有效载荷和32字节的摘要。此外,它还有如下特性: ► 缓存:根据用户配置,支持不缓存或缓存闪存的一页。 ► 目录:ToC设计为仅容纳两个应用程序,并且新应用程序总是下载到最旧的位置,以保留一个备用应用程序。这称为A/B更新方案。 ► 消息传递:支持ADF7242或UART进行消息传递,具体取决于用户配置。使用UART进行消息传递可免除图9左侧的EZ-KIT,仅保留右侧套件用于客户端。这种有线更新方案对初始系统启动和调试很有用。 结果 除了满足功能要求并通过各种测试之外,软件的性能对于判断项目成功与否也很重要。通常使用两个指标来衡量嵌入式软件的性能:占用空间和周期数。占用空间是指软件应用程序在易失性(SRAM)和非易失性(闪存)存储器中占用的空间大小。周期数是指软件执行特定任务所使用的微处理器时钟周期数。它与软件运行时间相似,但在执行OTA更新时,软件可能进入低功耗模式,此时微处理器处于非活动状态,不消耗任何周期。虽然软件参考设计没有针对任何一个指标进行优化,但它们对于程序基准测试和比较设计权衡非常有用。 图11和图12显示了在ADuCM4050上实现的OTA更新软件参考设计的占用空间(不缓存)。这些图根据图10所示的组件进行划分。如图11所示,整个应用程序使用大约15 kB的闪存。鉴于ADuCM4050包含512 kB闪存,此占用空间非常小。真正的应用软件(为OTA更新过程开发的软件)仅需1.5 kB左右,其余用于库,例如DFP、Micro-ECC和ADF7242堆栈。这些结果有助于说明SSBL应在系统中扮演什么角色的设计权衡。15 kB占用空间的大部分是用于更新过程。SSBL本身仅占用大约500字节的空间,另外还有1 kB到2 kB的DFP代码,用于访问闪存驱动器之类的器件。 图11.闪存占用空间(字节) 图12.SRAM占用空间(字节) 为了评估软件的开销,我们在每次接收数据包时计数周期,然后计算每个数据包平均消耗的周期数。每个数据包都需要AES-128解密、SHA-256哈希处理、闪存写入和某种数据包元数据验证。数据包有效载荷为64字节且不缓存时,处理单个数据包的开销为7409个周期。使用26 MHz内核时钟时,大约需要285微秒的处理时间。该值是利用ADuCM4050 DFP中的周期计数驱动程序计算的(未调整周期数),并且是100 kB二进制文件下载期间(约1500个数据包)的平均值。为使每个数据包的开销最小,DFP中的驱动程序应利用ADuCM4050上的直接存储访问(DMA)硬件外设来执行总线事务,并且驱动程序在每次事务处理期间将处理器置于低功耗休眠状态。每个事务中不存在一个万能的状态如果我们禁用DFP中的低功耗休眠并将总线事务更改为不使用DMA,则每个数据包的开销将增加到17,297个周期。这说明了高效使用器件驱动程序对嵌入式软件应用程序是有影响的。虽然减少每个数据包的数据字节数也可以降低开销,但每个数据包的数据字节数翻一倍达到128时,周期数仅有少量增加,相同实验得到的周期数为8362。 周期数和占用空间也解释了先前讨论的权衡——缓存数据包数据而不是每次都写入闪存。使能缓存一页闪存后,每个数据包的开销从7409减少到5904个周期。此20%减幅来自于更新过程跳过了大多数数据包的闪存写入,仅在缓存已满时才执行闪存写入。其代价是SRAM占用面积增加。不使用缓存时,HAL只需要336个字节的SRAM,如图12所示。但是,当使用缓存时,必须保留一个相当于闪存一整页的空间,故SRAM占用增加到2388字节。HAL使用的闪存也会少量增加,原因是需要额外代码来判断缓存何时必须清空。 这些结果证明,设计决策对软件性能会有切实的影响。不存在一个万能的解决方案,每个系统都有不同的要求和约束,OTA更新软件需要视具体情况具体对待。希望本文阐明了在设计、实现和验证OTA更新软件解决方案时遇到的常见问题和权衡。 参考文献 Nilsson、Dennis Kengo和Ulf E. Larson。“智能车辆的无线安全固件更新”。ICC研讨会——2008年IEEE国际通信会议,2008年5月。

    时间:2021-03-05 关键词: 嵌入式 微控制器 OTA

  • 英飞凌推出OPTIGA™ Authenticate IDoT解决方案,以增强对仿冒设备的防范

    【2021年3月4日,德国慕尼黑讯】消费类设备、家用电器和工业机械始终面临着假冒备件和配件的风险。假冒产品可能会损害功能性、用户安全性并进而损害品牌价值。为了解决这个问题,英飞凌科技股份公司推出OPTIGA™ Authenticate IDoT防伪交钥匙解决方案,该解决方案将增强的身份验证与前所未有的配置灵活性相结合。OPTIGA Authenticate IDoT是业界领先的嵌入式安全解决方案,可提供增强的基于硬件ECC的安全性和出色的灵活性,以满足客户和应用的需求。 该解决方案具有-40°至+120°C的扩展温度范围,非常适合工业应用,并支持不断增长且无处不在的认证需求。其应用范围涵盖HVAC和净水过滤器的一次性用品,便携式设备、轻型电动车以及高度复杂的电动交通、工业和物联网(IoT)环境中的计算和机器人系统的可充电电池。 OPTIGA Authenticate IDoT采用坚固且经过验证的TSNP SMD封装,尺寸仅为1.5 x 1.5 x 0.38 mm3。它支持四种ECC验证模式:单向、双向、主机绑定和主机支持。设计人员可从三个温度范围,两个通信配置文件,三组存储器和四个集成的安全递减计数器中进行选择,这些计数器具有安全的生命周期管理、无外接LDO和强大的ESD保护。此外,OPTIGA Authenticate IDoT还提供独特的片上交钥匙数字证书和密钥对。 该解决方案还提供了评估和开发套件,以简化安全解决方案与完整SDK、主机代码库和C基础应用接口(API)的集成,从而为轻松进行应用测试提供了强大的平台。这些工具基于最新的PSoC™6 BLE原型设计套件,具有完整编程器和调试器、BLE和Wi-Fi功能。 供货情况 OPTIGA Authenticate IDoT采用经过验证的坚固封装,针对尺寸受限的设备和应用进行了优化,现已提供样品。

    时间:2021-03-04 关键词: 英飞凌 ECC 嵌入式

  • 最全!盘点国内RISC-V内核MCU厂商

    虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量芯片公司崛起,其中有很多公司想在RISC-V新赛道有一番作为,毕竟ARM内核早已是红海,而RISC-V尚处于蓝海。今天痞子衡就为大家盘点一下发布过RISC-V MCU产品(不一定已量产)的厂商: 注:本文会持续更新,欢迎大家留言告诉我新晋国内RISC-MCU厂商以及产品。 一、核芯互联 璇玑CLE 璇玑CLE系列是核芯互联基于32位RISC-V内核(夸克Q系列)推出的通用嵌入式MCU处理器,主要适用于白色家电、工业控制、物联网等对稳定性、功耗和计算能力要求较高的应用领域。 璇玑CLE系列具有超高带宽与两级流水RISC-V 哈佛体系结构,在最高工作频率32MHz下的计算性能可达到45 DMIPS,满足超低功耗设计,全功能待机功耗为7.5μA,动态功耗为51μA/MHz,适用于1.6V-5.5V超宽工作电压。璇玑拥有大容量eFlash、代码缓存以及数据缓存,通信外设接口丰富,并内置高精度OSC振荡器。值得一提的是,璇玑CLE系列RAM达到48KB,可充分满足不同家电和应用场景的控制需求。 发布时间:2019.04 产品主页:N/A 二、兆易创新 GD32VF103 GD32VF103系列MCU采用了全新的基于开源指令集架构RISC-V的Bumblebee处理器内核,是兆易创新(Gigadevice)携手中国领先的RISC-V处理器内核IP和解决方案厂商芯来科技(Nuclei System Technology),面向物联网及其它超低功耗场景应用自主联合开发的一款商用RISC-V处理器内核。 GD32VF103系列RISC-V MCU提供了108MHz的运算主频,以及16KB到128KB的片上闪存和6KB到32KB的SRAM缓存,gFlash®专利技术支持内核访问闪存高速零等待。Bumblebee内核还内置了单周期硬件乘法器、硬件除法器和加速单元应对高级运算和数据处理的挑战。 发布时间:2019.08 产品主页:http://www.gd32mcu.com/cn/product/risc 三、沁恒微电子 CH32V103 CH32V103系列是以RISC-V3A处理器为核心的32位通用微控制器,该处理器是基于RISC-V开源指令集设计。片上集成了时钟安全机制、多级电源管理、通用DMA控制器。此系列具有1路USB2.0主机/设备接口、多通道12位ADC转换模块、多通道TouchKey、多组定时器、多路IIC/USART/SPI接口等丰富的外设资源。 发布时间:2020.06 系列主页:http://special.wch.cn/zh_cn/RISCV_MCU_Index/ 产品主页:http://www.wch.cn/products/CH32V103.html 四、乐鑫科技 ESP32-C3 ESP32-C3 是一款安全稳定、低功耗、低成本的物联网芯片,搭载 RISC-V 32 位单核处理器,支持 2.4 GHz Wi-Fi 和 Bluetooth LE 5.0。为物联网产品提供行业领先的射频性能、完善的安全机制和丰富的内存资源。ESP32-C3 对 Wi-Fi 和 Bluetooth LE 5.0 的双重支持降低了设备配网难度,适用于广泛的物联网应用场景。 ESP32-C3 搭载 RISC-V 32 位单核处理器,时钟频率高达 160 MHz。具有 22 个可编程 GPIO 管脚、内置 400 KB SRAM,支持通过 SPI、Dual SPI、Quad SPI 和 QPI 接口外接多个 flash,满足各类物联网产品功能需求。此外,ESP32-C3 的耐高温特性也使其成为照明和工控领域的理想选择。 发布时间:2020.12 产品主页:https://www.espressif.com/zh-hans/products/socs/esp32-c3 五、中微半导体 ANT32RV56xx ANT32RV56xx集成RISC-V内核的32位微控制器。该系列芯片搭载芯来科技(Nuclei System Technology) N100系列超低功耗RISC-V处理器内核,集成模拟外设并简化设计,轻松应对消费电子对高算力、低功耗的要求。 发布时间:2020.12 产品主页:https://www.mcu.com.cn/production/microcontrollers-risc-v_7.html 六、中科蓝讯 AB32VG1 AB32VG1采用中科蓝讯自主RISC-V内核,提供了125MHz的运算主频(最高可超频至192MHz),片上集成RAM 192Kbyte,Flash 1Mbyte,ADC,DAC,PWM,USB,SD, UART,IIC等资源。 发布时间:2020.12 产品主页:http://www.bluetrum.com/product/ 七、航顺芯片 HK32U1xx9 HK32U1xx9系列产品采用异构集成架构:芯来RISC-V处理器N203负责通信及控制;Arm Cortex-M3负责运算。此外,该芯片还带有MMU硬件级系统资源访问权限管理(配置颗粒度细化到每个外设)、自研IPC双核通信控制协议、高效实现的双核间数据交互,并支持双线JTAG/SWD调试接口和五线JTAG调试接口。 发布时间:2021.01 产品主页:http://www.hsxp-hk.com/ 八、芯来科技 开源蜂鸟E203 蜂鸟E203处理器由芯来科技开发,是国内第一个完善的开源RISC-V处理器项目,提供了一套从模块到SoC,从硬件到软件,从运行到调试的完整解决方案,并且配备完整的文档,书籍和开发板。其研发团队经验丰富,使用稳健的Verilog 2001语法编写的可综合的RTL代码,以工业级标准进行开发,注释丰富、可读性强、易于理解。 发布时间:2018.04 产品主页:https://www.nucleisys.com/ 九、华米科技 黄山1/2号 华米科技发布了全球可穿戴领域第一颗人工智能芯片“黄山1号“。这颗芯片基于RISC-V指令集架构开发,240MHz主频、55nm制程,并且集成了AON(Always On)模块控制器和神经网络加速模块。 黄山1号不仅功耗低,还可以自动将传感器数据搬运到内部 SRAM之中,让数据存储性能更快、更稳定。而更为值得称道的是,它集成了神经网络加速模块,能够本地化处理AI任务 —— 通过Heart Rate、ECG Engine、ECG Engine Pro、Arrhythmias四大驱动引擎,对心率、心电、心律失常等进行实时监测与分析,可广泛应用在各类智能可穿戴设备中。 发布时间:2018.09 产品主页:https://www.huami.com/news/51 产品主页:https://www.huami.com/news/118 十、物奇科技 WQ5000/7000系列 WQ5106本地语音识别芯片是一颗高性能、人工智能芯片,主要应用于语音自动识别。集成了两颗高性能32位RISC CPU @200MHz,支持基于高速片上总线的浮点运算和SIMD运算,内置高速、大容量DDR DRAM以及高达800KB的片上SRAM,为系统提供了可靠、高速的数据存储。基于优化的算法,该芯片的人工智能系统可以有效地实现深度学习(Deep Learning,DL)的功能,大大降低系统的功耗。 发布时间:2019.04 产品主页:http://www.wuqi-tech.com/news/10.html 产品主页:http://www.wuqi-tech.com/product/7.html 十一、跃昉科技 BF-2细滘 格兰仕控股的芯片业务子公司跃昉科技第一代芯片BF2芯片(细滘)已产业化(基于赛昉科技提供的RISC-V处理器IP),涵盖WiFi和蓝牙功能,已通过安全认证,可用于智能家电,已应用在格兰仕微波炉上。另外,细滘芯片已与涂鸦、京东等IoT公共云衔接,还用在智能灯炮、智能插座、家电主控等互联产品上。 发布时间:2019.10 产品主页:N/A 十二、泰凌微电子 TLSR9xxx 泰凌微电子推出了基于 RISC-V 的全新 Telink TLSR 9 系列高性能 SoC 芯片,将主要适用于可穿戴设备和各类 IoT 应用产品。 Telink TLSR 9 系列集成了 32 位 RISC-V MCU(晶心D25内核),标配版本最高运行速度达 96MHz,支持 5 级流水线,计算能力达 2.59 DMIPS/ MHz,CoreMark 跑分 3.54/MHz,此外还集成了 DSP 扩展指令以及浮点运算模块,便于音频算法和 Sensor 算法的开发。 发布时间:2020.08 产品主页:https://www.telink-semi.cn/products/multiprotocol-iot/ 十三、博流智能 BL60x/BL70x BL602 是一款 Wi-Fi + BLE 组合的芯片组,用于低功耗和高性能应用开发。无线子系统包含 2.4G 无线电,Wi-Fi 802.11b/g/n 和 BLE 基带/MAC 设计。微控制器子系统包含一个低功耗的 32 位 RISC CPU,高速缓存和存储器。电源管理单元控制低功耗模式。此外,还支持各种安全性能。 BL702 是一款 BLE + Zigbee 组合的芯片组,用于低功耗物联网应用开发。无线子系统包含 2.4G 无线电,BLE5.0 和 802.15.4 基带/MAC 设计。微控制器子系统包含一个低功耗的 32 位 RISC CPU,高速缓存和存储器。电源管理单元控制低功耗模式。此外,还支持各种安全性能。 发布时间:2020.08 产品1主页:https://www.bouffalolab.com/bl602 产品2主页:https://www.bouffalolab.com/bl70X 十四、平头哥 CH2601 CH2601是基于玄铁E906的RISC-V生态芯片,最高主频220MHz,支持AliOS Things物联网操作系统、平头哥YoC软件平台及平头哥剑池开发工具(CDK)。 发布时间:2021.02 产品主页:https://occ.t-head.cn/vendor/detail/index?spm=a2cl5.14293897.0.0.d149132dVkpkXj&id=3878941840279867392&vendorId=3706716635429273600&module=1 END 来源:痞子衡嵌入式,作者:痞子衡 版权归原作者所有,如有侵权,请联系删除。 ▍ 推荐阅读 呵,你会51单片机的精确延时吗? 关于画电路图的10大分歧,你站哪边? 早期MCU芯片是怎么加密的? →点关注,不迷路← 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-03-04 关键词: MCU RISC-V 嵌入式

  • “单片机”这一词已经没意义了?详解单片机和嵌入式行业

    入坑嵌入式开发多年的我,面对芯片及其相关的软件开发技术的快速发展变化,经常会去思考,这些发展变化的内在推动力和外在合理性在哪里,这些发展变化对我们有哪些启发和引导,身处旋涡中心应该何去何从,才能保证自己不被历史洪流冲走,才能不断提升自己的价值。 单片机 是中文名,对应的英文名称是“Single Chip Microomputer”,很多人可能奇怪平时不是都说MCU(Micro Control Unit)吗? 单片机呢?就是在一个芯片(Chip)上集成了CPU、SRAM、Flash及其他需要模块,在一个Chip上实现一个微型计算机系统,所以就叫Single Chip Microcomputer,也就是单片机了。 英文是很准确的。这里有好几个词你可以体会下各自含义:microcomputer、computer、system、microcontroller。不严格区分的话这些词很多时候可以互相替换和通用的,但是严格说其实各自有不同代指的。譬如computer,指的就是电脑,你可以理解为就是电脑,譬如笔记本、台式机这些。当然很多年前的电脑很庞大很笨重,所以computer就是指的这种有机箱外壳,有键盘鼠标,很庞大笨重,通用性强的电脑。而microcomputer指的就是单片机这类东西,它也是一个独立的电脑系统,有CPU和内存和外设这些,能跑计算机程序。但是他相对于computer来说体积很小,而且不是通用的而是专用的,所以叫microcomputer。 那microcontroller呢? 现在很多单片机厂商都把自己的单片机叫microcontroller(微控制器) ,其实我个人理解,觉得microcontroller的重点在于controller,也就是说他们想强调这个chip中集成的system是一个controller,擅长控制。而不是一个DSP(擅长运算)。 嵌入式的全称是嵌入式系统,英文是Embeded system,所以可以看出嵌入式是一个system。 那这个范围太宽了,说真的你很难找到不属于嵌入式的system······所以我经常觉得嵌入式这个名词根本是废话,根本没意义。好在这个理解只是广义上的嵌入式的定义,但是我们平时讲嵌入式大多时候是从狭义上理解的。 单片机的技术和市场状况 8位和4位机 做这类产品的以前都是台湾一些小芯片厂商。这些年中国大陆也涌现了很多这类芯片厂商,这些单片机行业大多对标某个具体应用领域,对行业需求很熟悉,直接推出适用这个行业的解决方案。外行的人可能根本都没听说过这种单片机的型号和相关信息。 51单片机 51单片机之所以出名并活到现在,是因为Intel后来开放了51内核的版权,所以很多公司很多人可以毫无顾忌的使用它而不担心付费或版权风险。实际上到了现在(2018年),51单片机已经是很老很没有技术优势的解决方案了,但是为什么还在大量使用?主要有以下几个原因: 二是51单片机也够便宜,很多对性能没有过多要求的产品干脆就用51也挺好。 很多同学问我还要不要学51单片机?我认为还是要学。 另一个原因是确实有时候实际开发也会遇到用到51单片机的,所以学会了也算是个拿得出手的技能。所以如果你要学习单片机开发,从51单片机入手绝对不会错。但是要记得不要沉迷于51了,要迅速学会51单片机后,迅速继续学习更现代更实用的其他单片机(譬如stm32)。很多人学会51后就不动了,这就好像幼儿园毕业就不继续读书了一样,是不对的。 终于到了STM32这个当红辣子鸡了,ST于2007年发布了第一款STM32,至今已经11年了。STM32是ARM Cortex-M内核的单片机,实际上同样使用ARM Cortex-M系列内核的单片机还有很多(譬如NXP的LPC系列,原Freescale的K60系列,台湾新唐的M051系列,国内如兆易创新的GD32系列等),STM32只是其中的代表作而已。 怎么说呢,个人觉得ARM内核的单片机很适合当前时代,尤其STM32这种,不管硬件配置还是开发工具都深得市场认可,普及度越来越高。强烈建议大学学单片机就学STM32,会玩STM32很有价值。 其他单片机 高性能高价格单片机 同时从价格角度讲这些单片机大多在人民币30元以上,甚至高达100多元。这些真的是单片机中的战斗机,价格都能吓死人了。对于这类单片机,我个人其实很不看好。其实写这篇长文,就是想解释我为什么不看好这类单片机。感兴趣的同学可以继续看下文分析。 嵌入式领域目前最火的就是 ARM+linux和ARM+android。 嵌入式级别的ARM因为有MMU所以可以很好的跑复杂OS,因此虽然芯片本身也可以裸机运行,但是基本没有人用这类芯片来跑裸机或者RTOS的。都会上操作系统。 总的来说,嵌入式系统的复杂性高、开发难度大、学习曲线长。因为软件上的复杂性,导致出bug的可能性大。一旦出bug查找起来也更加需要技巧和经验。所以很多公司用嵌入式linux或android做产品问题很多,这一方面和开发者的技术能力有关,另一方面和公司不能花时间和成本去潜心把产品做稳定做成熟有关。 其实分析到这里,大家也知道了嵌入式和单片机的真正区别,那就是有没有linux或android这类复杂操作系统。 譬如从C语言角度来讲,我的《嵌入式linux核心课程》第4部分《4.C语言深度解析》这个课程,就是专门针对嵌入式linux开发中C语言功力不足的人推出的。很多做了多年单片机的同学看了后都感慨,真的是不做linux不知道C语言水深。结构体和指针这些元素在单片机编程中完全体现不出来魅力,但是在linux内核中却得到了完美的发挥和释放。不去真正研究,实在很难体会出那种美感和震撼。 嵌入式和单片机有没有交集呢?这里说的交集意思是: 某些产品既可以用嵌入式来解决,也可以用单片机来解决。 但是近两年情况发生了变化。 首先是很多高端单片机的配置和价格越来越高。 譬如2017年10月发布的NXP imxRT1052系列单片机,号称跨界处理器。 为什么叫跨界?跨的是哪两界? 而嵌入式SoC不同,譬如S5PV210内部只有CPU和少量SRAM,它要正常工作需要外部集成DDR SDRAM和Flash(EMMC)。所以嵌入式的system不能在一个chip上,一般典型的嵌入式系统的system由一块核心板构成,这块核心板上集成了SoC、DDR SDRAM、Flash、电源模块等, 这叫嵌入式系统 。而所谓跨界处理器,跨的就是单片机和嵌入式这两界。这个imxRT1052内部集成了CPU和SRAM,但是没有Flash,它需要外部提供独立的Flash芯片才能组成一个system。 顺便多说一句,NXP为什么这么设计?其实是因为单片机内置Flash都很贵,imxRT1052为什么能比同样性能的STM32便宜那么多,主要原因就是因为他没有内置Flash。 算了,懒得吐槽F7和H7了。就说这个跨界处理器imxRT1052吧,这东西主频有600MHz,有消费级和工业级,带各种外设(反正你能用到的基本都有了),可以带最大分辨率1024*768的TFT LCD(当然了需要外接SDRAM作为显存)。这东西相对于普通单片机来说就是神一般的存在啊,一般玩单片机的看到这个数据吓得直接就跪下叫爸爸了。 之所以F7和H7没掀起大浪关键还是价格太吓人了,一般人听说100多直接心里骂娘转身走人了,根本不想了解你的性能。而imxRT1052的30元确实很诱人,听起来似乎真的是高性能低价格了,很多人甚至据此判断NXP要“干死”ST了。 高性能跨界处理器初看似乎很不错,实际上并没有那么容易成功。原因就在于这种高性能单片机实际上和低性能高性价比的嵌入式linux解决方案比并没有优势。 譬如NXP的imx6ul,内置Cortex-A7单核心,最高主频1.2GHz,也是工业级,各种你能想到的外设都有了。标配256MB SLC Nand和256MB DDR的核心板,市场最低售价119元,比RT1052还低一些。 很多人可能会说,我不会嵌入式linux开发,我只会单片机开发啊。所以你linux的方案性价比再高跟我没关系,单片机的才跟我有关系。我想说这绝对是一种误解,百分百的误解。为什么? 所以不要觉得都是单片机就亲切,就能玩。实际上要把高端单片机完全发挥性能做出好看的GUI并且用到项目中解决掉所有的BUG并不是一件容易的事情。 今天谈的东西都比较浅,主要是讲了下单片机和嵌入式系统的由来和差异。引出了高端单片机(STM32H7、imxRT1052等)和高性价比嵌入式linux解决方案的的一个对比。 总的来说,我的观点是 :能用几块十几块的单片机就用单片机,如果这些高性价比的单片机不能满足要求非要上几十块的高性能单片机,那你确实应该考虑下是否应该一步到位上高性价比的嵌入式linux解决方案。很多人担心linux不会开发,其实不应该这么考虑。 END 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-03-03 关键词: 单片机 嵌入式

  • 用于嵌入式视觉和AI应用的低功耗旗舰产品

    用于嵌入式视觉和AI应用的低功耗旗舰产品

    Shanghai, China, 3 March 2021 * * * 世界领先的嵌入式和边缘计算技术供应商德国康佳特推出了全新低功耗 SMARC 2.1计算机模块。该产品在本次德国纽伦堡世界嵌入式(Embedded World)线上展会上亮相,采用NXP i.MX 8M Plus处理器,用于工业边缘分析、嵌入式视觉和人工智能(AI)应用。凭借机器学习和深度学习能力,这款超低功耗的conga-SMX8-Plus模块使工业嵌入式系统能够观察和分析周围环境,实现情景感知、视觉检测、鉴别、监控、追踪,以及基于手势的无接触机器操作和增强现实(AR)功能。 这款采用Arm Cortex-A53四核处理器的平台具有多项技术亮点,包括用于提升AI算力的集成神经处理单元(NPU),以及可并行实时处理透过两个集成MIPI-CSI摄像头接口产生的的高清图像与视频流的图像信号处理器(ISP)。这款全新SMARC模块具有完善的配套,例如预制的3.5英寸载板、Basler摄像头,以及AI软件堆栈支持,为快速推出产品的概念提供了验证。这种具备低功耗视频和AI功能模块的尺寸仅相当于信用卡,其应用领域随处可见,包括智能农业、工业制造、零售、交通、智能城市、智能建筑等等。 康佳特产品管理总监Martin Danzer表示:“工程师们能利用新款SMARC模块丰富而高效的功能以及我们完善的产品生态系统,并通过PCIe Gen 3和2个 USB 3.0 、2个 SDIO接口来实现面向具体应用的功能,构建出针对视觉和AI应用的2-6W低功耗平台,并确保出色的可靠性和稳定性。根据具体型号的不同,新款模块能适应-40℃到 85℃的广温度范围。” 基于i.MX 8M Plus处理器的新SMARC模块具有多种专用处理单元,能以极低的功能实现令人惊艳的嵌入式视觉和AI计算响应速度。其优点包括: · 除了4个高性能多用途Arm Cortex-A53处理器核心外,神经处理单元(NPU)额外增添了2.3 TOPS的专门AI算力。 · 集成的图像信号处理器(ISP)可处理3个60帧/每秒的高清视频流,提高视频质量。 · 高质量数字信号处理(DSP)无需连接云端即可实现本地语音识别。 · Cortex-M7处理器提供实时操控功能,以及一个具有时间同步网络功能的以太网端口,同时还能作为故障保险单元来使用。 · 除了用于硬件加速ECC及RSA加密的加密模块(CAAM),Arm TrustZone方案还集成了资源域控制器(RDC) 用于独立执行关键软件;以及安全的HAB(High Assurance Boot)启动模式,防止未授权的软件在启动期间被执行。 规格详情 面向视觉和AI应用的新款SMARC 2.1模块具有四个不同的4核NXP i.MX 8M Plus处理器,它们均基于Arm Cortex-A53架构,可适应工业环境(0℃ 到+60℃)乃至更宽广的温度范围(-40℃到+85℃),同时集成了ECC功能,支持最大6GB的LPDDR4内存。该模块可同时驱动最多三个显示屏,并具有硬件加速视频解码和编码功能(包括H.265),可直接接收两个集成MIPI-CSI接口发来的高清摄像头视频流。在数据存储方面,可配置最多板载128eMMC,並可在安全的pSLC模式下运行。外设接口则包括1x PCIe Gen 3、2x USB 3.0、3x USB 2.0、4x UART、2x CAN FD和14x GPIO。在实时网络方面,该模块具有1x Gb接口,且支持TSN技术和传统Gb以太网。模块上可选配板载M.2无线网卡及蓝牙LE,从而配备无线连接能力。在声音方面,还有2x I2S接口。该模块支持的操作系统包括Linux、Yocto 2.0和Android。

    时间:2021-03-03 关键词: AI 嵌入式视觉 嵌入式

  • 嵌入式工程师学习Qt的几种开发方式

    作者 | 李肖遥 转自 | 技术让梦想更伟大 qt值得学习吗? 嵌入式要学的东西真的很多,我们可能会说不写界面的话就不用学qt了?我不赞同。 Qt的实现主要是采用p-impl手法,实现接口与实现分离,它有很好的消息循环机制,有的对象与线程的相关性,它也有借助moc生成反射元信息,这种设计方法至今仍然非常适用。 qt内核部分其实是完全和界面无关的,你完全可以抛开Qt GUI部分来学习和使用Qt。当你完完全全学习了qt及其理念后,你会发现写优雅的代码是一件十分简单的事情,它可以应用到你之后的所有过程中去。 那么哪种Qt开发方式较好或者容易入门呢? QT做UI界面一般单纯使用C++硬编码的方式,可以直接采用QWidget部件来做,而不是采用QT Designer做UI界面,也不是采用QML+Javascript,虽然灵活但是这样的话代码量大,通常采用QT开发,有如下三种方式: 使用QT GUI框架,单纯硬编码 使用QT Designer做UI界面,类似于MFC一样拖控件,然后再使用C++写逻辑。 采用QML做UI,JavaScript写逻辑,C++写后台,三种语言混合编程。 那么Qt常见的有多少种开发方式呢?一般情况下分为下面2种 第一种:纯QtCreator方式,QtCreator编码+MinGW或MSVC或其他编译。 第二种:VS+Qt库,把Qt当成一个界面库来在VS中调用。VS编码+MSVC编译。 使用VS+Qt的正确打开方式 如果开发的程序只管windows上跑,不用跨平台,也不关心是否需要使用Qt Creator打开,那么推荐你使用VS+Qt方式进行开发。 这种情况需要安装VS、Qt软件,并且在VS中安装QT插件,配置环境变量等等,具体的安装配置教程大家可以参考网上的,亲手尝试一下,本文注重方法。 装好重新打开VS,菜单栏多出个QT VS Tools,点击QT Options可以进行下一步操作 VS速度和调试功能完爆Qt Creator,开发起来很爽。 使用Qt Creator的打开方式 QtCreator+MSVC 需要安装VS(我们主要使用它的编译器)、Qt Creator软件,MSVC调试器安装,通过windows SDK工具安装调试器。配置Qt Creator编译器和调试器 打开Qt Creator,选择“工具”->“选项”,再选择“Kits”->“编译器”,可以看到Qt已经自动检测到MSVC编译器了。 同时在“Kits”->“Debuggers”下,也自动检测到调试器了。 然后我们选择“Kits”->“构建套件”,然后选择Desktop Qt 5.12.0 MSVC2017 64bit, 配置C/C++编译器均为:Microsoft Visual C++ Compiler 15.0(x86_amd64); 配置调试器为:Auto-detected CDB at D:\Windows Kits\10\Debuggers\x64\cdb.exe。 Qt Creator+MinGW 安装Qt creator后,直接使用Qt Creator编码,使用自带的MinGW编译,这个是最简单的,无需外界其他任何辅助。 同时安装步骤也是最简单的,直接装完就可以做开发,没有过多的配置过程。 推荐使用QtCreator+MSVC方式,在速度和跨平台都占优,调试功能稍弱,另外这种方式不存在工程转换的问题,可以更好的支持跨平台开发。 结论 如果需要考虑跨平台,那么最好不要使用VS+Qt这种方式,工程转换路径、库、配置有很多麻烦的地方; MSVC在编译速度和运行速度上都完爆MinGW,不推荐使用MinGW编译,这个大家体验一下就知道了。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-03-01 关键词: QT UI 嵌入式

  • 嵌入式中的合作开发——函数指针

    比如A需要完成项目的整体逻辑功能,而整个逻辑功能包含许多具体的小功能,但A又没有时间或能力来实现这些小功能,这时可以让B来协助实现函数内部的功能。 通常的思路是,B写好某个函数后,A直接通过B声明的函数调用即可。但这会有一些问题,例如B写好函数之后,A只能使用B声明的函数名来使用,假如B声明的函数名的命名规则很不符合A的口味,A用起来就很不爽,哈哈。那这样怎么办呢?聪明的A可以自己再声明一个自己喜欢的函数名,并通过函数指针传递的功能来获得B的功能。 比如A需要一个求和功能的函数,但他没时间写,他可以自己先声明一个函数指针: //a中声明一个指针函数,其函数内部的功能需要另一个人b来完成 int (*mysum)(int, int)=0; 这一步相当于函数指针初始化,也相当于函数注册,就是将A声明的函数指针,通过指针赋值的方式,来获得B实现的函数功能,相当于是给B写的函数套上一层A的壳: //初始化指针函数,传入 b写的函数的函数名,//通过函数指针赋值,main中声明的函数,就可以使用b写的函数功能了 int init_mysum_func(int(*func_handle)(int,int)){ mysum = func_handle; return 0;} 3函数的具体实现-B负责 B这个人只要按照A声明的函数指针的格式(返回值与参数类型一致,函数名可以随意)完成函数内部功能即可,这里以简单的求和为例,在b.h文件中,B实现的功能如下: int sum_by_b(int a, int b){ return a+b;} 4项目整理逻辑-A负责 测试结果: mysum(1,2) = 3--------------------------------Process exited after 0.007424 seconds with return value 0请按任意键继续. .

    时间:2021-03-01 关键词: 函数指针 嵌入式

  • 针对边缘计算更宽广的工作温度范围——从高端COM-HPC到低功耗SMARC

    针对边缘计算更宽广的工作温度范围——从高端COM-HPC到低功耗SMARC

    Shanghai, China, 25 February 2021 * * * 在2021年德国纽伦堡世界嵌入式展(Embedded World)线上展会中,世界领先的嵌入式和边缘计算技术供应商德国康佳特聚焦客户端的加固挑战,推出了面向各性能水平的诸多平台。它们涵盖了宽广的工作温度范围,从高端COM-HPC 到低功耗SMARC一应俱全。其中,针对COM-HPC 服务器模块的系列解决方案尤其惊艳,它们旨在解决这类边缘计算平台所面临的热设计功耗(TDP)显著升高的问题——在更广阔的温度范围中,这是一项尤为艰难的任务。 这些聚焦背后的驱动力是对坚固的边缘和实时雾计算技术日益增长的需求,企业需要这些技术助力在极端严酷的环境下推进数字化项目。这类高耐性平台的典型用途包括铁路、道路交通和智能城市基础设施、海上钻井平台和风电场、配电网络、油气和淡水泵系统、电信和广播网络、分布式监控和安保系统等。除此之外,连接到物联网/工业4.0网络的工业和医疗设备、户外摊位、数字标牌系统,乃至物流车辆等汽车类应用,都是这类技术的目标市场。 康佳特推出的新平台适用于恶劣环境,支持从-40℃到+85℃的极端温度范围,且包含BGA焊接的处理器芯片,在防撞击和防振动的同时具备强大的电磁干扰抗性。它还可选配保护涂层,以防冷凝水、盐水和灰尘进入平台。 配备第11代英特尔®酷睿™可拓展处理器的新款COM-HPC和COM Express 本次展会上的亮点之一是基于COM-HPC和COM Express标准且适用于严酷环境的高端x86计算机模块。conga-HPC/cTLU COM-HPC Client Size A和conga-TC570 COM Express Compact模块采用可拓展的新款第11代英特尔®酷睿™处理器,可耐受-40℃到+85℃的极端温度范围。两款模块均首次支持用于连接外设拥有充沛带宽的PCIe 4.0 x4端口。 采用英特尔凌动® x6000E系列处理器的平台 支持-40℃到+85℃扩展温度范围的康佳特加固型平台采用了英特尔凌动® x6000E、赛扬®和奔 腾® N&J系列处理器,支持SMARC、Qseven、COM Express Compact和Mini等规格尺寸的计算机模块,同时还提供Pico-ITX规格的单板款式(SBC)。它们不仅性能更高,还具有时间敏感性网络(TSN)、英特尔®时序协调运算(英特尔®TCC)、Real Time Systems(RTS)提供的虚拟化技术支持,以及在BIOS中集成的内存纠错功能,在工业实时计算市场受到格外关注。 采用i.MX 8M Plus处理器的新款SMARC 2.1计算机模块 采用i.MX 8M Plus处理器的全新SMARC 2.1计算机模块为本次展出画上了圆满句点。这款超低功耗的嵌入式及边缘计算平台不仅支持宽广的工作温度范围,且功耗仅有2-6W。它具有4个高性能Arm Cortex-A53处理器核心和一个额外的神经处理单元(NPU),最多可提升2.3 TOPS的AI算力。这款模块专为边缘设备上的AI推理和机器学习设计,其图像信号处理器(ISP) 可通过2个集成的MIPI-CSI接口来获取双摄像头的数据,并进行处理和分析。 面向所有宽温范围平台的拓展工具包 上述平台提供了在严酷环境下可靠运行所需的各类功能和服务。其配套的工具包包含了加固式被动冷却设备、可防止湿气和冷凝水腐蚀的可选保护涂层、提供推荐的载板线路图,以及专为宽温范围下的可靠运行而设计的多种组件。除了这些令人赞叹的技术功能,我们还提供包括温度筛查、高速信号合规测试、配套设计服务等全面的服务,另有各种培训课程,让康佳特的嵌入式计算机技术产品更加易用。

    时间:2021-02-25 关键词: 边缘计算 COM-HPC 嵌入式

  • 带你看嵌入式云IOT技术圈的2021年规划

    春节假期很快,一眨眼就要继续开启新的一年的奋斗历程,希望各位兄弟姐妹在牛年继续发奋图强,厚积薄发,争取在年底有更多的收获,实现牛年的目标和理想;而嵌入式云IOT技术圈将持续陪伴着大家,为大家带来更多的技术干货以及个人的所见所得,持续分享,共同进步。 1、说说公众号的发展 2020年,公众号分享的内容最多的是基于MCU相关的一些应用,涉及的范围也比较广,特别是在小熊派这个开发板上做了很多东西,做东西解决问题的同时也让我收获了很多,但我觉得它可以做的东西还有很多,未来还可以继续将它的应用发挥到极致。 2021年,本公众号将继续以开源项目为主,继续在腾讯、华为、RT-Thread开源社区做贡献与分享,今年打算分享的内容会比往年多很多,言下之意也就是今年我会投入更多的时间来做开源和分享,接下来的规划是分享RTOS(以TencentOS-tiny,RT-Thread,华为鸿蒙OS为主的嵌入式MCU项目应用),嵌入式ARM Linux产品应用开发(以百问网IMX6UL开发板为主),PC端软件开发(C# WFPF、QT)。 2、说说个人工作 新的一年,公司迎来重大发展,人员也在逐步的扩增同时业务需求订单也将越来越多,这也就意味着我们研发人员身上的责任和担子会比往年要重得多,抓住机遇,迎接挑战,力争成为一名真正的奋斗者,这样才能获得更多的报酬和嘉奖,迎接更加幸福美好的生活! 3、说说个人学业 两年前报了个第二学位计算机科学与技术的本科继续教育,其目的是帮自己打好基础,让自己技术成长的同时能扎稳脚跟;时间过得很快,今年春季就要开始写毕业论文了,这也就意味着顺利的话在今年年底就可以拿到毕业证以及学位证了,到时我就拥有两个本科学历。在此同时,美国卡罗尔大学的MBA课程也要接着上,今年开始上专业课,随之而来的就是各种课题研究、各种调研报告、各种实践报告等等,在工作之余需要完成学业、还要分享、还有工作上专业技能的学习等等,不得不说压力还是相当大的,要做好能打硬仗的准备,硬扛的同时还要注意身体健康,加强锻炼。 4、说说个人家庭 目前个人没有任何经济上的压力,也不用考虑房贷等等,带小孩方面老婆也操了很多心,所以我才有更多的时间去专注于我个人的工作和学业以及其它的一些事业,但是不管怎么忙,还是要花一些时间好好生活、陪伴家人的,毕竟再怎么努力最后都是为了家庭,一个好的家庭氛围才能让事业等等更旺,不然挣再多的钱,博取再多的功名都会因为家庭不圆满而导致最终崩塌。 5、说说个人财务展望 近两年来个人收入方面处于一个持续上升的趋势,收入主要来源是工资以及其它的一些收益,这与我当初所设定的目标和预期一致;在收入的同时还要学会守财,学会如何能够有持续的睡后收入,这是非常重要的!所以学习财务管理、财务报表、个人投资理财等等将会是接下来的重中之重,当然我也会将我学习到的东西分享给大家,和大家一起共同成长! 其它的暂时没想到,希望2021年能够在我的预期下顺利进展,也希望能给大家带来更多有用,实用的知识和心得分享! 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-02-25 关键词: IoT 嵌入式

  • 一个值得学习的LCD驱动框架

    今天看到大佬肖遥兄分享的一篇文章:【架构篇】嵌入式编程中如何给代码的结构分层提到了高内聚,低耦合,软件分层等等的概念。之前又有小伙伴在后台留言说让我分享一篇这样的文章,所以今天它来了! 废话不多说,理论讲太多没啥感觉,这些条条框框本质就是基于面对对象的设计模式相关的一些理论,设计模式就是前人实践多了发现一些规律然后总结出来的那么一套好用的框架,所以咱们直接出干货,硬肝!以小熊派上的SPI OLED驱动为例,将原来开发包里的LCD驱动做一些简单的改造,然后我们根据需求设计如下的驱动模型框架,分为模型、驱动、设备三个部分,我们先不考虑太细节的东西,也不会把这个东西一开始就做得特别复杂,这样不利于理解,于是我们构建如下的框架思维导图: 1、LCD驱动框架数据结构 框架提供一些什么能力呢?我是这么来做的,非常简单: 这里提供了将驱动框架与驱动进行对接的能力,&lcd_driver拿到的是定义在驱动文件里的一个已经赋值了的结构体lcd_driver,这样,当我在别的地方定义一个LCD_Driver_Model的变量,就可以将这个变量与驱动结构体进行对接,这样就可以通过这个变量来操作驱动结构体里的接口了。 2、LCD驱动数据结构 LCD驱动这个数据结构要做的事情就是提供操作LCD驱动能力的接口,这个接口的设计与硬件无关。 前面1小节说过,驱动框架依赖于驱动接口,这样的话我们需要实现驱动接口里的方法,在对应的方法里,我们要去调用LCD设备相关的接口,进而去操作LCD设备,以下是接口对应的实现: 3、LCD设备数据结构 LCD设备所需要做的事情就是将这个数据结构里的功能函数与真实的LCD驱动接口进行对接。比如我们看LCD_Init这个接口的实现,这个就是真实调用LCD的真实硬件操作了: 4、使用方法 int main(void) {     /* USER CODE BEGIN 1 */     LCD_Driver_Model  lcd_model ;   LCD_Ascii_Show_Para ascii_para[] =     {         {80, 100, 240-80, "RED", BLACK, RED, 32},         {80, 100, 240-80, "GREEN", BLACK, GREEN, 32},         {80, 100, 240-80, "BLUE", BLACK, BLUE, 32},     };   LCD_Fill_Para fill_para[] =    {    {ascii_para[0].x,ascii_para[0].max_width,ascii_para[0].y,ascii_para[0].y+32},    {ascii_para[1].x,ascii_para[1].max_width,ascii_para[1].y,ascii_para[1].y+32},    {ascii_para[2].x,ascii_para[2].max_width,ascii_para[2].y,ascii_para[2].y+32},   } ;     /* USER CODE END 1 */     /* MCU Configuration--------------------------------------------------------*/     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */     HAL_Init();     /* USER CODE BEGIN Init */     /* USER CODE END Init */     /* Configure the system clock */     SystemClock_Config();     /* USER CODE BEGIN SysInit */     /* USER CODE END SysInit */     /* Initialize all configured peripherals */     MX_GPIO_Init();     MX_I2C1_Init();     MX_USART1_UART_Init();     MX_SPI2_Init();     /* USER CODE BEGIN 2 */     /*串口初始化后加这个延时,防止后面的printf打印乱码*/     HAL_Delay(200);     /*注册驱动模型*/     Register_Driver_Model(&lcd_model);     /*调用LCD初始化*/     lcd_model.lcd_driver->lcd_init();     /*调用LCD显示ASCII码字符串*/     lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[0]);     /* USER CODE END 2 */     /* Infinite loop */     /* USER CODE BEGIN WHILE */ while (1)     {         /* USER CODE END WHILE */         /* USER CODE BEGIN 3 */         /*循环调用LCD显示ASCII码字符串*/ for(int i = 0 ; i < 3 ; i++) { lcd_model.lcd_driver->lcd_fill(fill_para[i]);             lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[i]);             HAL_Delay(100);         }     }     /* USER CODE END 3 */ } 这样我们就完成了LCD驱动最简单的分层设计了,当然我们的软件框架后续还需要不断的把它做得更健壮,这样以后随便一个LCD,我们都可以设计一套类似这样的固定模板,根据实际的业务需求,定义设计合适的接口,以后但凡换一个项目还是用同一个LCD的话就非常简单了! 5、思考 前面我开源了一个基于TencentOS tiny的气体探测仪项目,你是否能在那个项目上继续进行优化改善呢? 2、使用git clone远程获取小熊派例程存放的代码仓库 项目开源仓库: https://gitee.com/morixinguan/bear-pi.git

    时间:2021-02-25 关键词: LCD 驱动框架 嵌入式

  • 嵌入式RTOS系统中使用内存保护单元(MPU)的好处

    作者 | strongerHuang 微信公众号 | strongerHuang 先说明一下MPU,MPU有很多含义,我们常见的有: MPU:Memory Protection Unit,内存保护单元(本文描述的内容); MPU:Microprocessor Unit,微处理器; 还有,可能有人会与MPU-6050这类模块联系在一起。所以,大家不要把MPU搞混了。 嵌入式专栏 1 为什么要使用MPU? 如果你开发的嵌入式项目,因内存溢出,或者内存故障等一些原因,造成了重大经济损失,或者造成了重大事故,你就能体会为什么要使用内存保护单元(MPU)了。 在嵌入式系统中使用内存保护单元(MPU)可以在开发早期及时发现因内存而导致的Bug,节省更多开发时间。 同时,在项目后期修改Bug,或者增加功能,可以减少修改文档和测试所需的时间。 也就是说,使用MPU,会避免因为修改一个bug,而引起多个bug的情况(0生1,1生万物)。 嵌入式专栏 2 MPU如何实现内存保护 简单来说就是保护与当前执行的代码不相关的所有数据。 拿RTOS任务A和B来说: 任务A和B不应相互交互数据 ,但是存在一个错误,任务A可能会意外地写入任务B偶尔使用的某些数据,不会影响任务A的正确操作。但是,当任务B尝试使用损坏的数据时,任务B可能会意外故障。 如果没有配置MPU来阻止任务A写入任务B的数据,则该错误可能需要很长的时间供开发人员跟踪。如果错误很小,或者如果任务B很少使用该数据,则将很难解决该bug。但是,如果使用了MPU,则该bug就会及早被发现。 在某些体系结构上,MPU甚至可以帮助你检测NULL指针引用,因为你可以设置MPU区域以防止非特权代码访问内存0x0。 应用程序中一组设计良好的MPU区域可以很好的保护重要的内存区域,以防止出现特定的问题。 一个很好的例子是通过在MPU区域的末尾放置缓冲区来防止缓冲区溢出,你还可以将任务堆栈放置在任何非特权代码都无法访问的区域。如果这样做,则每个任务必须使用自己的MPU区域之一来设置自己对自己的堆栈的访问权限。 嵌入式专栏 3 使用MPU的好处 无论是操作系统,还是裸机系统,如果没有防止恶意访问错误内存的能力,系统将有重大安全问题,以及安全漏洞的雷区。 使用的内存保护单元(MPU)有很多优势,MPU通常允许你以特权或非特权模式运行,并使用一组“区域”来确定当前正在执行的代码是否具有访问代码和数据的权限。 每个区域都是一个连续的内存块,具有该内存的一组权限,特权和非特权访问。与非特权代码的子集相比,特权代码往往可以访问大部分(但不是全部)内存。 在整个系统运行时中,这些区域不必相同。MPU区域可以根据每个任务进行修改,每个任务可以具有自己独特的区域集,这些区域在任务移至运行状态时进行配置。 这使你可以仅对需要代码和数据的任务设置访问权限,利用MPU的嵌入式操作系统将在每次上下文切换期间管理每个任务的区域和特权级别。 比如设置RTOS两个任务不同的内存保护区域: 上面这张图,大家都能看懂吧?Flash和内存区域被分别设置保护。 两个全局保护区域:Flash开头、RAM开头; 在Flash中,一部分仅限任务1访问,这部分不能被任务访问;同时,在Flash另外区域,仅限任务2访问,不能被任务1访问。如果这两部分区域被对方访问,则会生成生成MPU故障。 在RAM区域,同一部分区域,一个只能被读,一个只能被写入,如果不按约定操作,同样也会生产MPU故障。 嵌入式专栏 4 什么时候不使用MPU? 通常有两种情况可以不使用处理器上的MPU功能: 一个简单的项目 一个对性能至关重要的项目 第1个很简单:一个非常简单的应用程序基本上没必要使用MPU,反而增加了系统的复杂性。不设置内存保护,RAM和外围设备的MPU区域,你自己一眼就能找到bug。 第2个对性能要求高的项目,在上下文切换时,设置内存保护,堆栈那些操作,有可能影响系统的实时性,从而导致系统异常。这个需要结合项目实际情况考虑用,还是不用MPU功能。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-02-25 关键词: MPU RTOS 嵌入式

  • 万字长文,这是我见过最好的模板元编程文章了!

    所谓元编程,就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得异常灵活,能实现很多高级动态语言才有的特性(语法上可能比较丑陋,一些历史原因见下文)。 普通用户对 C++ 模板的使用可能不是很频繁,大致限于泛型编程,但一些系统级的代码,尤其是对通用性、性能要求极高的基础库(如 STL、Boost)几乎不可避免的都大量地使用 C++ 模板,一个稍有规模的大量使用模板的程序,不可避免的要涉及元编程(如类型计算)。本文就是要剖析 C++ 模板元编程的机制。 下面所给的所有代码,想做实验又懒得打开编译工具?一个在线运行 C++ 代码的网站(GCC 4.8)很好~ 1 C++模板的语法 函数模板(function template)和类模板(class template)的简单示例如下: #include // 函数模板templatebool equivalent(const T& a, const T& b){ return !(a < b) && !(b < a);}// 类模板template // 默认参数class bignumber{ T _v;public: bignumber(T a) : _v(a) { } inline bool operator

    时间:2021-02-25 关键词: C 元编程 嵌入式

  • 假如计算机是中国人发明的,那么代码应该这么写……

    1、注释都不需要了,因为代码即是注释,注释即是代码。 2、进制数应该是这样的: 二进制: 阴、阳 八进制:干qián、坤kūn、震zhèn、巽xùn、坎kǎn、离lí、艮gèn、兑duì 十六进制替换为十二进制: 鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪 3、这时底层代码肯定就是…… 阴阳阴阴阴阳阴阴阴阴阳阴阴阳阳阴阳阳阴阳阳阳阳阴阳阳阴阳 ... 不过,看下面的中文代码其实也是挺头疼的,也许是我们已经习惯了英文字母: 4、学习语言,第一个输出的程序是? 你好,吃了吗?或者吃了没,世界! 然后,注释会使用以下代码: 项目发布前,一定要大师开光,灵符、朱砂都用上,保佑顺利上线无Bug。 5、Github上还有一个有意思的项目PerlYuYan,它将Perl翻译成了文言文。 PerlYuYan Github 地址是:https://github.com/audreyt/lingua-sinica-perlyuyan 先看看它的实例代码: 看完以后,是不是后悔没好好学文言文? 接下来,我们再看下它的源码,也就明白其实作者是将许多指令改成以一个个中国汉字来表示,造成了文言语法的感觉。 下面,再来看看它的五言诗句: 翻译成Perl就是: 6、最后,还有一点就是如果计算机是中国人创造的,韩国人很有可能会说最开始是他们想出来的。 END 来源:菜鸟教程(微ID:runoob) 版权归原作者所有,如有侵权,请联系删除。 ▍ 推荐阅读 树莓派Pico:仅4美元的MCU 嵌入式Linux开发板裸机程序烧写方法总结 国产16位MCU的痛点,可以用这款物美价廉产品 →点关注,不迷路← 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-02-25 关键词: 计算机 代码 嵌入式

  • 嵌入式驱动自学者的亲身感受,有什么建议?

    嵌入式驱动自学者的亲身感受,有什么建议?

    ID:技术让梦想更伟大 整理:李肖遥 嵌入式驱动自学者的感受 学习嵌入式,或者说学习现代的计算机编程,如果你想学好,有一个比较要求,那就是你能接受它的设定、它的模式。反过来说,当你真正接受它的设定、它的模式,并记住它们时,我认为,你已经学好了。 昨天,我又置之死地而后生了一次。 最近一直在搞驱动,一个LCD驱动搞得我几乎要放弃继续走嵌入式这条路。昨夜,睡不觉,打开嵌入学习视频,躺在已关灯很久的房间的床上,大概凌晨3,4点吧。之前我一直都是学习着驱动自编源码的教学,是那种几乎和裸板程序没多大区别的编程方式,只是多使用了一些向内核注册的接口函数。 而最近我想换一下,因为很多设备驱动,内核都是自带的,而且是各种平台的设备驱动都有,我想如果能熟悉掌握内核自带驱动的编程,那以后要做某个设备的驱动时,我只需要在自带驱动中修改一下便好了,通过学习LCD平台设备的驱动,我了解了其编程想法,同时也认同这种想法,甚至让我疑惑,学习资料中教自编驱动的意义,为何不直接教如果修改内核源码驱动? 于是,继续按着书去修改内核驱动源码,但问题是,书中说他们这种修改,代码成功运行了,但我这,无论怎么调试都失败,我反复检测,我的修改是否与书中一致,检测了很多遍依然没发现哪一步不同,不过,有一点发现是,书中的内核源码和我内核使用的源码有一点点区别(当然书里并没有把所有的源码都贴上,只是修改部分附近会联带着一些,这就是发现,这些联带的没需要修改的源码和我的源码有点区别,比如,我的源码中多了一些设置(看似无关紧要的设置))。 与书核对无误但失败后,我又与成功运行的自编驱动核对,我陆续发现我修改的内涵源码中,没有去启动设备,也更没有去点亮背光,而在显存分配后的寄存器设置似乎也有问题,因为这里的地址使用各种宏定义不同的累加或计算,最后算得地址和我的寄存器地址也不知是否吻合,因为驱动源码中最后计算得到的是虚拟地址。于是我对比自编驱动,一点点修改尝试,到睡觉前都没成功。 我是想学得理直气壮一点的,最后是能一眼就能找到问题,并迅速轻松解决问题的,我也承认自己确实是有些浮躁。但是经过了昨晚床上的一点绝望的思考挣扎后,我好像想通了: 为什么嵌入式学习视频老师要教自编驱动。 下面我说下自编驱动与内核驱动源码各自的问题: 自便驱动: 程序简单简洁,它只能驱动特定的某个设备。如果设备换了需要支持另一款设备,那么你需要重新修改该驱动;如果需要系统同时支持两种LCD,那么它就会变成复杂并且对于内核驱动的简洁优势会削弱不少;如果你想驱动支持多种设备,那自编驱动,相对了内核驱动源码的简洁优势会变成了劣势,因为编程思想的适用范围不同而产生的结果。 内核自带驱动源码: ①从系统层次去考量,变量、宏定义使用多, 甚至有些宏定义的值为了方便能让各种在不同的阶段需要不同的值调用,把简单的一个赋值调用变成了需要进行多次运算才能检测到该值是否满足使用要求,因为我们不是该驱动的编码者,不清楚这样做的好处,也或许是内核驱动源码的开发者从整个系统的编程简洁性去考量,这样做或许也是为了让整个系统代码更少,简洁的一种做法,因为每个设备你都给它赋具体的值的话,整个系统中有几百种驱动设备源码,给所有设备的这个位置参数都赋一个值的话,那各设备关于这个值的代码就要多了几百行了,所以还不如,让各设备根据各种平台去对某个宏进行各自的计算来得到合适的值,但某些计算中相同的算法的也整合在一起,这样就减少了系统不少行代码。所以系统中驱动源码是系统开发者对系统源码的整合,是基于系统层的整合。所以,对于我这种对单个设备驱动编码的人,就会觉得系统源码有好多不人性化的地方,会觉得简单的地方也被弄得很复杂。 ②内核自带驱动还有一些代码是为了兼容以前的版本而添加了, 比如以前硬件内存资源稀少,需要使用调色板的方法来减少程序运行时的内存使用量,这也会真假代码的复杂性,这一步虽不是必要的,但如果没弄好,那LCD驱动也不能正常使用。 ③程序复杂, 为了适用在多种设备型号,更简单地添加不同型号的设备驱动,内核对驱动抽象分离,把驱动分为平台管理部分,驱动代码部分(与硬件无关码),和设备代码部分(硬件相关代码)。用户添加新型号设备驱动时,只需要在平台管理部分检查添加设备的匹配信息,和提供一个硬件设备相关的代码(有格式)文件即可。 现在,站在驱动开发者而非系统开发者的角度去衡量。 ①自编的驱动,简洁,要点明确。 这个对于驱动开发者的用处就是:无论你使用的是哪个版本的内核,哪个芯片平台,你可以通过自编码比较简单方便地就可以确认硬件设备的情况,是否正常。如果自编码通过,那可以试用自编码上使用的参数去与内核进行核对、修改,然后再去测试。如果不成功,对于内核中多余的设置(这些大多可能是提供内核用做基本判断的变量)可以先屏蔽,编译出错了,根据提示,找到出错的位置修改添加。因为这些多余的设置,设置对了还行,设置错了,你又不好去定位错在哪。 自编的驱动在此处的用处,调试时,可以让你排除多余的失败可能性问题,在较少的代码去查出错误位置,如果你确定你的设置满足了该设备的必需设置,还是失败,你可以比较放心地去怀疑是硬件问题了。如果自编码成功,那个又可以当做你修改内核驱动的一个标准。 ②内核驱动源码支持管理多种型号的设备的优势是我用使用它的原因。 先了解本版本本平台的设备驱动结构,如果是添加型号支持,那就根据自编驱动的参数与设置即可,如果是第一次启动这类设备,你就还需要检测结构是完整性,如果结构完整,参数无误依旧错误,那就把内核驱动源码精简到自编码的简单粗暴设置吧。最终就变成了在基于内核驱动架构下的自编驱动。如果还不行,那无疑是结构性问题了。 所以自编驱动,还是有其存在价值的。内核驱动源码内容会变,平台会变,但自编驱动是变得最小的一个,也是最容易实现驱动目的的一个。是一码打天下不可缺少的重要组成部分。 对于嵌入式驱动开发的建议 1) 为了今后的发展,你除了考虑广度以外,更重要的是注意知识的深度。 譬如,做过网络驱动,那么是不是只停留在会写驱动的表层上,有没有对Linux内核的网络结构,TCP/IP协议作过深入的了解。 2) 在Linux下开发很多时候都要利用现成的东西,没必要什么都自己搞。关键是变成自己的驱动后是否了解原作者编写时背后的一些东西。你应该不止是简单的让它工作。写驱动的时候就要考虑它的性能问题,并给出测试的方法(当然可以利用现成的许多工具,譬如测试网络性能的netperf等)。 当你写过Flash驱动,可能会知道Flash的性能有时候有多重要。 3) C程序的自我修炼,是否考虑到软件工程方面的一些东西,程序的可维护性和扩展性,譬如LCD驱动,是不是从Sharp到NEC的只需要集中修改很少的几个地方? 对于不同品牌的Flash,如果使得Flash的驱动做的更具有灵活性。 4) 如果有时间结余,可以关注Linux内核的发展。譬如LCD的驱动有没有考虑到V4L2通用架构,譬如网络驱动用到了NAPI了吗?当然在此之前,假设已经对LDD3, ULK2理解的比较熟了。 5) 现在所作的这些驱动还算不得非常核心的东西。如果你想有更好的发展,可以考虑往audio,video,net方面发展,你应该多注意真个行业需要什么样的人才,上述每一项都需要很厚的底蕴,譬如video,需要了解MPEG4, H264等,怎么也要个1到2年才能算个入行阿,所以我建议不要只顾闷头做东西,要适当关注目前的一些应用。 6) 对硬件知识的补给,做嵌入式Linux这一行不可能不读硬件的Spec,如果你对硬件的工作机制理解的比较透,会有助你写出性能好的驱动程序。 顺便提一点,适时的提高你的英语水平,对你的职业生涯绝对有帮助。(不要等需要的时候再补,来不及) 7) 如果有时间,平时注意对Linux应用程序编写的了解/积累,也将有助于你写出很好功能很好的驱动程序。 8) 永远不能以为自己做了很多东西,就驱动而言,像TVIN/TVOUT, USB, SDIO等等,好多未知领域呢。在问题还没有解决之前很难说清是哪里不对了。 有时候是datasheet里面的一句话没有注意,还有好几次调不出来最后查到是PCB的问题,所以有时候特别晕。 -END-

    时间:2021-02-24 关键词: 嵌入式驱动 嵌入式

  • 工程师的痛

    刚刚看了这个视频“工程师的痛”,比起春晚上小品有趣多了。堪称英语版本的“扒马褂”。可能只有工程师才能够理解工程师的痛。 客户经理:我们公司有一个新的战略设想,目的是增加公司产品的市场渗透性、最大化品牌忠诚度,提升形象辨识度。为了实现这个目标,开启一个项目,要求是绘制七根红线,希望你们公司可以帮助我们设计。 公司经理:当然了。这里Walter是项目经理。Walter,我们可以按照客户要求设计吧? 项目经理:(Walter)当然可以了。Anderson是我们画红线领域的专家。他和我们一起到这里来解答一下画红线相关的专业问题。 客户经理:很高兴认识你。我会很快让你了解我们的详细想法。她是Justine,我们公司的设计专家。我希望你要么使用绿色墨水,或者要么透明墨水画出七根红色线条,它们之间相互垂直。你能实现吗? 工程师:(Aderson) 不行,我主要担心...... 项目经理:Aderson,先别着急说不行。这个任务已经确定下来,我们必须完成。毕竟,你是砖家。 工程师:红线的意思是红色的线,需要使用红墨水绘制出来。如果想使用绿墨水绘制,额......使用绿墨水,虽然说不现实,但基本上是不可能的。...... 但最后,工程师为什么答应承担这个项目设计,并且还额外承诺更多荒诞的要求,有趣的内容还是看下面他们之间神情兼备的表演吧。虽然年过完了,但快乐不能少。 公众号留言 提问:想请问一下,AI视觉组激光射击“采摘水果”有射击方式和射击时长的要求吗?如果在行驶过程中让激光一直照射着,相当于激光“扫射”过靶示牌,请问可以吗? 回复:组委会在设计这项赛题的时候,设计了下面的要求:“如果射击水果的激光束信号落在目标靶心直径5厘米范围外,则判断此次任务没有未完成。” 所以,如果激光器一直照射,就会触发目标靶心外,导致任务没有实现。 关于“关于对车载激光器发射相关参数(激光频率、发射光功率、调制频率,光斑形状)等将会连同目标靶参照制作方案另外发布。”将会在3月初进行公布。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-02-24 关键词: 工程师 嵌入式

  • ZLG面向体外诊断设备嵌入式解决方案

    ZLG面向体外诊断设备嵌入式解决方案

    摘要:ZLG深耕嵌入式二十年,为诸多医疗企业用户提供嵌入式解决方案,包括基因扩增仪、荧光免疫分析仪、特定蛋白分析仪等常用医疗设备,本篇文章为大家介绍ZLG在体外诊断设备上提供的各类嵌入式解决方案。 病毒试剂盒的研制离不开基因扩增仪(PCR)、荧光分析仪等医疗仪器的分析,试剂研制成功之后,需要对疑似病患的鼻咽拭纸、痰液、肺泡灌洗液3种样本进行检测。而试剂盒的检测同样需要相应的仪器配套工作,其中包括特定蛋白分析仪、手持式荧光分析等医疗设备,在大范围的检测群体需求下会对此类设备有小型化需求,最优情况下是实现手持式分析,实现即时检验(PCOT)。 ZLG成熟的应用方案已在此类设备仪器中广泛应用。本文将为大家介绍ZLG在设备仪器中的方案。 一、基因扩增仪 基因扩增仪(PCR)实际上是一种可编程控制的、可快速变温的、可精密控温的温度循环仪,主要用于基因分离、克隆和核酸序列分析等研究,因其灵敏度高、操作简单、省时等特点,在此次新冠状病毒的全基因组序列获取中发挥至关重要的作用。 基因扩增仪(PCR)系统框图大致如下所示,主要包括显示通讯控制板、控制系统主控板和电源。ZLG为基因扩增仪主要提供Cortex-A7平台显控方案——M6Y2C,工业控制核心板,并通过严格EMC和高低温测试,确保核心板在严酷的环境下稳定保证显示的稳定与可靠。 系列平台具备如下优势: · 配置了工业级超大容量eMMC与TF卡; · 丰富的接口资源,包含以太网、RS-485、CAN等通讯接口; · 拥有丰富的接口资源,包括8路UART,2路隔离CAN-bus,1路隔离RS-485,1路USB Host等多种有线数据通讯接口。 二、手持/台式荧光分析仪 荧光免疫分析仪用于医院体外检测,主要对人体的血清/血浆/全血/尿液样本进行检测,辅助诊断人的心肌损伤,心力衰竭,急性冠状动脉综合征,心血管炎症,静脉血栓栓塞,常规炎症,细菌/病毒感染的鉴别,急慢性肾病等疾病的早期发现及治疗。 荧光分析仪主要包括两种控制平台:PC电脑、ARM主控。 ZLG为荧光分析仪PC电脑平台提供USBCAN采集卡方案,主要用于实现PC与荧光分析仪链接,进行数据交互,控制控制电机、光源等,具体如下所示: ZLG为荧光分析仪ARM平台提供系列解决方案,经过二十多年的嵌入式积累,提供推出了稳定可靠的Cortex-A7解决方案,具体如下所示。 系列平台具备如下优势: · 预留丰富的扩展接口; · 提供WIFI、4G、ZigBee等无线方案的选择,可根据实际情况通过MiniPcie进行扩展; · 核心板结构利于将台式和便携式仪器统一到同一个平台,同一套底板,节省开发周期; · 提供了周到的技术支持以及详细的技术开发资料,缩短开发、生产周期。 三、特定蛋白分析仪 特定蛋白分析仪主要用于检测血清、血浆和尿液中的特定蛋白浓度检测,原理是基于免疫比浊法基础,从结构上主要分为透射比浊和散射比浊两种,可以检测包括血浆或血清、尿液、脑脊液等样本中特定蛋白的浓度。 ZLG为特定蛋白分析仪提供Cortex-A9平台主控方案,小巧的体积符合诊断设备小型化、便携化需求。 系列平台具备如下优势: · 丰富接口、强劲性能、设计更灵活; · 丰富的多媒体接口,支持摄像头、HDMI、LCD、LVDS接口,轻松实现图像采集和媒体显示; · 强大的编解码功能,集成了1080P视频编解码等强大的多媒体编解码功能。

    时间:2021-02-24 关键词: ZLG 体外诊断设备 嵌入式

  • 嵌入式工程师超长经验分享:从单片机coder到嵌入式programer的简单历程

    C语言到底该怎么学,单片机coder怎么才能顺利转型成为嵌入式programer?21ic论坛有一“镇站之宝”的超长经验分享贴,特此分享给所有热爱coding的你。 之前和大家谈了一点UML在嵌入式开发中的使用,以及链表、哈希表等数据结构在实现对象之间的交互机制(设计模式)的一点简单实例。有很多朋友表示很感兴趣,21ic高手云集,有点班门弄斧的感觉,所以还望尽情拍砖。之前的帖子很乱,除了因为太随意没有准备外,更主要是因为本人也处于半瓶子阶段,所谈问题题目又太大。对此我只能凭借拙见,谈点个人的理解,由于本人是这方面的新手,凭借一己之热情,大放厥词,还请各位斧正。其实UML就是一个工具,提供了用例图、顺序图、活动图、类图、状态机图、部署图、包图等工具,辅助工程师完成:分析->设计->实施->测试的整个过程。每个过程都有细分,例如分析阶段:首先是需求分析,然后有系统分析,再次有对象结构分析等。需求分析阶段会使用到用例图、顺序图、状态机图、顺序图等,需求分析阶段的最重要的要素是软件的外部功能视图和使用场景等。其中前者使用用例图表述,它也提供了沟通用户和开发者的桥梁;后者用顺序图或状态机图等表述,提供了系统每个功能实现的可能路径。其他过程和需求分析阶段类似,这里篇幅所限就不再一一提及。UML就是这样同我们的设计过程关联起来的。将面向对象的方法用于MCU是有必要的,也是可能的,当然也是很有效的。这样的努力最起码可以拉近mcu开发者同其他领域的C开发者之间的距离,弥补那道似乎难以逾越的鸿沟,比如看到linux内核代码时,你会发现原来如此亲切。当然,随着对面向对象方法的深入理解,你会发现C++也不再那么让你不知道如何使用,或者把C++用得像面向过程的语言一样。当然本人C++菜鸟,还望高手指教。然而面向对象的方法也非一蹴而就,一朝搞定,它是一个循序渐进的过程,特别是应用与mcu这样的平台,好多东西是靠摸索出来的。如何开始,先从何处下手是个问题。21ic同仁liufb提议:“正如《重构与模式》所说:如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧。”我决定发掘一下我近十年以来的阶段性C代码,试图去发现一点什么,这个我之前还从未尝试过,能找到的一起的代码也寥寥无几。不过我觉得值得一试,那就从此开始吧。 努力发掘,搜索N年前的邮箱,居然找到了当时在一款AT89X52单片机上的处女作。就从它开始入手了。 时代背景:2006年,郑州某小公司,之前的工作是修手机,然后是在某气体传感器公司焊接维护生产设备,再后来在这家小公司画电路板,然而软件才是我的最爱。好不容易boss开恩,让我参与到写代码的行列。之前的进度让在郑州这种蜗牛般的工作节奏的大氛围里面的boss也觉得忍无可忍,于是我加入了。 代码太长,截取一部分吧。里面只有我写的一个子函数,大部分是同事写的。  由于做开始工作的同事不太会用多文件,所以这个项目的代码只有一个文件,连头文件都没有,整个文件有2600行代码。以下我将列举它的三大部分:           1.全局变量部分。           2.部分子函数。           3.main函数。 最后我将会用现在的眼光,结合大师(Grady Booch)的经典,分析一下这部分代码。 全局变量部分: bit FUN,Shift_on,Add_on,Sub_on,fun_flag;bit dspflagz1,dspflagz2,dspflagz3;unsigned char z1,z2,td3,working,DSP_m,DSP_n;unsigned char l1,l2,r,m;bitflagv,flagy,flags,flag0,flagx,beepflag1,beepflag2,flagt,flagw;bit working_on,function_on, AINTSYR_on,AINTSYW_on,BINTSYR_on,BINTSYW_on ;bitprogram_on,program_woking,up_flag,down_flag,up_on,down_on;unsigned char AINTSY_state, BINTSY_state, function_state;unsigned char tx1,tx2,tx3,tw,TX,t;unsigned char display_state ,x1,x2,w1,w2;unsigned char program_state,program_working;unsigned char clk_number;unsigned char code DS[]={0,33,63,86,100,86,63,33};unsigned chards_curtime[6]={0x05,0x03,0x02,0x01,0x07,0x06};unsigned char clk_data[6]={06,1,1,0,0,1};unsigned char set_time[6];sbit switch_work= 0xB0;sbit switch_function=0xB1;sbit switch_program=0xB2;sbit switch_up=0x90;sbit switch_down=0x91;sbit switch_AINTSYR=0x92;sbit switch_AINTSYW=0x93;sbit switch_BINTSYR=0x94;sbit switch_BINTSYW=0x95;sbit RS=0xA2;sbit RW=0xA1;sbit E=0xA0;sbit CS2=0xA3;sbit CS1=0xA4;sbit DACS1=0xA7;sbit DACS2=0xA6;sbit DACS3=0xA5;sbit ds_sclk=0xB3 ; /*初始化变量*/sbit ds_io=0xB4;sbit ds_rst=0xB5; 初评:除了最后是管脚定义外,前边都是全局的标志位或全局变量。 这个 void text(void)可是我的处女作啊 //////////////////////////////////////////////////////////////////////////////////////////////////////void text(void){ bit Flag_add; /*加一标志*/ bit Flag_sub; /*减一标志*/ unsigned char max_value; /*各时间单位的最大值*/ unsigned char min_value; /*各时间单位的最小值*/ /*if(FUN==1) { */ /*定义标志位*/ if(switch_work==0) /*移位键*/ { if(Shift_on==0) { Shift_on=1; buzzer(); clk_number++; if(clk_number>6)clk_number=1; } } else Shift_on=0; if(switch_up==0) /*加一键*/ { if(Add_on==0) { Add_on=1; buzzer(); Flag_add=1; } } else Add_on=0; if(switch_down==0) /*减一键*/ { if(Sub_on==0) { Sub_on=1; buzzer(); Flag_sub=1; } } else Sub_on=0; switch(clk_number) { case 1: max_value=99;min_value=0;break; case 2: max_value=12;min_value=1;break; case 3: if(clk_data[1]==1|| clk_data[1]==3|| clk_data[1]==5|| clk_data[1]==7|| clk_data[1]==8|| clk_data[1]==10|| clk_data[1]==12) max_value=31; /*1,3,5,7,8,10,12*/ else if( clk_data[1]==4|| clk_data[1]==6|| clk_data[1]==9|| clk_data[1]==11) max_value=30; /*4,6,9,11*/ else if((clk_data[0]%4==0)||clk_data[0]==0) max_value=29; /*闰年*/ else max_value=28; min_value=1; break; case 4: max_value=23;min_value=0;break; case 5: max_value=59;min_value=0;break; case 6: max_value=7;min_value=1;break; } if(Flag_add==1) { clk_data[clk_number-1]++; Flag_add=0; if(clk_data[clk_number-1]>max_value) clk_data[clk_number-1]=min_value; } else if(Flag_sub==1) { clk_data[clk_number-1]--; Flag_sub=0; if(clk_data[clk_number-1]

    时间:2021-02-23 关键词: 单片机 C语言 嵌入式

  • 为什么有序数组比无序数组快?

    【导读】:日常开发最容易被忽视的就是性能优化,除了类似cache的性能刺客,还有分支预测这种不容易被察觉的优化! 以下是正文 为什么处理有序数组比无序数组快? 由于某些怪异的原因,下面这段C++代码表现的异乎寻常—-当这段代码作用于有序数据时其速度可以提高将近6倍,这真是令人惊奇。 #include #include #include int _tmain (int argc , _TCHAR * argv []){ //Generate data const unsigned arraySize = 32768; int data[arraySize]; for ( unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256; //!!! With this, the next loop runs faster std::sort(data, data + arraySize); //Test clock_t start = clock(); long long sum = 0; for ( unsigned i = 0; i < 100000; ++i){ //Primary loop for ( unsigned c = 0; c < arraySize; ++c){ if (data[c] >= 128) sum += data[c]; } }       double eclapsedTime = static_cast(clock() - start) / CLOCKS_PER_SEC; std::cout

    时间:2021-02-23 关键词: 代码 C 嵌入式

  • 英飞凌将在线举办2021嵌入式解决方案大会,展出全面的物联网产品组合

    【2021年2月22日,德国慕尼黑讯】英飞凌科技股份公司收购赛普拉斯后,成为全球十大半导体制造商之一。赛普拉斯的微控制器、连接组件、软件生态系统和高性能存储器等差异化产品组合,与英飞凌领先的功率半导体、汽车微控制器、传感器及安全解决方案等产品组合,形成了高度的优势互补。半导体是所有联网智能设备的核心,它可以让物联网变成现实。如今,英飞凌可以提供业界非常全面的产品组合,涵盖丰富的硬件、软件和安全解决方案,赋能万物互联时代,连接现实与数字世界。在2021嵌入式解决方案大会(ESC21)上,“新” 英飞凌将首次展出其广泛的物联网产品组合。 2021年3月1日至5日,英飞凌将在线上举办内容丰富且互动性强的“嵌入式解决方案大会”。此次大会将充分借鉴英飞凌多年来举办虚拟行业展会的丰富经验。除了提供50多场主题演讲和产品演示等现场直播活动以外,大会还支持参会者选择自己感兴趣的主题和所在的时区,从而获得更加个性化的体验。届时,超过80名英飞凌专家将与参会者进行一对一的讨论和互动交流。互动的专家将根据参会者选择的时区和主题进行匹配。英飞凌的数字展台根据应用领域的不同,分为智能汽车、智能家居和智能楼宇、智能设备(Smart Things)、智能工厂四大版块。参会者可以根据引导,浏览整个数字展台。此外,数字展台还设置了有关数据基础设施、软件工具的特别版块,以及一个虚拟的创客专区。 智能汽车 消费者对安全出行、环保出行和互联出行的需求日益增长。顺应这一趋势的发展,英飞凌的半导体技术正在助力车企打造未来的智能汽车,让人们的出行更加安全、环保和智能互联。先进的解决方案将AURIX™微控制器与传感器融合技术相结合,能够越来越多地将人工智能融入汽车设计,以实现全自动驾驶。除了“故障运行电动助力转向”等高级驾驶辅助功能以外,英飞凌的嵌入式解决方案利用集成了Arm® Cortex® M4F微控制器和Cortex® M7F双核架构的TRAVEO™ II车载MCU系列,为驾驶员带来了更高水平的驾驶舱舒适度和信息娱乐系统。在安全方面,防篡改的OPTIGA™ TPM SLI 9670芯片质量过硬,针对远程信息处理控制单元和网关等关键应用进行了优化,而车规级eSIM解决方案则非常适合远程信息处理等应用,如紧急呼叫系统(eCall)以及车辆与云端(V2X)的通信等。 智能家居与智能楼宇 智能家居和智能楼宇指的是私人住宅和非住宅类建筑的数字化。智能家居解决方案通过自动调节温度、灯光控制及视频监控等功能,为人们的生活带来便利。与此同时,这些解决方案还有助于实现节能。英飞凌提供丰富的产品组合,包括用于数据采集的XENSIV™传感器、领先的功率MOSFET,以及用于节能设备的驱动器等,推动楼宇的智能化转型。该产品组合还包括用于在边缘侧进行数据处理和分析的微控制器,以及利用成熟专业技术开发的安全芯片。这些安全芯片可保护物联网设备免受威胁。此外,英飞凌在照明与暖通空调(HVAC)等常见的楼宇自动化领域拥有数十年的深厚专业积淀,积累了丰富的经验。 智能工厂 参观虚拟展台的访客可以了解到,嵌入创新机械模块的最新芯片技术,如何为智能工厂中具有高可靠性和高能效的电力驱动解决方案奠定基础。英飞凌拥有完整的产品组合,包括传感器、XMC™微控制器和iMOTION™电机控制芯片,以及基于硬件的OPTIGA™ TPM和OPTIGA™ Trust系列安全解决方案,可以保护物联网设备,有效保护敏感数据和IP,避免意外停机等故障的发生。其中,亮点产品包括,与PrimeKey联合开发的一款安全解决方案,它可以对飞入禁飞区的无人机进行身份识别和验证。 智能设备和数据基础设施 在英飞凌举办的2021嵌入式解决方案大会上,参会者可以切身体会到,功能强大的微控制器和安全传感器解决方案,如何赋能可持续、便捷的生活方式,支持无线充电、节能可穿戴设备和最新的消费电子设备等应用。它们都受益于集成了Arm® Cortex®的PSoC®安全微控制器系列,以及英飞凌的Wi-Fi®和Bluetooth®解决方案。此外,用于智能汽车、智能楼宇和智能工厂的数据中心和通信基础设施,是物联网的支柱。而5G技术是通信基础设施的核心,它可以实现更高的数据传输速率和极低的时延。英飞凌的嵌入式安全解决方案,如可信平台模块(TPM),能够充分满足其对可靠ICT安全的需求。

    时间:2021-02-22 关键词: 英飞凌 物联网 嵌入式

  • 适合具备C语言基础的C++教程(五)

    前言 在上述教程中,我们已经完成了 C++相对于 C语言来说独特的语法部分,在接下来的教程中,我们将叙述 C++中面向对象的语法特性。我们在学习面向对象的这种编程方法的时候,常常会听到这三个词,封装、继承、派生,这也是面向对象编程的三大特性,在本节我们将依次阐述封装、继承、派生的具体用法,在这里,我们先叙述的是封装这个属性的的相关内容。下图是关于 封装 这个特性所包含的一些内容。 封装 下图就是封装所具备的相关特性: image-20210209204824118 那么上图所示的抽象出数据成员以及成员函数具体的含义是什么呢,正如前面教程所述,在前面的教程里,我们选用一个 Person类来作为例子进行讲解,其中这个类里我们有 name以及age,这个也就是我们抽象出来的数据,那抽象出来的成员函数也就是前面教程讲到的setName()和setAge()函数,在设计这个类的时候,会把这个类的一些成员设置为私有的或者公有的,这也就是访问控制。具体的代码如下所示: /* 为了代码简便,省略相关构造函数以及析构函数,为的是展示封装的特性*/class Person {private:    char *name;    int age;public:    Person()    {        cout 

    时间:2021-02-20 关键词: C语言 C 嵌入式

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包