物联网

物联网(Internet of Things,简称IoT)是指通过互联网连接和互通的方式,将各种物理设备、传感器、软件以及其他技术整合在一起,实现设备之间的数据收集、通信和互操作,从而实现对物理世界的感知、监控和远程控制。物联网的目标是通过智能化和自动化的手段,提高生活和工作的效率,改善人们的生活质量。

不知不觉,我们已经处于物联网的汪洋大海之中,大家公认的说法是,到2020年全球物联网设备接入总数将达到300-500亿。面对这海量的设备,维护变成一个繁重的任务,这就要求互联网设备可靠“皮实”的同时,功耗足够低,一块电池(或者使用能量收集技术)能撑足够久。因此“低功耗”三个字在物联网用户端设备的设计中,一直被摆在很高优先级的位置上。这也让开发者在元器件的选型上小心谨慎,铭记下面这些不得不守的“军规”。

死磕物联网低功耗设计,BOM中不得不知的五条“军规”
图1:物联网用户端设备系统框图

第一条:用一颗低功耗的MCU

从物联网设备的系统框图上来看,MCU处于核心的地位;而从功耗的角度来看,它也是耗电最大的“电老虎”。8-bit MCU功耗固然低,但毕竟性能有限,所以在物联网设备中32-bit MCU上位成了主角。目前在32-bit通用MCU领域,ARM Cortex-M系列架构的CPU内核占主流,从M0、M0+、M3、M4到M7,序号越大性能越高,功耗也越大。所以根据物联设备的应用场景,选择一颗功耗性能比“刚刚好”的CPU内核是首要准则。

不过决定MCU整体功耗的因素很多,除了CPU内核自身的功耗,至少还要考虑三个因素:是否有多样的电源管理模式设定,可以让CPU内核和无需工作的电路处于休眠状态;是否有灵活的时钟管理系统,按需对各个功能电路进行调度;是否有更智能而低功耗的外围电路,能够帮助CPU内核分担工作。其实这些因素核心的思路就是:无事休眠、按需激活、避免空耗。

要想全面了解MCU低功耗性能、做出正确判断,除了吃透器件的Datasheet、经验设计积累外,目前也有第三方的评测可供参考,比如EEMBC联盟为衡量嵌入式微控制器低功耗特性专门设计的ULPBench评分。虽然有人认为这一评分的结果值得商榷,但仍然不失为一把衡量MCU整体低功耗特性可参考的标尺。

死磕物联网低功耗设计,BOM中不得不知的五条“军规”
表1:ULPBench中业界主流MCU产品得分

第二条:考虑集成化的传感器

在传感器的选型上,开发者通常有两种选择:分立的传感器或集成化的传感器。单独来看,前者在成本和功耗上都更有优势,不过从系统整体功耗上看,集成传感器件不失为一种不错的选择。因为在集成传感器件中,通常会将信号调理电路(如ADC)整合进去,将预处理后的信号通过SPI或I2C等数据接口直接传给MCU,减少MCU数据处理的负荷。有些传感器件还会集成信号处理电路,如一个低功耗的CPU核,构成功能更完整的传感器中枢,简单的计算自己做,进一步减少对主MCU的“打扰”。这些策略都会对系统总体能耗的降低有帮助。

第三条:选择合适的无线互连协议

影响物联网产品功耗的另一个重要因素就是无线互连功能。目前市场上有太多的无线互连协议可供选择,从私有的Sub-GHz协议,到众所周知的Wi-Fi、BLE、ZigBee等开放标准,以及近年来快速发展的低功耗广域网LPWAN协议(如LoRa、Sigfox、NB-IoT等)。无线通信的功耗会与网络的规模、拓扑结构、可靠性、数据吞吐量等因素相关。通常来说,拓扑结构越复杂、数据吞吐量越大的网络,功耗也会更大,比如:星形WiFi网络要比点对点通信的Sub-GHz无线通信功耗要高很多;同样采用ZigBee协议,星形网络肯定比Mesh网络能耗更低。

因此物联网设备无线互连协议的选择与应用场景关联度极高,开发者需要从现实的需求以及未来的扩展性方面通盘考虑,确定适合的无线技术,在此基础之上再选择低功耗性能最优的元器件。

第四条:选用耗电少的电源管理器件

电源管理器件是物联网系统中必不可少的部分。不论是选用LDO线性稳压器还是DC-DC转化器,抑或是能够提供多轨电压输出的PMIC,高效率是当然的首选特性。此外,与物联网产品配套的电源管理器件,特别在与能量收集技术相关的应用中,自身还需要具备低静态电流的特性——如TI等公司相关产品标称的静态电流值可达到300nA左右——尽可能降低设备的待机功耗。

第五条:做好安全性功耗预算

2016年10月网络黑客劫持了摄像头等大量物联网终端设备,向北美网络发起了大规模DDoS攻击,这再次提醒人们物联网设备端的安全问题不容忽视。而对物联网设备来说,增强安全功能也意味着更大的功耗,比如如果MCU的内部或外部没有配置加密硬件,加解密工作就不得不耗费MCU的计算资源,产生更多的功耗。使用更可靠的非对称加密算法,与对称加密算法相比也需要更多的功耗。因此安全性关联的功耗预算,也是必须考量的部分。

将以上几个因素串联起来,我们才可以为物联网设备端的功耗描绘出一幅完整的图景。在此基础之上,锱铢必较,精心雕琢出禁得住市场和用户考研的低功耗产品。

死磕物联网低功耗设计,BOM中不得不知的五条“军规”
表2:主要无线互连协议比较

转自: 安富利

围观 374

作者:e络盟大中华区销售总监朱伟弟

从公共汽车站的标牌到联网的复杂工业系统,大部分电子系统的设计方式因互联网而发生了极大的改变。其中,最大的变化或许是引入了收集数据并将信息传递至云端的传感器系统。

这些小型“器件”通常无法连接主电源,这意味着它们必须通过电池或能量采集装置进行供电。

对于许多应用而言,能量采集装置是最可行的解决方案。如果设备设计成较低功耗,而能量采集装置可获取较多能量,则设备有可能实现无限期运行。

然而,由于有限的能源获取或过大的系统能源需求,许多应用不适用该方法。在这种情况下,需要通过电池来为系统供电。

遗憾的是,电池需要不断更换,而更换电池的成本往往比物联网设备的自身成本更高。因此,估算电池寿命至关重要。

影响电池寿命的因素

物联网设备的电池寿命可通过简单的计算来确定:电池容量除以平均放电速率。尽量降低设备使用的能量或增加电池容量将增加电池的使用寿命并降低产品的总体拥有成本。

电池通常是物联网传感器系统的最大组成部分,而工程师可以选择的范围很小。然而,采用大量的处理器、通信技术和软件算法,系统可以通过设计达到所需的使用寿命。

物联网处理器睡眠模式

为物联网应用而设计的处理器提供了各种超低功耗睡眠模式。

以TI CC2650MODA无线微控制器为例。图1显示了设备在不同工作状态下的电流消耗。从关机到主动运行有6个功耗级别。

物联网应用中的电池寿命计算

除非数据采样的频率非常低,否则关闭处理器几乎没有什么好处。而且需要额外的电路和代码来重新启动处理器,徒增成本和复杂性。此外,待机模式的电流消耗小于3μA,电池放电至少需要八年:比许多物联网设备的使用寿命更长,也几乎达到了CR2032电池的保存期限。因此,完全关闭处理器往往无益。

选择适当的待机模式很重要。最低功耗待机模式消耗的电流是最高功耗模式的三分之一左右,但只节省了极少的处理器空间。虽然某些物联网应用需要选择最低功耗的睡眠模式,但是多数应用会选择保留缓存,以减小处理活动模式所需要的周期。

活动模式下的处理工作需调节平衡。图1显示了由于该类型的物联网处理器使用的CMOS技术,功耗会随时钟频率呈线性增加。因此,更快的时钟速度似乎意味着更短的电池寿命,但是由于“基本”电流为1.45mA,所以在较快的时钟速度下运行相同算法需要较短的唤醒时间,意味着放慢时钟并不划算,实际上却缩短了电池寿命。

此外从一种模式切换到另一种模式的唤醒时间也是有限的:例如,CC2650MODA从待机切换到活动模式需要151μs。在48 MHz的最大时钟频率下,需要消耗超过7000个时钟周期的电量,来唤醒处理器。对于仅需要少量代码的应用,在唤醒期间减慢时钟来获取更长的代码执行时间以降低功耗,可以延长电池寿命。同样地,在返回待机模式之前尽量减少唤醒操作次数并执行尽可能多的任务也可以延长电池寿命。

