MCU

MCU是Microcontroller Unit(微控制器单元)的缩写,它是一种集成了中央处理器(CPU)、存储器(ROM、RAM)、输入/输出端口(I/O)、定时器(Timer)、串行通信接口(UART、SPI、I2C等)和其他外围设备控制器的单个芯片。MCU通常用于嵌入式系统中,用于控制各种电子设备和系统。

由于其集成度高、体积小、功耗低以及成本相对较低等特点,MCU被广泛应用于各种嵌入式系统中,例如智能家居设备、医疗设备、汽车电子系统、工业自动化等。MCU的选择通常基于应用的需求,如处理性能、功耗、外设接口等因素。

前面已经将所有的硬件驱动实现,验证了硬件功能。但是每一个硬件都是单独测试的,而且并不完善。下一步,我们需要对各个驱动进行整合完善。在整合之前,需要做一些基础工作。其中之一就是实现内存管理。什么叫内存管理呢?为什么要做内存管理?前面我们已经大概了解了程序中的变量现在我们复习一下:局部变量、全局变量。

局部变量在进入函数时从栈空间分配,退出函数前释放。全局变量则在整个程序运行其中一直使用。在程序编译时就已经分配了RAM空间。

那还有没有第三种变量呢?可以说没有。但是如果从生存周期上看,是有的:一个变量,在多个函数内使用,但是又不是整个程序运行期间都使用。或:一个变量,在一段时间内使用,不是整个程序运行生命周期都要用,但是用这个变量的函数会退出,然后重复进入(用static定义的局部变量相当于全局变量)

如果不使用动态内存管理,这样的变量就只能定义为全局变量。如果将这些变量定义为指针,当要使用时,通过内存管理分配,使用完后就释放,这就叫做动态分配。举个实际的例子:

一个设备,有三种通信方式:串口,USB,网络,在通信过程每个通信方式需要1K RAM。经过分析,3种通信方式不会同时使用。那么,如果不使用动态内存,则需要3K变量。如果使用内存管理动态分配,则只需要1K内存就可以了。(这个只是举例,如果简单的系统,确定三种方式不同时使用,可以直接复用内存)

通信方式只是举例,其实一个系统中,并不是所有设备都一直使用,如果使用动态内存管理,RAM的峰值用量将会大大减少。

内存管理方案

不发明车轮,只优化轮胎。

内存管理是编程界的一个大话题,有很多经典的方案。很多人也在尝试写新的方案。内存分配模块我们使用K&R C examples作为基础,然后进行优化。K&R是谁?就是写《C程序设计语言》的两个家伙。如果你没有这本书,真遗憾。这本书的8.7章节,<实例--存储分配程序>,介绍了一种基本的存储分配方法。代码见alloc.c,整个代码只有120行,而且结构很美。

K&R 内存管理方案分析

下面我们结合代码分析这种内存分配方案。代码在wujique\Utilities\alloc文件夹。

内存分析

● 初始化

在malloc函数中,如果是第一次调用就会初始化内存链表。代码原来是通过获取堆地址,在堆上建立内存池。我们把他改为更直观的数组定义方式。内存建立后的内存视图如下:

“”

内存分配的最小单元是:

typedef struct ALLOC_HDR
{
 struct
{
   struct ALLOC_HDR *ptr;
   unsigned int size;/*本块内存容量*/
} s;
 unsigned int align;
 unsigned int pad;
} ALLOC_HDR;

这也就是内存管理结构体。在32位ARM系统上,这个结构体是16字节。

● 第一次分配

每次分配,就是在一块可以分配的空间尾部切割一块出来,切割的大小是16字节的倍数,而且会比需要的内存多一块头。这块头在内存释放时需要使用。这一块,也就是内存管理的开销。

“”

● 分配释放后

经过多次分配释放后,内存可能如下图,绿色是两块不连续的空闲块,黄色是分配出去的块。分配出去的块,已经不在内存链表里面。

“”

缺点

一般情况上面的代码已经能满足需求。但是,有以下缺陷:

● 缺点2:内存消耗

内存分配方案使用了一个结构体,每次分配的最小单位就是这个结构体的大小16字节。

typedef struct ALLOC_HDR
{
 struct
{
   struct ALLOC_HDR *ptr;
   unsigned int size;/*本块内存容量*/
} s;
 unsigned int align;
 unsigned int pad;
} ALLOC_HDR;

一次分配,最少就是2个结构体(一个结构体用于管理分配出去的内存,其余结构体做为申请内存),也就是32字节。如果代码有大量小内存申请,例如申请100次8个字节

需求内存:100X8=800字节实际消耗内存100X32 = 3200字节利用率只有800/3200 =25%

如果内存分配只有25%的使用率,对于小内存嵌入式设备来说,是致命的方案缺陷。

如何解决呢?我们可以参考LINUX内存分配方案SLAB。在LINUX中,有很多模块需要申请固定大小的内存(例如node结构体),为了加快分配速度,系统会使用malloc先从大内存池中申请一批node结构体大小的内存,作为一个slab内存池。当需要分配node结构体时,就直接从slab内存池申请。同理,可以将内存分配优化为:需要小内存时,从大块内存池分配一块大内存,例如512,使用新算法管理,用于小内存分配。当512消耗尽,再从大内存池申请第二块512字节大内存。当小内存释放时,判断小块内存池是否为空,如为空,将小块内存池释放回大内存池。那如何管理这个小内存池呢?

● 缺点3:没有管理已分配内存

内存分配没有将已分配内存管理起来。我们可以对已分配内存进行统一管理:

1、已分配内存在头部有原来的结构体,通过ptr指针,将所有已分配内存连接在已分配链表上。

2、利用不使用的align跟pad成员,记录分配时间跟分配对象(记录哪个驱动申请的内存)

通过上面优化后,就可以统计已经分配了多少内存,还有多少空闲内存,哪个模块申请了最多内存等数据。

使用

1)将代码中的所有free改为为wjq_free,malloc改为wjq_malloc。

串口缓冲用了free跟malloc.fatfs的syscall.c 用了lwip的mem.h用了。

2)修改启动代码, 栈跟堆改小。不用库的malloc,堆可以完全不要。栈,还是要保留,但是不需要那么大,如果函数内用到比较大的局部变量,改为动态申请。

Stack_Size      EQU     0x00002000

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000010

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

3)内存池开了80K,编译不过

linking...
.\Objects\wujique.axf: Error: L6406E: No space in execution regions with .ANY selector matching dev_touchscreen.o(.bss).
.\Objects\wujique.axf: Error: L6406E: No space in execution regions with .ANY selector matching mcu_uart.o(.bss).
.\Objects\wujique.axf: Error: L6406E: No space in execution regions with .ANY selector matching etharp.o(.bss).
.\Objects\wujique.axf: Error: L6406E: No space in execution regions with .ANY selector matching mcu_can.o(.bss).
.\Objects\wujique.axf: Error: L6406E: No space in execution regions with .ANY selector matching netconf.o(.bss).
先把内存池改小,编译通过之后,分析 map文件,用了较多全局变量的统统改小或者改为动态申请。分析map文件,还可以检查还有没有使用库里面的malloc。
Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name
   124         32          0          4      40976       1658   alloc.o
    16          0          0          0          0       2474   def.o
    96         34       8640          4          0       1377   dev_dacsound.o
   300         36          0          0          0       2751   dev_esp8266.o
   204         38          0          1          0       1446   dev_key.o
   436         98          0         10         16       3648   dev_touchkey.o
   310         18          0         14       3000       3444   dev_touchscreen.o
   932         18          0          4          0      15981   dhcp.o
     0          0          0          0       3964       5933   dual_func_demo.o
   280         14         12          0        200       5963   etharp.o
     0          0          0          0          0      35864   ethernetif.o
     0          0          0          0          0       3820   inet.o
    98          0          0          0          0       2022   inet_chksum.o
     0          0          0          0          0       4163   init.o
   168          4          0         20          0       4763   ip.o
     0          0          4          0          0       6463   ip_addr.o
   386          4          0          0          0       4118   ip_frag.o
   264         38          0          8         16     383399   main.o
    84          8          0          0          0       1410   mcu_adc.o
    60         32          0          1         68       1511   mcu_can.o
    12          0          0          0          0        521   mcu_dac.o
   128         14          0          0          0       2352   mcu_i2c.o
    28          8          0          1          0        630   mcu_i2s.o
   336         92          0          0          0       2689   mcu_rtc.o
   430         86          0          1          0       4396   mcu_timer.o
  1564         82          0          0        328       9072   mcu_uart.o
   504         20          0         12          0       4510   mem.o
    56         10          0          0       9463       3250   memp.o
   120         14          0          0          0       1651   misc.o
     0          0          0          0         56       1066   netconf.o
   118          0          0          0          0       4267   netif.o
   684          0          0          0          0       6971   pbuf.o
    36          8        392          0       8192        824   startup_stm32f40_41xxx.o

alloc.o 内存池dev_touchscreen.o 触摸屏缓冲dual_func_demo.o USB,应该能优化memp.o 什么鬼?又一个内存池?应该是要优化掉startup_stm32f40_41xxx.o 启动代码,是栈跟堆用的RAM.

由于编译器的优化,项目没用到的代码没有编译进来,上面的map数据并不完整。等后面我们做完全部测试程序,所有用到的代码都会参与连接,到时还需要优化一次。

总结

内存管理暂时到此,等后面所有功能都完成后,再进行一次优化。如果对内存分配时间有更高要求,可使用伙伴内存分配法。大家可以参考《都江堰操作系统与嵌入式系统设计》,这个文档里面的一些软件设计策略非常好。http://www.djyos.com/?page_id=50

本文转载自:嵌入式IOT技术圈
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 241

一、基础知识

技术性的东西学习起来都是一层一层的,如果前面的基础知识如果没有学好,到了后面的学习会让你懵懵懂懂,最后会走很多弯路。

对外设的学习,可以从两方面来看,一个是单片机与外设的电路图连接,这是硬件方面;另一个是软件方面,如何用软件控制这个外设。例如:

“”

这是一个LED流水灯模块,你至少要从电路图上知道以下信息:

1、LED灯D1到D8分别连接到了单片机的P1.0到P1.7引脚;
2、当你把其中一个引脚置零,相应的LED灯就会亮。

这是读电路图的能力,是最基础的也是最重要的。

然后是例程,点亮一个LED灯。

#include<reg52.h>

sbit LED=P1^0;

void main (void)
{
    LED=0;
    while (1);
}