现代物联网设备是非常复杂的产品,集成了许多外设,使单芯片解决方案能够满足不同的需求。然而,通常物联网设备—特别是简单的传感器—并不需要这些复杂的功能。

物联网应用中的电池寿命计算

图2显示了TI CC2650MODA系列中可用外设的功耗。尽管各种设备消耗的电流非常小—仅几十或几百微安的程度—但是禁用这些设备可能会产生重大影响。如果不需要进行串行连接,则可以节省总共318μA。虽然可能看起来不太多,但是这个电流变化会对电池寿命产生重大影响。

物联网通信技术

选择正确的通信技术通常取决于系统要求。电池供电的物联网系统,往往需要使用射频链路。

就无线通信而言,更大的范围或更快的数据传输速率通常需要消耗更多的能量,因此满足这些需求的最低功耗通信技术通常是明智的选择。

而对于物联网传感器,目前有几种主流技术。例如,LoRa技术可以构建覆盖数公里范围的低功耗、远距离广域网(WAN),而低功耗蓝牙(BLE)技术仅能在短距离通信,但是消耗的电量大幅度减少。另一个必须要做的决定是使用片上设备,还是选择单独的芯片来进行通信。

通信接口管理至关重要,因为即使是低功耗通信技术也会很快耗尽电池,并且处理要求通常高于射频阶段。

为了最大限度地利用通信电池的容量,许多物联网系统只有在积累了足够多的数据值得进行传输时才唤醒通信电路。

选择传感器以最大限度延长电池寿命

传感器可以对物联网系统的电池寿命产生重大影响。例如电阻温度检测器和热敏电阻可以随温度改变其电阻。精确度不高的简单应用可以使用分压器,但是高精度系统需要电流源,这需要更多的电量。对于许多应用来说,诸如TI LM35DZ的集成温度传感器是一个很好的解决方案:该设备在室温下精确到±0.25°C,仅消耗60μA。不论选择哪种传感器,都需保证只有在使用它们时才能获取电力。

用于物联网的电池技术

电池选择存在一个问题,许多电池的规格非常有限。除物理尺寸和输出电压之外,通常唯一指定的其他参数就是容量。电池容量显然非常关键,因为它决定了物联网设备可用的总电量。

电池质量对容量有重大影响。简单设定某一型号有可能冒着购入低容量便宜设备的风险。这又会缩短物联网应用的电池寿命,并带来昂贵的电池更换费用。也可能使用了不同化学物质构成的电池:而不同的化学成分会对电池寿命产生巨大的影响。

许多电池随附的简要数据表很容易让人轻信电池是非常简单的设备,电池的容量也是固定的,但事实并不如此。例如,如果负载需要更大电流,则寿命会显著缩短。更重要的是,对于某些应用来说随着温度的下降,电池的容量也会大大缩小。

物联网应用使用脉冲电流。处理器和传感器可以抽取几毫安的短脉冲电流,然后切换到低功耗模式并维持很长时间。使用脉冲电流会导致输出电压下降。图3显示即使2mA的脉冲负载也会使CR2032的输出从3V下降到2.2V左右。

物联网应用中的电池寿命计算

工程师们往往更重视电池的电量存储,而忽视其消耗。然而,物联网应用通常需要以单个电池运行多年,因此保质期非常关键。大部分电池只提供七至八年的保质期。

结论:最大限度延长电池寿命

开发由电池供电的物联网设备需要严谨的工程设计。虽然组件选择很重要,但是糟糕的设计会削弱低功耗处理器的优势。延长电池寿命的关键是确保处理器尽可能地处于低功耗待机模式,并尽可能减少使用无线通信。

在这一背景下,e络盟开发了一款计算器,帮助用户快速、轻松地预测物联网系统的电池寿命(图4)。用户只需输入其处理器、通信设备、传感器和电池的相关参数,以及软件操作的关键细节,该计算器就能预测出物联网设备的电池寿命。

物联网应用中的电池寿命计算

关于e络盟

e络盟是Premier Farnell 旗下系列业务之一。Premier Farnell是全球技术领导者,致力于科技产品和电子系统设计、生产、维护与维修解决方案的高质量服务分销已逾80年。作为 ‘电子与开发服务分销商’,Premier Farnell凭借其深厚的业界经验向电子爱好者、设计工程师、维修工程师和采购人员等广泛客户群提供强有力支持,同时与全球领先品牌和初创企业积极展开合作共同研发全新产品并推向市场。公司还全力协助推动行业的发展以期培养出一批优秀的当代和下一代工程师。

Premier Farnell隶属于安富利公司 (NYSE:AVT)旗下元件营运机构安富利电子元件(Avnet Electronics Marketing)。Premier Farnell在欧洲经营 Farnell element14 品牌,北美经营 Newark element14品牌,在亚太地区经营element14品牌。它拥有一个涵盖3,500多家供应商的全球性供应链,其广泛产品库存可以预测并满足各地区创新客户的需求。

欲了解更多信息,敬请访问:http://www.premierfarnell.com

围观 431

在物联网风潮的驱动下,恒温器已朝向联网与智慧化发展。微控制器(MCU)开发商遂推出低功耗,且具备段式LCD显示控制与Wi-Fi/蓝牙/ZigBee无线连结支援能力,以及256位元AES先进加密功能的新方案,助力智慧型恒温器应用发展。

目前,市场上涌现出越来越多的物联网(IoT)恒温器产品。本文阐述如何使用微控制器(MCU)打造IoT恒温器,并以爱特梅尔(Atmel)SMART SAM L22 MCU为例,同时也介绍此MCU作为段式液晶显示器(LCD)控制器平台实现恒温器应用的功能。该MCU内置一个主频32MHz的ARM Cortex-M0+处理器,拓展该公司现有的低功耗MCU系列。它专为本文描述的恒温器等人机介面(HMI)应用而设计,内置一个支持上至三百二十段的段式显示控制器、一个用于实现按键、滑块和滚轮的外接周边设备触摸控制器(PTC)以及USB、Timer、SERCOM等可配置为USART、SPI和I2C介面的其他众多外接的周边设备。 低功耗/通讯/安全性 IoT恒温器必备功能

IoT应用强调万物联网,因此IoT恒温器也须具备联网通讯功能,此外为因应设备功能与资料传输增多,其亦须符合低功耗、安全性和简易使用的人机介面等特性。

低功耗

与其他很多IoT应用一样,功耗是IoT恒温器的重要考虑因素。IoT应用通常是电池供电型,或者用户希望它们比之前型号在提供更多功能的同时,减少电量消耗。 SAM L22 MCU专为低功耗应用而设计。使用快闪记忆体进行EEMBC Coremark测试时,其工作模式下的功耗低于39μA/MHz,待机模式下的功耗仅为1.87μA(RTC处于工作状态时)。 此MCU之所以能实现上述低功耗,凭藉的是其独特设计和众多特性。例如功率级特性让其能为具体任务选择正确的性能。控制器能将内核电压从1.2伏特(V)迅速切换到0.9V。降低内核电压可大幅降低总功耗,因为中央处理器(CPU)的功耗随着频率和电压的升高而增加。当内核电压为0.9V时,CPU的最大频率为12MHz;而当内核电压为1.2V时,CPU的最大频率为32MHz。例如当内核电压为0.9V,频率为12MHz时,该MCU计算一次斐波那契数列须消耗28μA/MHz;当内核电压为1.2V,频率为32MHz时,同样计算却须消耗37μA/MHz。

除了一个低压差稳压器(LDO)之外,该款MCU还内置一个降压转换器。此前的功耗是采用降压转换器和3.3V电压测量。在此电压下,降压转换器的工作效率最高。这比LDO的效率高出很多,能实现低功耗。

此MCU的另一个优势是直接记忆体存取(DMA)和事件系统(Event System),它们能在无需CPU参与的情况下,实现资料通讯和控制外接的周边设备。各个外接的周边设备在独立执行任务或相互控制时,Cortex-M0+处理器可进入睡眠状态。

这款MCU的模拟功能也是专为此类低功耗应用而设计的。12位1MSPS类比数位转换器(ADC)可在10Ksps和单端模式下测量温度感测器,仅需60μA用于模数转换。

通讯

其次,IoT应用须通过射频(RF)与互联网、智慧手机、感测器、致动器或其他IoT设备通讯。此MCU提供多个输入/输出(I/O)介面,用于连接各种RF模组和其他外接的周边设备。它最多可配备六个片上SERCOM外接的周边设备,足够用于将更多元件连接至恒温器。每个SERCOM外接的周边设备可被配置为USART、UART、SPI或I2C。Atmel SmartConnect WINC3400 Wi-Fi/蓝牙组合解决方案或面向ZigBee设备的SAM R21都可以通过I2C或SPI连接该款MCU。内置USB可用于实现其他有线通讯。该USB是一个无石英的全速USB设备,这意味着无需精准的外部振荡器,从而降低应用的物料成本(BOM)。