1、为什么要包含reg52.h?里面有什么内容?
2、sbit是什么意思?是标准C里的关键字还是keil C里的关键字?为什么要写这一条语句?
3、为什么最后要加while死循环?
……
初学的时候一般是不会问自己这些问题的,我自己学的时候都没有问过自己这些问题。但是这些知识点恰恰却是基础,或者说学习时的盲点。

关于基础我就不多写了,点到即止。

二、分模块

不多说了,我直接上我的学习资料的图片吧。

“”

可以说,这些都是外设。把每一个模块的电路图分析一遍,再把代码分析一遍,也够玩一段时间的了,再把代码自己写一遍,单看不写那等于没看。再自己写的过程中去体会这句话把,你会发现照着别人的程序代码写都能写错,都会写了编译过不了,各种问题,等把这些问题自己解决了,那对你的提升肯定不小。

熟悉完几个模块后,可以尝试把这几个模块组合起来,给自己一个小项目做。比如从一块时钟开始(DS1302+LCD1602)。

三、总结

把你用到的技术,对电路图的分析,对代码的分析用文字描述出来。总结不需要逐字逐字的打,可以拷贝资料里的文字以及代码等等,但一定要先理解透彻,如果没有理解透,请不要把那些文字拷贝到你的总结里,又不是为别人写什么文章,只是为自己而学。(像点亮LED这种简单的项目就不用总结了...)

如果不知道总结要写什么,可以参考大学里的单片机实验指导书或者实验报告。我一直觉得,写那些实验报告和课程设计报告真是最好的学习方法啊!可能以后出来工作再也不用写实验报告或者课程设计论文了。

我们的实验报告是这样的:

1、实验目的
2、实验内容
3、仪器、设备和材料
4、实验原理(用到了什么芯片,什么外设)
5、实验步骤
6、实验结果(代码)
7、注意事项

如果是自己写的总结,最重要的就是4,其他什么的都可以不写。把用到的芯片、外设、电路图和代码整理总结一下,对这些技术的理解就会非常深刻的。其次是注意事项,可以写一些做实验中为什么卡住的技术难题,或者很多资料都没写,自己发现的技术细节。

比如红外NEC协议:

“”

这是NEC协议的典型脉冲链,一开头有一个9ms的高电平,和4.5ms的低电平,接下来是用户码和数据码等等。但是,在红外接收头那一端,这些信号是相反的。也就是说,红外接收头输出信号的那个引脚,在没有信号的时候输出高电平,当接收到信号后会输出一个9ms的低电平和4.5ms的高电平,接下来是取反的数据码等等。

一开始学习的时候不一定会注意到这些细节,以为只要例程跑起来了,看懂了例程代码和电路图就算学会了。不是这样的!最后项目结束后一总结起来,发现了很多很多以前没有注意到的知识点。(我怎么感觉我在强调参与项目的重要性呢?)

总之一定要总结,不要偷懒。有些技术知识一总结了之后,我就会发现了好多调试程序的时候学不到的知识点。另外,不一定要做完项目后才总结,查资料的时候就可以开始总结了。再说一遍,我说的总结写起来很简单,就是把你分析过的,理解透的相关技术资料用新的word文档组织起来。

四、一通百通

我认为,只要你精通了一种单片机,再学习其他单片机是非常快的,学习外设同理,学习其他东西也是一样的。

学会了51,再到32,原理都一样,相通的。学会了LCD1602,再到LCD12864那就简单了。

五、学会移植

上面刚刚也引出了第五点,学会移植程序。51单片机真的是在行业内玩烂了的单片机,几乎每一个电类专业都会学,所以如果你想用51控制任何外设,在网上基本能找到很多资料和程序,很多程序不需要自己重头写的,这就是一个很好的机会去理解外设的工作原理和程序。当你不用51作为主控芯片的时候,或者使用了类似的外设时,直接移植之前的程序就可以了。

一些题外话:

实际上我想强调的就是以下几点:
一、基础;
二、分模块(分成小目标学习);
三、总结;
四、先精通一种;

不止这样学习单片机比较好的,学习任何东西都可以这样做的。那些看时序图、看datasheet的能力,我觉得可以在写总结的时候提高一下。会看datasheet是工程师一项基本能力,我想问,玩了51那么久了,看过51的datasheet么?没看过?可以马上去看啊!会看了51的datasheet,也就会看其他芯片的datasheet了(一通百通)。由于本人比较偏软,硬件方面我就只能稍微提及一下了。一开始的时候,最主要的是学会分析电路图。比如:

“”

这是学习板上的DS1302模块电路图。

1、从电路图中可以看出是用单片机的哪两个引脚控制该模块?
2、晶振在电路图中有什么作用?
3、电容C12有什么作用?……

分析了电路图,就会明白其中的原理,需要设计的时候就会信手拈来,或者看datasheet来设计电路图时,就会知道为什么要这样设计。这里我只强调一个词:原理。至于什么画电路图的,画PCB的我就不提了。

版权声明:本文为CSDN博主「weixin_39710594」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/weixin_39710594/article/details/111327163

围观 28

在21世纪信息化时代背景下,互联网科技的高速发展推动着应用产品的更新换代,MCU行业在此时代背景下被应用于各个领域并且快速发展。因此MCU行业在未来仍然具有巨大的成长和发展空间,通过不断地推陈出新满足不同的市场需求,紧跟时代步伐。此外,MCU行业的产品需求结构随着下游应用领域和需求的不同发生转变,在未来32位MCU芯片将成MCU行业主流产品。

中国科技高速发展,助推MCU中国市场蓬勃发展

据IHS数据统计,近五年中国MCU市场年平均复合增长率(CAGR)为7.2%,是同期全球MCU市场增长率的4倍,2019年中国MCU市场规模达到256亿元。由于中国物联网和新能源汽车行业的增长速度领先全球,在此带动下游应用产品对MCU产品需求保持旺盛,中国MCU市场增长速度继续领先全球。经初步测算,2020年中国MCU市场规模超过268亿元,并且与上年相比增长5%。

“”

产品竞争激烈,应用市场需求决定产品市场结构

从市场份额角度分析,8位MCU和32位MCU占据中国MCU市场的主要市场份额,2019年根据CISA公布的信息显示,8位MCU行和32位MCU芯片分别占据国内市场的40%和45%。但随着科技的发展和生产工艺的进步,32位MCU市场份额逐渐开始扩大并挤压其他MCU产品市场份额,其在国内市场份额占比从2012年的36%增长到2019年的45%。

因此结合以往几年的数据进行分析,8位MCU虽仍在国内MCU市场占据主导地位,但在MCU市场份额中的占有率呈逐渐下滑趋势,并且未来MCU行业市场份额主导地位将由32位MCU代替。

“”

五大领域拉动MCU需求增长

在中国,MCU产品主要被应用于五大领域分别是消费电子、计算机与网络、汽车电子、工业控制和IC卡。其中,汽车电子和工业控制成为相对其他应用领域增长较快的MCU应用市场。工业控制MCU应用的市场份额为9.6%;汽车电子MCU应用的市场份额为15.2%;IC卡MCU应用市场份额为15.2%;消费电子和计算机与网络领域的市场份额分别为26.2%和19.3%。预计至2023年工业/医疗电子的市场份额将赶上消费电子,市场份额将达到92亿元人民币。

“”

中国MCU市场愈加激烈,海外大厂占据过半

2019年受益于汽车电子行业以及物联网的快速发展,中国MCU行业迎来了黄金发展机遇期,因此中国MCU市场中各大MCU厂商均出现不同幅度的增长。但根据2019年中国MCU企业市场份额情况可知,国外MCU厂商已占据大部分中国MCU市场。

2019年,瑞萨电子凭借着在市场上的影响力以及积极的营销策略,在市场表现出积极的发展态势。2019年瑞萨电子MCU市场销售份额为17.10%,稳居中国MCU市场销售额的首位。飞思卡尔则以14.50%的市场份额位列第二,意法半导体则上升较快,以8.5%的市场份额位列第三。

“”

后疫情经济推动,MCU市场规模持续增长

未来5年,在疫情结束后,全球经济形势将逐步好转,但中国经济将率先复苏并持续增强,在物联网、新兴医疗电子、新能源等应用领域快速发展、中国电子整机生产整体持续较快发展等有利因素的影响下,中国MCU市场将继续保持较好的增长态势,市场规模将持续保持增长扩大。前瞻预计,2021-2026年,我国MCU市场规模将保持8%的速度增长,至2026年,我国MCU市场规模将达到513亿元。

“”

更多本行业研究分析详见前瞻产业研究院《中国MCU行业市场前瞻与投资战略规划分析报告》,同时前瞻产业研究院提供产业大数据、产业规划、产业申报、产业园区规划、产业招商引资、IPO募投可研等解决方案。

本文来源前瞻产业研究院,转载请注明来源。
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 284

3月18日,在上海举行的“2021中国IC领袖峰会暨中国IC设计成就奖”颁奖典礼上,灵动股份一举摘得“中国IC设计成就奖之年度最佳MCU”殊荣。

“
2021中国IC设计成就奖颁奖典礼

“灵动荣获“中国IC设计成就奖之年度最佳MCU”"
灵动荣获“中国IC设计成就奖之年度最佳MCU”

“中国IC设计成就奖”由电子行业极具影响力的《电子工程专辑》、《电子技术设计》和《国际电子商情》联合发起,是中国电子和半导体业界最重要也是最受关注的技术奖项之一,“中国IC设计成就奖”举办19年来,通过对逾百万电子行业专业人士社群的持续调查,伴随和见证了中国IC产业的成长与发展。本届“中国IC设计成就奖”基于2020年10月至2021年3月的数据,经电子工程师、资深分析师和半导体业内人士公平、公正的投票评选产生,共颁发四大类别多个奖项,表彰引领技术创新、推动行业发展的企业、团队、管理者和产品,代表着行业的极高水准。

““中国IC设计成就奖之年度最佳MCU”奖杯”
“中国IC设计成就奖之年度最佳MCU”奖杯

在本次中国IC设计公司奖项获奖名单中,除了IC传统应用领域外,灵动股份电机与电源MM32SPIN0280系列产品获选“2021中国IC设计成就奖之年度最佳MCU”,成为了本次大会的新焦点。

“灵动MM32SPIN0280系列MCU”
灵动MM32SPIN0280系列MCU