安全性

所有IoT应用都必须有重要元件:安全性。为了实现安全的通讯,该款MCU配有一个256位元的先进加密标准(AES)外接的周边设备。它可以在不增加软体开支的情况下进行加密和解密。此外,它还支援多种模式,如密码段连结模式(Cipher Block Chaining)、伽罗瓦计数器模式(Galois Counter Mode)等等。

AES外接的周边设备内置抗差分功耗分析攻击(Differential Power Analysis Attacks)措施。通过差分功耗分析,攻击者能得知控制器的功耗,并利用这些资料探测出加解密金钥。

通过采用这种方法,AES外接的周边设备能随机增加加解密运算的周期,加大攻击者探测出金钥的难度。此MCU还内置一个真乱数产生器(TRNG)外接的周边设备,它能生成真乱数的所有八十四个周期。这个数对于加密至关重要,因为真乱数不能被预测,因此也不能通过数学方法被计算出来。乱数可用于通过IP网路进行身份验证。

加密金钥可保存在备份区暂存器、快闪记忆体或静态随机存取记忆体(SRAM)中。为了提高安全性,此MCU内置一个防篡改单元,它能检测出是否有人试图打开恒温器。防篡改引脚与恒温器的外壳相连。当攻击者通过机械方式打开恒温器的外壳时,防篡改线将断裂,从而检测到篡改攻击。

在这种情况下,防篡改单元将发起“事件”,内核则执行相应的软体功能,删除SRAM、串列电子抹除式可复写唯读记忆体(EEPROM)、快闪记忆体或其他外部记忆体中的加密金钥或其他资料。

为进一步增强安全性,该MCU还内置活动层防护(Active Layer Protection)功能。

讯号通过印刷电路板(PCB)/外壳发送到防篡改输入埠。程式将对该输入讯号与输出讯号进行对比,如果不匹配,则检测到篡改。如果攻击者在PCB上钻孔,并剪断PCB上的防篡改线,该功能也将检测到篡改,并发起“事件”。

人机介面

同样重要的是,IoT应用需有人机介面(HMI)或使用者介面。该IoT恒温器功能由最终用户通过智慧手机控制。但它须提供一个手动更改和监测温度的选项,因为智慧手机有可能发生故障或者丢失。

在这种情况下,内置的段式LCD显示器可向使用者显示温度和其他资讯。段式LCD控制器最多可控制三百二十个段,而且能从五十二个LCD I/O引脚中选择四十八个LCD引脚。设计人员还可选择未使用的LCD引脚,用于实现SERCOM等协助工具或模拟功能。

此外,SLCD控制器还支持各种用于降低功耗的功能。例如可通过DMA将资料从SRAM/快闪记忆体发送到显示器缓冲区。

硬体特征映射、自动位元映射(ABM)和闪烁(Blinking)功能能以极低的功耗改变段式LCD上显示的内容。这种改变无需大功率内核。很多恒温器在它们的显示器上显示当前时间。闪烁功能用于显示秒,同时也是段式LCD控制器的一个硬体功能。

除了能通过无线区域网路(WLAN)或蓝牙远端更改设置或温度之外,使用者还能在恒温器上执行这些任务。此MCU支援Atmel QTouch技术,其中包括采用互电容触控技术和自电容触控技术的按键、滑块和滚轮。该款MCU可为此类应用提供足够多的触控通道。借助Atmel技术,触控按键直接整合到段式LCD的铟锡氧化物(ITO)层上。触控输入可用于升降温度,或选择其他房间中的加热器或感测器。

智慧/触控控制 恒温器更聪明

该款恒温器藉由RF监测不同房间中的无线温度感测器,并控制其中的加热器。使用者可通过WLAN或低功耗蓝牙协议、家用网路或互联网,并使用智慧手机对其进行控制,或直接使用触控按键进行控制。

此MCU内置的ADC能测量恒温器周围的温度,其对来自温度感测器的外部数值进行数位化处理。内部温度感测器可用于控制外部数值,以便进行交叉核对。而MCU的内部温度感测器提供两点测量功能,精度为±1℃(0∼60℃)。

另一条ADC通道也可用于测量电池电压。欠压检测(BOD)功能可检测出较低的电压,并自动关闭系统,以防出现故障。

来源: 电子产品世界

围观 285

恩智浦智能网关平台完成对亚马逊AWS Greengrass集成 为边缘计算和物联网云平台提供安全高效支持

恩智浦半导体(纳斯达克代码:NXPI,以下简称“恩智浦”)今日宣布与亚马逊AWS开展合作,在其设计研发的Layerscape智能网关平台上成功完成对亚马逊AWS Greengrass的集成。亚马逊Greengrass软件程序能将AWS云服务扩展至本地设备,以便收集并分析更靠近信息源的数据,同时使得在本地网络中与其他设备间的安全通讯成为可能。

这一融合为边缘计算和物联网云平台的互动提供了高效的安全支持,实现了业务的敏捷交付,进而为家庭、企业和其他商业环境的用户提供国际水平的安全的物联网服务。未来,双方还将围绕边缘计算和云平台共同开展产品研发、业务开拓和市场推广工作方面的合作,通过协同创新旨在保证物联网时代的数据安全。

恩智浦提供的智能网关平台采用其自主研发的QorIQ® Layerscape架构处理器。该处理器系列不仅具有卓越的边缘计算能力和安全性能,而且还可将 AWS云服务 无缝扩展至设备端,以便在本地实时处理物联网设备采集的数据同时,仍可将数据在云端进行管理、分析和持久存储。Layerscape系列处理器采用了业界领先的64位ARMv8架构,具有体积小、功耗低、性能高的特点。产品线从单核、双核、四核到八核SoC一应俱全。该系列处理器还集成了强大的网络、安全、存储和TSN等硬件加速引擎和可编程的应用接口,借助恩智浦精湛的安全连接软硬件技术,为边缘端提供强大有效的计算、安全、虚拟化、存储和实时响应能力。凭借其高性能与低功耗完美结合的优势,Layerscape处理器已成为SDN/NFV边缘计算节点、企业级、工业级及家用级智能网关设备的首选平台。

恩智浦半导体数字网络事业部亚太区市场总监曲大健表示:“恩智浦致力于通过创新与合作驱动物联网行业的发展。恩智浦Layerscape与亚马逊AWS的集成融合不仅有效提升了边缘计算与云平台的运营效率,还消除了物联网迅速发展下的安全隐忧。能够与亚马逊合作,恩智浦感到十分欣喜,我们期待双方携手共促物联网生态的健康发展,助力构建智能互联世界。”

亚马逊Greengrass 能够帮助客户轻松构建并实现软件功能在边缘与AWS云端之间的无缝转换,以最少的成本帮助客户获得较低的延迟和更好的体验。恩智浦不仅在工业物联网和互联网领域拥有丰富的行业经验和广泛的客户基础,在智能硬件系统领域也拥有多年的研发投入与经验积累,成为亚马逊AWS在边缘计算、云服务和安全连结领域的首选合作伙伴。

在当今及未来的物联网网络架构中,网关设备发挥着越来越重要的作用。它既提供传统网络协议的基本服务,还承担对下连设备的智能化管理,本地化计算存储,端到端的网络安全连接,为各种业务提供低成本、高效率、高质量的交付管理等功能。作为全球领先的安全连接及基础设施解决方案提供商,恩智浦设计的Layerscape智能网关能广泛应用于智能家居、智慧城市、工业物联网和人工智能领域。未来,恩智浦将携手更多物联网产业链的合作伙伴,协力推动中国物联网的落地与加速普及。

围观 154

来源:单片机与嵌入式系统应用

引言

物联网市场呈现飞速增长的发展,在这些领域蓬勃发展的背后,MCU作为物联网的核心器件,要满足怎样的条件才能符合用户产品的需要?更多联网产品的出现,使得MCU的功耗是否要越来越低?MCU是否要同FPGA和无线模块高度整合在一起,更加集成化地服务于上述技术领域?究竟什么样的MCU才能抓住机遇,登上物联网市场高速增长的列车?

业界声音

连接能力、能量模式和集成功能是MCU必备的素质

Silicon Labs32位微控制器 产品高级营销经理 ivind Loe

(1) 连接能力是物联网的必备条件