灵动股份全新MM32SPIN0280系列MCU产品是专门针对电机与电源领域所设计的基于Arm Cortex-M0的高性能微控制器,内核主频96MHz,PWM主频192MHz。QFN20以及TSSOP20极小封装可以实现三相永磁无刷电机(BLDC/PMSM)的FOC驱动;LQFP64的多管脚封装可以实现双电机驱动,内置了两个独立的3MSPS的12位高速高精度ADC,以及四路轨对轨高速运算放大器(OPA),可以极少的外围器件实现三相永磁无刷电机(BLDC/PMSM) FOC驱动算法中的双电阻采样或者单电阻采样的超静音高效方案,特别适用于家用空调室外机、吸尘器、高速吹风筒、伺服驱动器、无人搬运车、净化器风机、洗衣机、电动车以及其他高效率电机驱动设备。

产品特色

• 工作电压范围2~5.5V
• 128K字节FLASH,8K字节SRAM
• 芯片工作温度范围-40°C~105°C
• 2组独立3MSPS的12位ADC,16通道
• 5组具有滤波功能的比较器,11通道
• 3组UART,2组多地址设计的I2C,SPI
• 2组带有死区功能的高级定时器,支持双电机驱动
MM32SPIN0280系列MCU,同时设计了硬件数学计算单元,以及高主频PWM设计,尤其在三合一空调(压缩机、PFC以及风机)的设计,双轮平衡车、无人自走车这类产品方案,原本需要至少2个MCU以及OPA等外围器件的设计,现大幅度降低了外围器件数量,生产一致性也大幅度提高。销售量自量产后,成长迅速,累积超过千万的出货成绩足以证明其产品优势与特色。

如今,在全球新冠疫情的背景下,国产MCU行业的发展也面临着诸多挑战。灵动股份此时摘得“中国IC设计成就奖之年度最佳MCU”大奖,无疑是对其近年来稳扎稳打取得优异成绩的充分肯定,同时也彰显了在面临挑战与机遇时的从容不迫,为国产MCU发展及实现新跨越增添活力。

围观 51

AI:Artificial Intelligence,即人工智能。

AI与我们息息相关,手机导航、语音控制、智慧工厂、物流等这些都会运用AI相关技术。

近两年世界各大知名MCU厂商也都在陆续推出自家功能更强并支持AI功能的MCU和MPU芯片,ARM新推出的内核Cortex-M55具有更强的运算能力,目前很多高性能MCU都基于该内核。

1、AI普及

随着人工智能的普及,很多使用MCU开发的产品也走向了AI的世界。AI设计主要参与方都是功能强大的CPU,GPU和FPGA等。MCU与强大的人工智能(AI)有什么关系?

随着AI从云到边缘的发展,使得这一观点正在迅速改变,AI计算引擎使MCU能够突破嵌入式应用可能的极限,嵌入式设计已经能够提高网络攻击的实时响应能力和设备安全性。

云计算推动了对具有AI功能的MCU的需求;它减少了数据传输所需的带宽,并节省了云服务器的处理能力,如下图:

“”

配备AI算法的MCU正在应用包含对象识别,启用语音服务和自然语言处理等功能的应用程序。它们还有助于提高物联网(IoT),可穿戴设备和医疗应用中电池供电设备的准确性和数据隐私性。

那么,MCU如何在边缘和节点设计中实现AI功能?下面简要介绍了三种基本方法,这些方法使MCU能够在IoT网络边缘执行AI加速。

2、MCU + AI场合

第一种方法(可能是最常见的方法)涉及各种神经网络(NN)框架(例如Caffe 2,TensorFlow Lite和Arm NN)的模型转换,用于在MCU上部署云训练的模型和推理引擎。有一些软件工具可以从云中获取经过预训练的神经网络,并通过将其转换为C代码来针对MCU进行优化。

在MCU上运行的优化代码可以在语音,视觉和异常检测应用程序中执行AI功能。工程师可以将这些工具集下载到MCU配置中,并运行优化神经网络的推论。这些AI工具集还提供了基于神经网络的AI应用程序的代码示例。

AI执行模型转换工具可以在低成本和低功耗MCU上运行优化神经网络的推论,如下图所示:

“”

第二种方法是绕过了对从云借用的预训练神经网络模型的需求,设计人员可以将AI库集成到微控制器中,并将本地AI培训和分析功能纳入其代码中。

随后,开发人员可以基于从边缘的传感器,麦克风和其他嵌入式设备获取的信号来创建数据模型,并运行诸如预测性维护和模式识别之类的应用程序。

第三,AI专用协处理器的可用性使MCU供应商能够加快机器学习功能的部署。诸如Arm Cortex-M33之类的协处理器利用了诸如CMSIS-DSP之类的流行API来简化代码的可移植性,从而使MCU与协处理器紧密耦合,可加快AI功能,如协处理相关和矩阵运算。

同时,新推出的Cortex-M55具有更强的AI处理能力。

上述软件和硬件平台演示了如何通过根据嵌入式设计要求开发的推理引擎在低成本MCU中实现AI功能。这很关键,因为支持AI的MCU很有可能在IoT、工业、智能建筑和医疗应用中改变嵌入式设备的设计。

本文转载自:strongerHuang
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 69
526095766_642的头像
526095766_642

FPGA已经变得如此具有成本效益,因此它们越来越多地与mcu结合使用,以提高整体系统效率。用途包括在的电路板空间中添加额外的功能,为复杂算法的前端添加节能处理,聚合多个外部设备以卸载高性能MCU或作为使现有设计适应新的所需的“粘合”逻辑在接口要求方面,FPGA提供了标准MCU中常常缺乏的额外灵活性。本文将快速回顾一些的应用,其中FPGA和MCU“配对”,以展示如何通过降低功耗,减小电路板空间,提高处理性能或接口灵活性来提高系统效率,从而显着改善您的下一个设计。

FPGA作为MCU配套器件

您为设计选择的MCU多久没有完全具备您需要的所有接口通道?或许您对MCU的初始选择非常合适,但是出现了新的要求,因为您的客户需要为其设计添加一些额外的接口。您可能可以使用更复杂的MCU,但这可能会增加显着的电路板空间(因为它仅在高引脚数封装中可用),功率增加(因为它只能提供比您真正需要的更多闪存和SRAM) 或者更高的成本(出于上述两个原因)。

解决这个难题的一种方法是通过在MCU旁边添加FPGA来规划对额外接口的需求。FPGA可以轻松提供额外的接口,只需提供您需要的接口,同时限制电路板空间,成本和功耗的增加。实际上与使用更复杂的MCU的选项相比,通常会减少电路板空间,降低成本并降低功耗。

例如超低功耗FPGA可在极小的2.078 mm×2.078 mm电路板占板面积内提供多达26个信号IO,并且由于这些器件是通过片上NVM配置的,您不需要额外的电路板空间用于配置设备。这些FPGA还有两个专用的I2C接口和两个专用SPI接口,具有大量可配置逻辑,可以根据应用需要添加更多接口(直到用完引脚)。

该器件还具有高达80kbits的嵌入式Block RAM,可用于接口FIFO和缓冲器,因此MCU可以等待整个数据包准备好进行处理。在将数据发送到MCU之前,DSP模块还可用于对原始传感器数据进行低级数据处理,作为预处理步骤。当FPGA可以在中断MCU之前智能地聚合数据时,可以大幅降低MCU功耗。

快速响应FPGA接口请求

使用FPGA配套器件时,快速响应FPGA的服务请求非常重要。例如音频接口可能需要具有比传感器数据更高的优先级访问权,因为必须避免音频数据中的“停顿”或者用户体验可能显着降低。通常能够支持各种中断优先级有助于提高FPGA伙伴的实用性,并进一步提高整体系统性能和功效。

有效使用DMA还有助于进一步卸载MCU并提高效率。例如FPGA可能首先缓冲预处理原始数据的完整数据包,以减小需要存储和传输的消息的大小。FPGA可以中断MCU并启动DMA传输,将整个消息移动到MCU存储器中。一旦DMA传输完成并且整个消息准备好进行处理,就可以中断CPU并开始对消息进行处理。

例如32位MCU有一个DMA控制器和一个中断控制器,两者都是可编程优先级。中断控制器在右侧有一个优先级块,它为CPU产生中断级。优先级块选择具有优先级的中断,由与每个中断源相关的中断优先级寄存器(IPRn)中的中断级别字段定义。因此可以在I2C端口上为较高优先级的源(例如实时音频接口)分配比低频传感器更高的优先级,以保证更快的处理。

本文转载自:宇芯电子
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 30

自从上世纪七十年代 MCU 诞生以来,芯片的破解技术与防止芯片被破解方案就在不断在上演着“道高一尺,魔高一丈”,一山更比一山高的追逐。本文将单片机在安全保护方面的发展历程与大家分享。并在文章的最后,总结了现阶段安全级别最高的智能卡芯片的优点及其缺点。

一、单板机时代

上世纪 70 年代初期,嵌入式系统是由分离部件如:CPU、ROM、RAM、I/O 缓存、串口和其他通信与控制接口组成的控制板。这一时期除法律外,几乎没有保护措施来防止侵入者复制单板机上 ROM 区的数据。

二、单片机时代

随着大规模集成电路技术的发展,中央处理单元(CPU)、数据存储器(RAM)、程序存储器(ROM)及其他 I/O 通信口都集成在一块单片机芯片上了,微控制器 MCU 取代了单板机。如图:

“”

这一时期,内部存储器 EEPROM 和 MCU 是分开封在同一封装内部。侵入者可用微探针来获取数据。

三、安全熔断丝(Security Fuse)

随着入侵者的增加,MCU 为了自身的安全,后来增加了安全熔断丝(Security Fuse)来禁止访问数据。如图:

“”

优点:很容易做到,不需要完全重新设计 MCU 构架,仅用熔断丝来控制数据的访问。

缺点:熔断丝容易被定位、攻击。例如:熔丝的状态可以通过直接把位输出连到电源或地线上来进行修改。有些仅用激光或聚焦离子束来切断熔丝的感应电路就可以了。用非侵入式攻击也一样成功,因为一个分离的熔丝版图异于正常存储阵列,可以用组合外部信号来使位处与不能被正确读出的状态,那样就可以访问存在内部芯片上信息了。用半侵入式攻击可以使破解者快速取得成功,但需要打开芯片的封装来接近晶粒。一个众所周知方法就是用紫外线擦掉安全熔断丝。

四、安全熔丝变成存储器阵列的一部分

再后来 MCU 制造商将安全熔丝做成存储器阵列的一部分,如图:

“”

一般的熔丝与主存储器离得很近,或干脆共享些控制线,与主存储器用相同的工艺来制造,熔断丝很难被定位。非入侵试攻击仍然可以用,可以用组合外部信号来使熔断位处于不被正确读出的状态。同样,半侵入式攻击也可用。当然破解者需要更多的时间去寻找安全熔丝或控制电路负责安全监视的部分,但这些可以自动完成。进行侵入式攻击将是很困难需要手工操作,那将花费更多的成本来破解。