无论现在还是未来,连接能力都是物联网(IoT)连接设备中的微控制器的关键特性之一。强大的无线连接能力不仅对许多物联网应用而言是必需的,而且这些应用也需要更先进的特性,例如对多协议无线的支持,可用来处理诸如多种网络的调试和共存这样的问题。能够使通信信道安全对于保护物联网系统免受入侵也是至关重要的。安全性应该通过硬件加速来最大化效率、响应时间和电池续航能力,因为数量众多的物联网设备都是由电池供电的,或者拥有有限的能源。

此外,高效的传感器接口、灵活计时外设和高集成度通信外设也是关键的构件,这些外设必须都能够在深能级模式中自主工作,以最小化能量损耗。

物联网开发人员需要能帮助自己去实现能效最大化、调试问题和优化网络的开发工具。强大的软件构件也是非常关键的,它可以使开发人员致力于实现产品的差异化,同时无须为每个设计项目进行重复性的工作。

(2) MCU必须要有精心设计的能量模式

一些物联网应用,如智能抄表和智能信用卡,可能会有极低功耗的要求;而诸如智能手表等其他应用,可能对MCU本身的低功耗要求并没有那么严格,因为手表中其他的元器件可能占据了电流消耗的主要部分。

为了适合各种不同的应用,MCU必须拥有精心设计的能量模式,支持MCU去实现电流消耗与响应时间和功能之间的平衡。举例来说,诸如智能信用卡这种需要睡眠模式下电流消耗低于50 nA的应用,可以使用Silicon Labs的EFM32 Gecko MCU和Wireless Gecko SoC的EM4模式。EM4模式拥有最低的电流消耗,但同时只提供少量的外设且唤醒时间更长。而智能水表应用则宁愿使用Gecko MCU和无线MCU的EM2模式,因为EM2模式允许低于1 μA的电流消耗,同时允许复杂的传感器接口自主运行,以便水表处于休眠模式时仍可测量水流量。

(3) 集成功能对于MCU的众多好处

将各种功能集成到MCU中有许多益处,包括更低的解决方案成本、更小的占板面积和更高的功能集成度,进而可产生更高的性能和更低的能耗。我们也看到了对于验证无线模块的高度需求,该无线模块包含一个无线MCU,同时集成了包括天线在内的所有外部无线元件,从而使产品开发人员可以极其容易地将无线功能集成到自己的产品中。

安全防护是MCU急需解决的问题

新唐科技股份有限公司
单片机应用事业群技术经理 凌立民

物联网已开始席卷全球应用领域,成为市场关注焦点,根据高德纳 (Gartner) 物联网预测报告显示,2017年全球物联网装置数量将会达到84亿个,市场份额可达到1 700亿美元,而到2020年装置将成长至204亿个,份额达2 936亿,可见物联网市场为未来之新兴成长动能,台面上各家厂商亦已经积极展开布局。

进一步分析物联网应用范围,其应用范围相当广泛,包含智能医疗、智能家庭与城市、智能工厂、智能交通、环境监控与安控等;其中物联网终端设备为能支持各类型平台,串连网络传输与应用,因此必须具备高效能的运算能力,笔者相信高效能已经成为厂商竞逐的杀戮市场;但除了效能外,物联网终端设备更重要的是设备必须时刻无线连结上网,无时无刻不存在安全隐患,设想一个家庭的电、水与瓦斯等设备装设了可受远端管理的连网装置,如果能轻易被黑客窃取控制权,轻则导致能源供应中断,重则可能引起人身安全或重大公安意外。因此,作为物联网核心器件的单片机,除了效能外,更该考虑的是如何顺应日益严峻的连网安全需求。

目前物联网终端节点,大部分只配备了基础资源进行简单的感测与资料传输工作,但伴随着云计算与大数据的兴起,许多关键性的资料存储与运算都至云端进行,资料到达云端前会经过连接层、路由器层、通信协定连线层及网际网络层等,资料透过不同的装置传送,传递过程皆有可能出现安全风险;参考OWASP (Open Web Application Security Project) 组织所整理的物联网最可能引起信息安全与实体安全防护问题的疑虑之前十项为:

不安全的网络界面;认证/授权不足;不安全的网络服务;传输加密机制的缺乏;隐私权防护不足;不安全的云接口;不安全的移动设备接口;安全配置不足;不安全的软件/韧体;不安全的硬件设备。

不难发现,除信息安全外,实体安全防护仍是物联网最需要解决的问题。ARM公司在2016年10月发布了过去仅在CortexA系列才配备的TrustZone技术的CortexM23和CortexM33处理器,这两款处理器都是基于ARMv8-M架构的新型CPU;TrustZone技术可视为将软件运行在不同的处理器区域上,如安全区 (Secure Zone) 和非安全区 (NonSecure Zone) ,彼此互动将受到严格管制,我们可以想象如同在安全区开了一份白名单,唯有符合白名单条件才能通行,两种软件方能进行互动,因此TrustZone让通用型单片机借由白名单规则来防范恶意程序,满足物联网设备所需的实体安全防护需求。

当然安全防护有不同等级,以ARM 公司官方的分类来看,嵌入式系统 (Embedded System) 安全等级的考虑分为四类,安全性从低至高为应用级防护 (Application Level Security)、进阶型防护 (Privilege Level Security)、TrustZone防护 (TrustZone防护)、防窜改防护 (Antitampering Security)。

应用级防护本质上为软件所提供的安全机制,几乎所有市场上的处理器 (CPU、MPU、MCU等) 皆可以支持此等级的安全需求;进阶型防护在执行时将系统程序分类成Privileged和Unprivileged 状态,类似开了一份黑名单给管理单元来预防破坏的恶意程序,以警告或强制停止系统运行等方式进行保护,由特定等级的MCU才能做到;TrustZone防护仅少数MCU可以做到,如CortexA 系列或CortexM23和CortexM33系列;防窜改防护等级是针对特定用途所设计的芯片,考虑的是MCU本身对实体攻击 (Physical Attack) 的防护,如MCU线路布局设计、引脚信号不可侦测性、整体软件运行速度调整防止比对等进行防护。

上述四类的安全防护等级与投入的资源相关,设计者可思考自己的MCU应用系统需要提供的安全防护等级;一般应用级防护适用于所有处理器,故其出货量成长最为快速;进阶型防护可利用此类MCU内建的MPU (Memory Protection Unit)来设定专属记忆体保护区块,以运用于进阶资安需求的应用,例如一些未连网的装置或对连网安全不是那么有迫切需求的电子产品,TrustZone防护可适用于更高安全层级软件资产安全保障需求的生物办识领域(如指纹辨识应用、智慧连网装置如电子锁应用与门禁系统等),更可在MCU应用系统领域里实现由TrustZone所支持的更加安全的二次开发 (Collaborative Secure Software Development),同时兼顾连网装置在设计功能上多样性需求的弹性,非常适合用于打造安全之物联网环境,其成长力道不容小觑;至于防窜改防护MCU,例如金融行业的相关卡类应用可以说是对芯片安全防护要求等级最高的,可采用防窜改防护等级,保护机密资料不易被入侵。

物联网将持续发酵与带动半导体产业新兴应用发展,IC Insights预估,IC市场从2015年至2020年成长动能除车用市场外,以物联网市场成长最为快速,年复合增长率为12.8%。相信各家厂商要决战全球物联网市场,除了必须善用原有竞争优势,发展关键技术以外,安全相关的技术亦扮演举足轻重的角色,唯有确保了安全性,才能在此波商机中,抢得一席之地。

飞腾公司FT2000/64芯片性能追平Intel

2016年8月,飞腾公司发布了FT2000/64芯片,其通过集成高效处理器核心、基于数据的大规模一致性存储架构、层次式二维Mesh互连网络以及自定义扩展接口,搭配独立的存储扩展芯片(CMC),提供业界领先的计算性能、访存带宽和I/O扩展能力。

物联网的建设离不开海量服务器的支持,虽然ARM叫嚣着进服务器市场叫了不少年,但是到目前为止,产品并不多。所以,能有一款逼近了Intel的性能和性能功耗比的芯片,对整个ARM架构占领服务器市场来说都是意义重大的。

编辑视角

随着物联网时代的复杂化,海量数据需要被物联网硬件采集,大型的服务器同时要对海量数据进行处理、分析,对于64位MCU会有大规模的需求,将刺激64位MCU的大幅增长;而如何在低功耗的前提下又能实现较高的运算能力,成为摆在MCU厂商面前的一道难题,超低功耗MCU是物联网时代的必备条件;物联网环境下,要通过传感器感知外界信息,通过处理器进行数据运算,通过无线通信模块发送/接收数据,因此采用集成传感器+MCU+无线模块的方案才是MCU要抓住的机遇。