五、用主存储器的一部分来控制外部对数据访问

利用上电时锁定特定区域地址的信息,将它作为安全熔丝。或用密码来控制对存储器访问。例如德州仪器的 MSP430F112 只有输入正确的 32 字节密码后才能进行回读操作。如果没输入,只有擦字节密码后才能进行回读操作。尽管这个保护方法看上去比先前的更有效,但它有一些缺点可以用低成本的非侵入式攻击,如时序分析和功耗来破解。如果安全熔丝状态是上电或复位后存储器的一部分,这就给破解者用电源噪声来破解的机会,强制路进入存储中错误状态。

六、使用顶层金属网络

使用顶层金属网络设计,提升入侵难度。所有的网格都用来监控短路和开路,一旦触发,会导致存储器复位或清零。如图:

“”

普通的 MCU 不会使用这种保护方法,因为设计较难,且在异常运行条件下也会触发,如:高强度电磁场噪声,低温或高温,异常的时钟信号或供电不良。故有些普通的 MCU 使用更廉价的伪顶层金属网格,会被非常高效的光学分析进行微探测而被攻击。另外,这些网格不能防范非侵入式攻击。同样不能有效防范半侵入式攻击,因为导线之间有电容,并且光线可以通过导线抵达电路的有效区域。在智能卡中,电源和地之间也铺了一些这样的网格线。部分可编程的智能卡走的更远,干脆砍掉了标准的编程接口,甚至干掉了读取EEPROM 接口,取而代之的是启动模块,可以在代码装入后擦掉或者屏蔽自己,之后只能响应使用者的嵌入软件所支持的功能。有效的防范了非侵入式攻击。

七、智能卡芯片安全设计

近些年,一些智能卡使用存储器总线加密(Bus Encryption)技术来防止探测攻击。如图:

“”

数据以密文方式存储在存储器中。即使入侵者获得数据总线的数据,也不可能知道密钥或者别的敏感信息(如数据还原方法)。这种保护措施有效的防范了侵入式和半侵入式攻击。有些智能卡甚至能够做到每张卡片总线加密密钥不同,这样即使入侵者完全破解了,也无法生产出相同功能的芯片来,因为每个智能卡芯片有唯一的 ID 号,无法买到相同 ID 号的智能卡。另外值得一提的是,有些智能卡将标准的模块结构如解码器,寄存器文件,ALU 和 I/O 电路用类似 ASIC 逻辑来设计。这些设计成为混合逻辑(Gle Logic)设计。混合逻辑使得实际上不可能通过手工寻找信号或节点来获得卡的信息进行物理攻击。大大提高了 CPU 内核的性能和安全性。混合逻辑设计几乎不可能知道总线的物理位置,有效的防范了反向工程和微探测攻击。

智能卡芯片加密方案优缺点

对于开发者来讲,选择更为安全设计的微控制器或可以得到更好的保护。与大多数微控制器相比,即使是十年前设计的智能卡也能提供更好的保护。现代的智能卡提供了更多的防攻击保护,内部电压传感器保护免受电源噪声攻击(Power Glitch attacks)、过压和欠压保护。时钟频率传感器防止受到静态分析(Static analysis)的降低时钟频率攻击。同时也可以防止时钟噪声(Clock glitch attacks)进行提高时钟频率的攻击。顶层金属网格和内部总线硬件加密使可以防止微探测攻击。但是与微控制器相比,智能卡芯片也有劣势,如:芯片价格昂贵,小批量的很难买到货。开发工具昂贵,需要和制造商签署保密协议,即使是说明书也要这样。很多制造商仅向特定客户销售大批量的智能卡。另一个不足是 I/O 的功能受限,普通智能卡芯片通常只有ISO7816 接口,极少有单独的 I/O 口。这使得多数应用中不能取代微控制器,而只能用于安全要求非常高的行业,如:付费机顶盒,银行卡,SIM 卡,二代身份证,高端加密芯片等领域。智能卡芯片在加密芯片领域的应用,将是个不错的方向。因为智能卡芯片安全等级高,IO 资源少。而普通 MCU 的硬件资源非常丰富,安全程度却不高,可以将 MCU 中一些关键算法及运行参数,以特殊形式存放在智能卡芯片中,从而实现高安全强度的强大功能。

后记

坚持不懈的尝试突破保护机制的破解团体和不断引入新的安全防范方案的制造商之间的斗争是没有尽头的。“道高一尺,魔高一丈”,又或是“邪不压正”,将不停的在两派之间上演!

来源:IoVSecurity(作者: 武者)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 81

今天分享的文章,主要给那些没有软件设计思想的MCU软件工程师看的!

随着目前MCU的各方面性能显著提升,一些以MCU为控制中心的嵌入式系统也是越来越复杂,毫无软件设计理念的代码真的是拖累单片机,所以对每个MCU软件工程师在软件设计等方面的要求也将越来越高!

这里利用一个实际发生的例子,对入行的初级软件工程师提一些软件设计上的建议,并分享了一些经常走的弯路,希望可以帮到大家。

这篇文章我没有谈编程的规范性的东西,如果你想让自己的程序文件代码更加直观、看起来美观、可读性强,推荐学习一下全面的编程规范,比如网络上广为流传的,华为“C语言编程规范”。本文主要想说一说当我们的单片机遇到多个模块的数据需要处理,类似于“多任务”时应该怎么去思考和处理?

背景是这样的,9月份开始安排一个工程师开始做电动汽车交流充电桩,机械设计部分由公司机械结构部门负责。充电桩的电子部分总体上分为X个部分(用到的资源): 电阻触摸屏(RS232),M1卡读写(RS232),电能计量表(RS485),语音提示(SPI),电力开关(继电器IO),通讯接口(RS485、CAN)。

工程师做的过程非常勤奋,期间也是困难重重,改了很多个版本,很多的bug,总算第二年6月把充电桩立起来了。

当然此过程我并没有过多的干涉,系统也没有经过非常严格的测试,结果发现读卡的时候不能处理触摸屏,播放语音的时候不能处理读卡,语音播放不能打断或者跳跃,反正就是所有事件必须一个一个按部就班的来,一旦操作错误就需要多次执行、等待、甚至重新来过。

一个工作3年多的工程师怎么会把产品做成这样呢?思来想去不应该呀,是不是程序哪里出了问题 ? 解决问题的最好办法就是评审代码,来review代码瞧瞧。

不看不知道,一看吓一跳!整个的程序是没有逻辑的,一条线就往下写,这不正是当年在学校刚做第一个项目的代码吗 ?

//主循环
while(1)
{
  //上电进入主程序 或 触发触摸屏
  Function1();//播放提示语音
  Delay();//等待播放完毕

  //读取M1卡信息
  Function2();
  Delay();//等待读卡数据返回

  //播放提示语音
 Function3();
  Delay();//等待播放完毕

  //M1卡数据交互,判定下一步操作及提示
 Function4();
  Delay();//等待数据处理完毕

  ……
  ……
}

从代码上可以看出这个工程师基本上对于自己设计的产品没有任何软件上的设计可言,也很少去吸收一些优秀的代码和思想,对自己开发的程序在产品上的具体表现也不敏感,更被说对RTOS的学习和理解了。

他犯了几个我们在程序开发过程中几个忌讳的问题:

1、delay(死等)这类函数应该只在实验室验证某个功能过程中用到,或许是在一些初始化时序使用到,而不会用来控制整个的程序运行架构,在实际的产品开发时无论是主循环while中,还是其调用的函数中,亦或是中断服务程序中几乎是不可能看到的。

2、产品设计的各个相对比较独立的子模块之间的逻辑关系太强,例如:必须等待播音完毕才能读卡进入下一步操作等。

我们讲,产品设计中只有各个事件处理模块间的逻辑关系弱化,才能更加灵活的进行处理。例如:两个事件A和B,如果程序开发时将A做成B事件的必要条件,B事件的触发就必须等待A事件的发生。反之如果A事件作为B事件处理的一个特殊情况,也就是说我不执行A也有可能执行B,那么程序开发起来就变得灵活很多。

3、没有考虑到单片机本身是一个单核单任务的架构,每一个事件都会独占CPU内核,当多个任务模块同时存在时我们应该对各个事件进行区分,我们应当分情况、分事件实时性要求等区分对待。

那么针对于这样的问题,或者是遇到类似的项目我们应该如何处理呢?

这里提一下我的建议和想法,首先他这里是裸机开发,所以就不谈RTOS方面的设计建议了,仅仅只是针对前后台架构。

1、将硬件系统区分为独立单元单独做成底层驱动函数和应用函数,并且函数正常应该有参数和返回值,其中返回值是必要的。如何衡量这类函数呢?这类函数可移植性强,只要一个.h文件和一个或多个.c文件就可以随意放到任何工程中,一句话吧,模块化!例如:语音播放、M1读卡、485处理等等。

2、将1中的所有函数进行时间评估,评估点有两个。一个是函数的执行时间t,第二个是函数的周期性发生的时间T,一个最基本的条件是t < T,理想情况应该是t << T。

3、建立一个集中逻辑处理函数,也就是核心任务调度处理函数,在这个函数中对1中的各个函数进行调度。这个函数发挥的作用相当于嵌入式系统中的系统调度。

这种调度是整个硬件逻辑中所有事件处理的调度,它的目的是完成一个处理过程,但是绝不依赖于任意事件的必要处理过程。这样就将问题2中提到的事件间的逻辑关系弱化了,处理起来变得十分灵活,使得各个关系不在相互必要。bug菌记得有一本书籍叫<时间触发型调度系统>,大伙可以看看,大体思想与这里的观点差不多!

4、为了保证前面内容的正常实施还需要针对各类事件的周期,建立一个必要的时间管理函数,时间函数的基础一般情况下由一个内部定时器的中断来完成,中断的周期一般我们考虑5-10ms。按照实际需求将N个定时器中断定义为一个事件处理的周期TT,这个周期应该保证处理完最恶劣情况可能发生的所有t,且保证TT < T。

5、这其中也有例外,一些实时性要求高的事件应当用中断完成。其中中断处理函数的处理事件应尽量短,时间要求参见2。bug菌觉得,不管你所做的项目有没有用到RTOS,平时都需要玩玩RTOS,对该观点的理解会有帮助。

本文转载自:最后一个bug
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 113

页面

订阅 RSS - MCU