随着MCU技术的成熟、芯片设计技术的普及,以及对市场的充分了解,物联网时代不断涌现的巨型企业,必然会走专用MCU的创新之路。近年来许多大用户直接发展自己的专用MCU,如科大开发用于超级计算机、服务器的MCU、华为开发手机专用MCU,最近小米的松果芯片也面向市场,种种市场现象都表明,实现个性化的MCU创新定制才能抓住机遇,登上物联网市场高速增长的列车。

围观 320

来源:SiliconLabs微信公众号

在上一节中,您了解了一些软件开发的基本实践和提示。我们在本节继续讨论这些主题,包括内联函数,读取和写入闪存(包括用户页面闪存),以及如何避免缓冲区溢出。我们将讨论类型转换的潜在问题,以及如何在出现问题时用配置锁解决问题。

根据下列重点步骤写好代码,一切都会更好!――续
(本系列1到8部分请参加往期文章:
http://community.silabs.com/t5/Official-Blog-of-Silicon-Labs/Essential-B...

九 内联函数的影响与限制

如果您在函数的前面定义关键字“inline”,则告诉编译器您希望将该函数复制到代码中,就像是直接输入代码而不是作为函数。作为程序员,你希望这可以加快代码执行速度。每当在C中调用函数时,输入参数的内容,在函数完成时,代码应该与返回地址一起被放置到栈上,然后代码跳转以执行函数。通过内联函数,您打算绕过该将数据移入和移出堆栈的时间。然而,C编译器或多或少地会用到这一技巧,因为小的函数将由编译器自动内联。编译器将忽略对大型函数的这种内联建议,编译器已经确定这些函数不会从加速中获益。
内联函数不能包含本地静态变量。由于函数内容要在代码中替换,因此对函数作用域私有的静态变量没有意义。内联函数没有作用域。

十 读写闪存的区别

在EFM32中从闪存的任何区域读取数据非常简单。可以使用指向内存地址的指针访问闪存,如:
volatile uint8_t* address = 0x1000;
uint8_t my_value =*address;

通过在地址变量前面放置星号,您可以解除引用指针,这将提供系统地址0x1000的字节大小的内容。从闪存检索的字节数将根据my_value的变量类型而有所不同。例如,定义为uint64_t的my_value将从地址0x1000到0x1007同时获取8个字节。因此,执行my_value ++作为64位无符号整数指向0x1008。

写入闪存是一个更复杂的业务。所有闪存将存储器组织成“页面”,其将可写入单元组合在一起,成为只能作为一组擦除的chuck。因此,如果要写入单个字节的非易失性存储器,则必须先擦除整个页面。对于程序员来说,这意味着你必须首先读取整个页面的内存,将它存储在RAM中,擦除页面,然后将修改的字节写回整个页面,你在操作的中间不能失去电源,否则你将永远失去了那个页面的数据。通常也有时间含义,因为擦除和写入页面比读取值需要更多的时间。当一页闪存被擦除时,该页的所有内容被复位为1,或在字节大小的存储器查看器中为0xFF。因此,当你写一个字节到内存,你只是清除那些不是1的位。
要写入EFM32闪存,另一个要求是,写入闪存的功能必须驻留在RAM中,而不是在正常执行代码所在的闪存中,在那里相同的代码正被执行。这要求任何意图写入闪存的函数也将被执行的RAMFUNC声明,就像在ramfunc.h库实用程序文件中定义的那样。

十一 将持久数据存储在Flash用户页面闪存中

主闪存从地址0开始,并根据EFM32模型有着不同的容量上限。有关特定芯片的主闪存结束的位置,请查看参考手册。除了内置闪存,还有一个内存区域,用于外部闪存扩展,其位于内部主存储器之外,最高可达24 MB。上一节中所述的任何读取或写入主闪存的操作都可用于访问主闪存。但是,每次对芯片编程时,或者如果器件被擦除,存储在程序使用的区域中的数据将被新的代码覆盖。因此,当执行闪存更新过程时,例如,在引导加载器中,通常使用对主闪存的读取或写入。您当然可以随意使用位于程序大小以上的闪存,只要您意识到如果芯片通过器件擦除操作或JTAG编程序列擦除,它将被擦除。

EFM32提供了一个单独的闪存存储器页,它不会被器件擦除操作或JTAG编程操作擦除。闪存的这个区域称为用户页,并从地址0x0FE00000开始。可用的内存量是单页,并且闪存页面的大小根据EFM32芯片的型号而变化。有关闪存页面的大小,请查看数据手册或参考手册。您可以将此页面用于从设备擦除操作(例如设备序列号,设备校准数据或每个设备特定的任何数据)开始,从引导到引导的设备上保留的任何内容。

十二 避免缓冲区溢出和可能造成的破坏

当使用计算机开发代码时,您很幸运能在具有操作系统,内置文件系统和显示屏幕的系统上开发。当你的软件遇到麻烦,操作系统开始采取行动,帮助你,并通知你,你试图访问超出程序范围内的内存,或者你造成了一些故障。在开发嵌入式代码时,你没有这些帮助。没有操作系统来监视事情,以确保你的程序保持在一个很好定义的边界。如果你的代码决定写数据到地址零或一百万,MCU将尝试做它被告知的任何事情。它不能告诉你,你不知道你在做什么,因为没有限制你的程序可以做什么。你种情况有好坏两个方面。

嵌入式开发人员面临的一个大问题是缓冲区溢出。在嵌入式中工作意味着对存储器地址的大量直接操作。如果你的程序开始表现不规律,或者你看到一个看起来改变其值而不设置的变量,缓冲区溢出可能是罪魁祸首。

首先要注意的事是显而易见的。如果定义一个长x个字节的数组,请不要写超出x-1。如果在名为foo的数组中有x个项目,则只能将foo [0]映射到foo [x-1]。坏事是,如果你寻址foo [x],foo [x + 1],等等,你的代码仍然有效。 MCU将满意地写入任何其他变量恰好超出foo [x-1]的位置。然后你的项目开始出现问题。

当你调整指针,而将指针转换为不同的类型时,这也可以失去控制。例如:

void some_function()
{
// Array of just 4 bytes
uint8_t my_array[4];

// Pointer to group of 4 bytes
uint32_t * my_ptr =(uint32_t *) my_array;
// foo is assigned all 4 bytes of my_array,
int foo =*my_ptr;

// then my_ptr is incremented by one
// which to my_ptr's type means 4 bytes
// So my_ptr is now sitting out of bounds
my_ptr++;
}

以上演示了为什么使用在创建时是单向键入的结构,但稍后由不同类型的指针使用需要小心的原因。你可以做类型转换,但并不意味着你应该做。

另一种可以遇到缓冲区溢出问题的方法是忘记局部范围的限制。在C中,函数完成的大部分工作都是在传递给函数的指针上执行的。C函数的返回值通常被限制为“状态”字节,因为简单的值很容易从堆栈中的C函数返回,而其他结构很难返回。例如,一个简单的数组是局部的一个函数:

// This function will generate a compiler warning:
// warning: function returns address of local variable
int* some_function()
{
int my_array[4];
return my_array;
}
// This function has no warning!
int* some_other_function()
{
int my_array[4];
int* foo = my_array;
return foo;
}

一旦函数返回,分配给my_array的内存将被系统回收并分配给需要内存的下一个东西。如果从C函数返回一个指向本地数组的指针,编译器不会警告你,MCU会做你所要做的事情。如果在函数返回之后没有新的内存分配,代码有时会工作。你的解决方案将是间歇性的!

// This is a better way, pass pre-allocated pointers intothe function
// “int my_array[]” and “int * my_array” are identicalfor function parameters
void some_new_function(int my_array[])
{
my_array[0]= 1;
}

十三 精通类型转换

当你在嵌入式开发中“触及核心”时,你会经常使用小量的信息,所以你最终经常使用有限的可变大小(例如8位寄存器)寄存器,从一种类型转换到另一种类型。本节的一些例子展示了在uint8_t类型和uint32_t类型上增加指针时,你必须注意对地址的影响。此外,还必须了解C编译器如何解释和转换类型。

将类型从一种类型转换到另一种类型实际上不执行任何转换。它不是一个函数,而只是一种告诉编译器如何解释数据的方法。当你分配不同类型的变量,C编译器应该警告你,但编译器并不总是警告你这一点。例如,考虑将有符号整数转换为无符号整数的情况,如下所示:
int8_t a = 0; // Range is -128 to +127
uint8_t b = 0; // Range is 0 to 255
long c = 0; // Range is huge, both positive and negative
a =-64; // a can be negative
b = 64; // b can only be positive
c = a + b; // c is 0
a = b; // Converting a signed to unsigned is OK, in this case
c = a - b; // c is again 0
b = 128; // b is now bigger than a can represent
a = b; // a is now converted to -128
c = a - b; // c = -128 - 128 = -256!

这个例子显示了当你的变量变大时会遇到的麻烦。事情工作正常一段时间,但然后当你的变量超过范围,他们开始失败。确保在转换类型时知道您想要什么。大小为8的uint不能容纳超过0到255范围的任何内容,8位的int不能容纳超出-128到+127的任何内容。简单地把一个大的uint8_t作为一个int8_t不能将你的int8_t变为一个更大的int。它仍然限制在+127。如果你想增加它的范围,你必须使用更大的类型,如int16_t。

十四 使用配置锁来缓解故障代码的问题

有时候,当嵌入式工程师对指针进行数学运算时,我们会使用我们的软件来影响硬件。一种保护你的代码不因缓冲区溢出和其他糟糕的指针算法而造成严重错误的方法是使用配置锁。许多EFM32外设上可用的配置锁需要一个特殊值写入配置锁寄存器,以允许更改外设配置。这防止错误行为代码改变设备的整体配置。

编码成功的关键

从现有示例开始,然后使用命名良好的变量和大量注释记录您的更改。进一步了解C语言,并了解在何处以及如何声明变量和函数。不要尝试写入尚未擦除的闪存或超出变量可访问范围的内存。

在下一节中,我们将学习如何在SimplicityStudio IDE中更好地控制软件构建。

围观 316

随着物联网智能化的提升和不断迭代,FPGA将发挥更多的数据预处理、桥接、I/O扩展等作用。

电子企业的成长一般都会呈现“S型”曲线,与产业的走势休戚与共。要与之对抗,需应对技术和商业模式的双重挑战。英特尔PSG(可编程解决方案事业部)产品营销与策划副总裁Alex Grbic认为,未来万物皆互联的时代,技术层面要解决互操作性,满足相关标准协议,或某应用层面的协议,以及如何在大量数据的收集和处理的同时提升性能和降低功耗。商业层面涉及系统的灵活性和可扩展性,此外价格是重要考量。因而,对于IC的革新至关重要。

单打独斗拿不下物联网?MCU需要FPGA助攻

01FPGA适应智能化和I/O扩展需求

在物联网的方案中,MCU扮演核“芯”角色。但随着应用的更新迭代,MCU+的趋势也愈来愈明显,特别是MCU+FPGA应用广泛,以满足性能、可扩展以及集成的要求。

Alex Grbic举例说,以汽车业为例,随着智能化的提升,汽车传感器会越来越多。此外在显示方面,不仅LCD显示屏的数量会翻番,而且分辨率要求也越来越高,需要芯片进行更高速的处理、支持更高的带宽。在工业和嵌入式视觉领域,也需要不断满足智能、视频图像和传感器等的升级需求,处理更多的数据,支持更高的I/O带宽。

这时“单打独斗”的MCU或难以“招架”,需要协处理器来做一些数据预处理,或I/O扩展。相较而言,低端FPGA因其配置和可编程,不失为协处理器最佳选择。

“比如在视频监控中,FPGA可作为视频信息预处理后,再交付给MCU运算。或者在汽车智能应用中用于后视摄像头和传感器融合,进行多传感器数据的高速处理,再传给MCU进一步处理。针对把成本和功耗作为设计决策关键要素的应用,则可做芯片之间的桥接、I/O扩展等。此外,在某些应用场景中,FPGA亦可单独做主芯片。”Alex Grbic表示。

虽然低端FPGA作用显著,但对其也提出了支持高速收发器和硬浮点运算的新要求,需要与时俱进。英特尔PSG最新发布的低端Cyclone 10 FPGA可谓有备而来。

02新FPGA的“和而不同”

虽然FPGA玩家屈指可数,但低端FPGA基本是个个涉足,竞争激烈。但Cyclone 10 FPGA与其他低端FPGA不同的是,其GX型号是业界首款集成10G收发器和硬浮点数字信号处理(DSP)的低功耗FPGA,处理速度高达134 GLOP,性能相对前一代Cyclone V有两倍的提升至1.4G,但功耗却与其相当。而LP型号则更强调的是低功耗和低成本,功耗仅为前一代的60%。

因而,在高I/O效能及对速度有关键性需求的应用,包括汽车、工业和嵌入式视觉领域,GX完全胜任;这些应用涉及的芯片之间的桥接、I/O扩展等,LP亦可发挥作用。

单打独斗拿不下物联网?MCU需要FPGA助攻

对于成本和功耗的双重优化,Alex Grbic英特尔PSG的诀窍在于:一是采用台积电成熟的20纳米工艺;二是架构的创新和软件工具的优化,如针对FPGA的应用场景会定制或者筛选匹配的软件工具。架构创新。三是测试和封装的一些流程的优化。

值得注意的是,Cyclone 10 FPGA集成了可定制的软核(Nios II处理器),实现可编程和可配置,但是不支持ARM,是否英特尔的FPGA策略会有所改变?Alex Grbic回应说,英特尔现有的Cyclone V和中端Arria 10和Arria V均支持ARM,上一代的Cyclone V可平移到Arria 10和Arria V。未来的产品规划也都会将集成ARM的SoC纳入其中,这不会改变。

03成英特尔IoT大战略重要一环

值得注意的是,英特尔PSG开发的 Cyclone 10,锁定汽车、工业、嵌入式视觉等应用,与英特尔物联网部门的战略相当一致。

近些年英特尔在全力开发更开放、安全及可扩充的IoT解决方案,构建IoT生态圈。将Altera纳入囊中后,FPGA也成为其大生态良性循环的重要棋点。

Alex Grbic也着重指出,Cyclone 10与英特尔IoT的战略相符。英特尔的FPGA可涵盖从万物到云端的所有领域。Cyclone 10主要应用场景集中在万物和管道端,其中价值在于进行智能化数据处理,或预处理完再上到云端,减轻云端负荷。针对更高端的云端应用,则可采用英特尔中端和高端的FPGA。

单打独斗拿不下物联网?MCU需要FPGA助攻

如今,中高端FPGA在云端+CPU或+GPU之势正兴,英特尔推低端Cyclone 10,或意图进一步加强在万物和网络端的实力。而有着英特尔的大生态规划及先进的工艺节点“护航”。Cyclone 10的市场表现亦值得期待。

来源:智慧产品圈

围观 280

在前一节中,你了解了一些帮助你进行硬件原型设计的重要原则。在本节中,我们将分享在软件开发方面的经验教训。关键词extern,static和volatile都是什么?你应该在你的代码中使用递归还是malloc()?

根据下列重点步骤写好代码,一切都会更好!

一 查找硬件设备的现有软件示例

开发任何嵌入式解决方案的第一步是找到可以使您的任务更简单的示例。您在自定义解决方案中找到的特定部分的软件示例将帮助您以另一种方式“查看”设备,并帮助您重新解释设备规格,即使这些示例是针对其他计算机架构或软件语言的。

二 编译器的代码

没有完美的计算机软件语言。所有语言都有自己的优势和弱点。用于EFM32家族的Simplicity Studio中使用的软件语言是C. C语言有着很长的历史,它被广泛信任,并且在嵌入式设计上表现良好,但是其语法及特性很难掌握。当你在C中编码时,你实际上是为编译器和其他构建工具编写指令。记住这一点。C语言是“接近金属”的语言,因为您的代码在人类可读格式下编写的代码,汇编代码和二进制映像的构建过程的结果之间仅有几个步骤。

C代码具有严格的类型,要求某些变量匹配得足够好以执行安全赋值。这是为了保护你不要做愚蠢的事情,比如变量(即指针)的地址和变量的内容。但是经常在嵌入式开发中,您需要能够将纯数字转换为地址,以便指定寄存器地址。这需要你熟悉类型转换,以告诉编译器你真的知道你在做什么。

三 使用描述性变量和函数名称

你可以做的最好的事情是确保你的代码设计得很好,使用描述性的变量和函数名。在C代码中没有与长名称关联的运行性能损失。当构建工具将C代码转换为二进制机器码时,将删除所有标识符。请考虑在FAT文件系统(FF)库中找到的以下代码段:

res= dir_sdi(dj, 0);
if (res == FR_OK) {
do{ /* Find a blank entry for the SFN */
res= move_window(dj->fs, dj->sect);
if(res != FR_OK) break;
c= *dj->dir;
if(c == DDE || c == 0) break; /*Is it a blank entry? */
res= dir_next(dj, 1); /*Next entry with table stretch */
} while (res == FR_OK);
}

上面的代码有一些注释,这当然有帮助,是一件非常好的事情,但是很难通过查看变量,函数,枚举和预处理符号知道这个代码的确切原因。考虑使用以下代码作为替代:

// Load the first target_directory entrywithout table stretch
result = set_directory_index(target_directory,NO_TABLE_STRETCH)
if (result == FAT_RESULT_OK)
{
//Look for a blank entry for the Short File Name over all directories
do
{
result= find_next_window_offset(target_directory->file_system_object,target_directory->current_sector);
if(result != FAT_RESULT_OK)
break;

//Window offset was OK, check the entry
short_file_name= *target_directory->short_file_name;

//Is it a blank or unused entry?
if (short_file_name[0] == DELETED_DIRECTORY_ENTRY_BYTE
||short_file_name[0] == UNUSED_DIRECTORY)
break;

//Get the next entry with table stretch
result= get_next_directory(target_directory, TABLE_STRETCH);
}
while (result == FAT_RESULT_OK);
}

是的,代码有点宽,难以键入,但SimplicityStudio提供代码完成与CTRL +空格键的快捷键,你可以随时剪切和粘贴。代码可读性会增强,需要更少的寻找变量名。我们可以通过查看第二个例子来说明,这段代码旨在查看目标目录,并在找到目标目录中的已删除(先前已填充但现在可用)或零(从未填充)短文件名条目时中断。描述性名称允许您像读一段故事似得阅读代码,在你阅读时告诉你目的。

四 严肃的对待注释

一个好的软件开发人员在几个关键的地方给代码添加了很多注释。注释,如长变量名,不影响到运行时可执行二进制文件的文件大小,只是在那里,以帮助阅读文档的代码。解决方案中每个文件的顶部应说明该文件的目的,并且在每个函数的顶部应有较长的注释,说明函数的用途以及描述输入和输出。除了这些关键的地方,应该在逐行的基础上使用注释,无论代码的意图清不清楚。使用描述性变量名称可以帮助解释代码的目的,并减少必要的注释,使得那里的注释更突出。相信我,一年后你不会记得当初写代码的目的,所以要重视注释了!

五 使用emlib库

对于EFM32程序员,emlib库是你的朋友。接入EFM32外设时,尽可能的调用这些库。这些库经过良好测试,并有额外的代码来帮助寻找问题,而不仅仅是直接调整寄存器。例如,以下代码使用emlib库:
TIMER_TopSet(TIMER3, 1000);

相同的事情可以通过预处理器定义寻址内存映射外设的寄存器来完成,定义TIMER3为0x40010C00。我们不使用这个地址,因为它很难被记住,但这是TIMER3映射在主内存中的地方。
TIMER3->TOP = 1000;

所有外设以完全相同的方式映射到内存地址,因此有时您会看到使用此指针表示法的示例,而不是emlib库函数。如果您将看到em_timer.h中的TIMER_TopSet函数定义,您将看到该函数与此示例完全相同,因此在这种情况下,库函数没有提供任何附加值。然而,使用emlib库,有时会得到比简单操作映射寄存器更多的功能。例如,CMU_ClockEnable函数在最终使用“bit band”命令确保寄存器位自动地设置之前,小心地代表您做出很多决定。尽可能频繁地使用这些库函数,以获得所有EFM32库设计师设计的便利性。

六 定义变量以避免堆栈和堆的问题

C的许多方面对于非专业的程序员来说并不明显,但在嵌入式设计中运行代码时变得很重要。对于初学者,所有本地声明的变量都在栈上。这些是您在函数或任何代码块中定义的变量。

堆栈是从“内存顶部”或物理RAM中最高可用地址开始的内存区域,然后向下计数,直到达到堆栈限制。如果您定义了太多的局部变量,或者您的代码通过使用递归或其他嵌套函数动态创建这些变量,那么您的堆栈空间会被占满。

全局变量是在模块级别的所有函数和其他代码块之外定义的变量。编译器自动为heap上的全局声明的变量分配内存,这是堆栈外的主内存池的一部分,如果您尝试分配太多的RAM,将会产生编译器错误。但是,在代码中使用malloc()命令可以动态地在运行时在堆中分配RAM。

在具有有限RAM的嵌入式处理器上使用recursion或malloc()命令是一个冒险的任务!你必须理解你的代码将需要多少递归尝试(或malloc()调用)以便解决问题,然后设计一个永远不会用尽堆栈空间的解决方案。

如果您在代码中定义所有变量并让编译器确定如何自动管理内存,您将遇到较少的超出堆栈或堆的问题。即使有这样的预防措施,如果你的代码几乎是可用的RAM大小,当你编译和构建你的代码,你将需要学习如何监视堆栈和堆的大小,这部分内容超出本节的范畴。

int foo; //Global variable, memory is on the heap

void some_function()
{
int bar; // Localvariable, memory is on the stack
}

七 全局静态变量和局部静态变量的差异

使用关键字“static”定义的变量表示不同范围的不同内容。在内部函数中,static关键字用在变量的前面,以记住它在函数调用之间的值。它具有一种“粘性”,你可以在函数的第一次调用时初始化它,然后让它保持其值,而不是每次函数执行时重新初始化非静态变量。在全局范围,所有变量都是“粘性”的,因为它们只在运行时开始时初始化一次,然后记住它们的值。但是,放置在全局变量前面的static关键字指示编译器该变量对于该模块是本地的,并且不被外部模块使用。对于同一个“static”关键字,这是一个完全不同的含义。

int foo1 = 1; // Global variable, initialized only once
static int foo2 = 2; // Global variable,initialized only once, private to this module

void some_function()
{
int bar1 = 3; // Local variable, initializedevery time the function is called,
//private to this function

staticint bar2 = 4;// Local variable, initialized only the first time thatthis function
// is called, private to this function

int foo1; // This is a bad idea. Local foo1 overrides global foo1 and makesthe
//global version unavailable inside this function
}

八 volatile和extern的含义及如何相互影响

只要变量和函数在模块中未声明为static,它们就可以在该模块外部使用,并在其他模块中使用。为了告诉编译器你打算在模块中使用相同的变量,你在一个模块中定义一个常规方法的变量,并在设计中所有其他模块的定义之前添加关键字“extern”。现在,您设计中的所有模块都可以访问同一个变量。但是,如果设计中的其他模块中的一个模块意图修改最初定义的位置之外的变量的值,则必须在该变量前面添加关键字“volatile”。这个volatile关键字告诉编译器该变量可以在模块之外更改,并阻止优化器删除似乎没有效果的语句。
// Module A
int foo; //Meant to be modified in this module only
volatile int bar; // Value can changeunexpectedly outside of this module
// Optimizer must always evaluate the value ofbar

// Module B
extern int foo; // We can read this valuedefined in Module A, but should not modify it
extern int bar; // Since declared volatilein Module A, we can read and modify this variable

此外,当使用Release版本和Debug版本时,使用volatile非常重要。当优化设置增加时,编译器将主动尝试压缩不必要的代码。这意味着您需要防止编译器这样做,通过使用volatile关键字可以改变当前范围之外的任何变量。

在下一节中,我们将继续介绍软件路径的最佳实践,了解内联函数,如何使用闪存,配置锁以及如何解决缓冲区溢出问题。

围观 433

微控制器(MCU)广泛应用在各行各业,如各式家电、工业自动化,实时控制、资料采集等领域,为因应工控所需的实时(Realtime)控制、快速回应等需求,因此MCU大多搭载RTOS(实时操作系统)运行。随著物联网的兴起,软件业也为RTOS加入物联网的成分,以提早卡位物联网的核心软件市场…

各种处理器专用之OS

在一般功能(General-purpose)的处理器市场分类中,若以功能与执行速度来说,大致分为CPU > MPU > MCU。CPU的功能最强,主要应用在计算机产品;MPU功能次之,其应用多元,主要应用在嵌入式系统与精简型计算机等多种;而MCU则是以单一应用为主,应用在各式家电、电子产品、嵌入式产品、穿戴式装置、物联网(IoT)应用产品等控制应用。

麻雀虽小 五脏俱全:MCU专用RTOS简述

麻雀虽小 五脏俱全:MCU专用RTOS简述

麻雀虽小 五脏俱全:MCU专用RTOS简述

MCU内部集成了KHz~MHz级的CPU、KB~MB级的存储器单元(RAM与ROM/EEPROM/Flash)、时脉产生器(Oscillator;Clock Generator)、与I/O扩充单元等,可视为一种速度较慢的系统单芯片(SoC)。

由于内部存储器容量小,因此大型操作系统如Windows、Linux等是不可能塞入MCU去执行的,且MCU大多被应用在实时控制的环境,因此许多容量小的RTOS(Real-Time Operating System;实时操作系统),便成为开发MCU软件的主要平台。

主打嵌入式应用的中高阶RTOS

RTOS 的种类繁多,主要设计给基于MPU或MCU的嵌入式系统所使用。例如MPU等级专用的有Integrity、QNX、VxWorks等功能强大之 RTOS;至于体积较小巧,主要支持MCU等级为主的RTOS,则有Nucleus、ThreadX、Unison OS、ucOS II/III等等。

以Green Hills Software推出的Integrity OS为例,就是一种支持MPU (甚至CPU等级)为主的RTOS。其强项在于Integrity-178版本已通过EAL 6+?(信息安全)认证与DO-178B(飞安环境) A级认证,被应用在极度重视安全和可靠性的市场,例如战斗机(如B-2、F-16、F-22、F-35)与民航机(如Airbus A380)等领域。该RTOS支持ARM、XScale、Blackfin、Freescale (已并入NXP) ColdFire、MIPS、PowerPC、AMD x86(嵌入式APU)等CPU/MPU平台。

另一个知名的QNX RTOS,采用微核心架构,是唯一成功打入商用市场的OS,其强项是多媒体的实时处理能力,适用于车(机)上娱乐装置与手机等嵌入式市场。QNX于 2010年被BlackBerry购并,并开发出BB 10操作系统。QNX支持IA32、MIPS、PowerPC、SH-4、ARM、StrongARM、XScale等CPU/MPU平台。

至于象是IntervalZero的RTX、RTX64,则是设计来与微软Windows共存共容的RTOS,搭配EtherCAT协定来做为工厂自动化的应用。其中,Windows主要负责GUI、储存、运算,RTX则负责实时工控与资料采集,让工控软件开发更容易。以上的RTOS都是MB至GB等级的 MPU等级OS,不适用于MCU的环境。

主打MCU应用的商用RTOS

中低阶 RTOS部分,主要是把软件功能极尽精简到MB甚至KB等级,使整个OS与主要应用程序,均可以塞入MCU里的ROM/EEPROM/Flash。由于 MCU应用的领域更加广泛,其软件必须力求更加精简,因此MCU专用的RTOS大多具备非常高度模块化的架构,从核心、驱动程序、档案系统、外围I/O、网络支持等,都可以量身订作,以利产品快速上市。

商用的RTOS有些会提供原始码给授权客户,而开源的RTOS则更能自由使用,让开发人员可以编译出程序码最小、最佳化的执行环境。

由于各芯片厂所推出的MCU产品/开发板,都会有其对应的OS与IDE(集成软件开发环境),但这些OS与软件开发环境可能只适用于该厂的MCU产品,因此第三方软件厂商,就开发出跨芯片/跨硬件平台的OS与IDE,让开发人员不须因为换了硬件平台,软件就必须全部改写。

目前MCU OS/IDE市场占有率最高的,大多是软件公司所推出商用RTOS(搭配各厂商的MCU产品),然随著ARM推出Cortex-M、Cortex-R等指令集架构,进军穿戴式与物联网应用市场,使得ARM架构(采开源码)的RTOS开始有提升的趋势。

Mentor Graphics旗下Accelerated Technology公司所推出的Nucleus,采Microkernel设计,号称有30亿个装置导入,优势是核心长度可以小至2KB,且开发人员不需要撰写嵌入式装置专用BSP(开发板支持软件包),因此被广泛应用到消费性电子、行动装置、车用电子、智能能源、医疗仪器、工业/工控等领域。

早期采用联发科MT6217芯片的大陆山寨、白牌、双卡2G手机,就是执行Nucleus RTOS。该RTOS支持ARM、MicroBlaze、MIPS、Nios II、Power、SuperH、XScale等嵌入式MCU架构。

Express Logic推出的ThreadX,则是一套免收权利金的RTOS,其优点是具备超快速的开机时间、反应时间,其Picokernel核心长度低于2KB,并通过安全规范,号称有21亿个装置导入使用。例如HP的旗下打印机和事务机便采用该RTOS。可广泛支持各式32位元MCU,包含ARM、Atmel、 BlackFin、CoreFire/68K、EFM32、Freescale (NXP)、FM3、H8、XMC、M-Core、MicroBlaze、MIPS、Nios II、Power、STM32、StrongARM、Synopsys ARC、TI、Win32、x86/x386、XScale等等。

Wind River公司所推出的VxWorks,主要针对嵌入式系统设计,采Monolithic (单体式)核心,优势是具备先占式多工处理核心、循环执行、岔断快速反应等特性,原生支持64位元处理器架构(x64)、可进行平行(SMP)/非平行 (AMP)处理,累积至今有超过15亿个装置导入。

新版VxWorks 7则瞄准IoT所需要的可扩充性、安全性、连结性、绘图能力、虚拟化等做强化,而全功能的VxWorks微核心长度只要20KB。

VxWorks广受科技业界的采用,登陆火星的Curiosity(好奇号)便采用VxWorks。该RTOS支持Intel x86(包含Quark SoC与x86-64)、MIPS、PowerPC、SH-4、ARM等CPU/MPU架构。

RoweBots公司的Unison OS,则是一款完全兼容于POSIX(可移植操作系统接口)的RTOS,适用于MCU、DSC、DSP、SoC、FPGA等32位元的硬件开发环境,其好处是特别针对物联网的应用,提升其系统安全性,且核心程序码在某些应用架构可以低到仅1KB。支持Microchip PIC32、Renesas R32C/SH2A、ST STM32、TI ARM Cortex-M3等32位元MCU。

Micrium的μc/OS-II (microcontroller OS version 2),主打可携、能在ROM执行、弹性、先占式多工的RTOS核心,可管理高达250个应用任务。μc/OS-III则主打无限应用任务、几近于零的岔断,并可提供原始码给客户。

其优势在于该系统原始码开放、整洁一致、注释详尽,亦通过FAA认证与DO-178B认证,适合各种嵌入式与物联网的系统开发,核心大小从5或 6KB~24KB。至于μc/OS-III HW-RTOS,则是针对ARM Cortex-M为主的MCU做硬件加速。该RTOS可支持超过100种DSP、MPU、MCU。

ARM MCU促使开源RTOS兴起

近年来由于ARM架构的处理器横扫全球智能行动装置(手机/平板)市场,除了搭配各MCU/MPU硬件平台所推出的商用RTOS/IDE之外,为进军物联网与穿戴式的MCU级应用,ARM推出Cortex-M与Cortex-R的指令集架构,搭配开源的OS/IDE来抢占MCU的应用市场。

例如ARM推出的mbed OS与相关开发环境,便着重于嵌入式装置与IoT的应用,具备连接性、高效率、安全性、生产力的OS,搭配其mbed-rtos函式库,亦可做为RTOS的应用。该mbed开发环境,可开发出智能家庭、智慧城市、穿戴式等应用产品。

此外,坊间针对ARM平台所推出的开源RTOS/IDE很多,例如FreeRTOS、uKOS-II、Atomthreads、BeRTOS社群版、 ChibiOS/RT、CoActionOS、eCos、Embox、Erika Enterprise/RT-Druid、Keil (ARM) RTX、Lepton、nOS、Nut/OS、NuttX、RIOT、RT-Thread、TI-RTOS-KERNEL(SYS/BIOS)、TNeo 等等,让开发人员有更多的选择。

其它专用MCU的非实时OS概述

此外,也有许多针对MCU设计的开源OS (非RTOS),但同样具有体积小的特性,有些是针对IoT的WSN(无线感测网络)应用,例如Contiki OS、TinyOS。而有些则具备一般桌上型图形化使用接口(GUI),例如SymbOS、Wheels OS等。

Contiki OS是一套开源的微型OS,可应用在Atmel ARM/AVR、LPC、PIC32、TI MSP430/CC2430/2538/2630/2650、STM32W等MCU做IoT应用,也可在博物馆级的8位元计算机(Apple II、Atari、Commodore等)做上网联机、甚至在骨灰级游乐器(Atari Jaguar、Game Boy/Advance、GP32、任天堂红白机、PC Engine等)上执行。

至于SymbOS,则是一套能在8位元Z80 CPU (如MSX、Amstrad)的古董计算机上执行之免费多媒体图形操作系统,赋予如Windows 95般的操作画面,让旧计算机回春。

来源:网络

围观 311

页面

订阅 RSS - 物联网