基本核心概念:
理论上说,有多少外围设备或控制电路,就需要CPU有相应多的引脚来控制(输出协议约定的固定格式的高低电平),例如最简单的GPIO控制上下电。
总线:但是不可能有这么多引脚来与每个外设直接连接交互,可以少数几个引脚连一个外设,然后像网络通信那样,通过协议来与特定的设备交互。例如USB总线(4根线),SPI/SSI总线,I2C控制总线多用于传输控制信号例如上电,I2S总线用于音频设备传输音频数据。这种情况下需要规范好标准的协议例如I2C协议CPU和外设都遵守,不然无法通用了。
驱动:支持这些协议的外部设备,内部实现好了这些协议的硬件和逻辑程序作为server,我们使用时只要根据外围设备的使用说明(也就是外设的datasheet,注意不是CPU的datasheet)实现协议的client端即可,CPU端的具体代码样子就是通过控制状态寄存器/数据寄存器和中断来发送和接收,这个就是所谓的驱动。在linux中设备驱动提供给上层App的接口,一般就是简单的文件读写接口。App使用open/read/write去访问外设,驱动就会去转换成对应的总线协议命令和数据发送到外设上。例如,通过USB总线连接到NAD,其中控制命令通过USB的CDC-ACM协议来交互,于是在Linux上,驱动加载上之后就会出现一个/dev/ttyUSB2的设备,我们可以像文件访问那样来open/read/write这个/dev/ttyUSB2,就是在与NAD进行交互了。一般而言,驱动都是外设供应商(例如LG/ALPS)提供好的,并不需要我们自己从头编写,我们要做的就是集成到我们的平台,或者做极少量的定制化修改。参考LG的NAD的驱动集成过程。
驱动最底层的实现:(这一块我还比较模糊)基本方式都是用中断和寄存器,外设有请求就写一个寄存器然后触发一个中断,处理器中断处理从寄存器读数据判断寄存器状态来做相应操作
片选/复用:即使有了总线,因为引脚数仍然有限,还会多个外设挂在同一个总线上,用寄存器来控制当下哪个外设连接到总线。片选信号:ChipSelect,在SoC封装里也是多个芯片(包括各种外设的接口芯片)也都连接到同一内部总线上,协同工作时用片选信号相当于最简单的通信协议,片选信号选中的芯片才工作,其他的不工作。每个接口都有一个片选开关,高电平关闭时芯片相当于跟总线断开。片选信号一般是根据地址空间的划分由逻辑电路产生。例如CPU、ROM、FLASH、DRAM、UART都连在总线上,0x0~0x10000000是DRAM的地址,那么访问此地址就会通过逻辑电路激活DRAM让其使能总线连接,让CPU此时通过总线读/写的就是DRAM而不是FLASH也不是UART。
ARM系列芯片架构:Cortex系列属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。(2011年,ARMv8 架构在 TechCon 上推出,ARMv8是64位指令集)ARMv7架构定义了三大分工明确的系列:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用,如Cortex-A7;“R”系列针对实时系统;“M”系列对微控制器,如Cortex-M3。Cortex-R 系列处理器提供的性能比 Cortex-M 系列提供的性能高得多。例外:只有Cortex-M0、Cortex-M1为ARMv6架构。
SoC:System on Chip,指一个片子集成了CPU、RAM、Cache、Flash等所有功能。NoC:Network on Chip,指片上多核间通信的方式。
编程理念相关:
设计理念:实时系统的设计,和Linux这样的分时系统设计理念不一样,Linux上的东西都是动态的,动态申请内存,动态绑定Socket发送数据。而实时系统没有动态的观念,绝大部分都是静态的也就是代码写死的,例如发送什么数据什么频率发送。尽量精简。
内存申请:实时系统一般也是静态规划好的。
电源电压转换:
统称:Power Regulator
低电流:LDO,
高电流:DC-DC。例如Dialog公司的DA9061,DA9063电源适配器,一个小片子
处理器相关:
嵌入式处理器(Processer)的各种分支:MCU(microcontrollerunit)微控制器单元,MPU(microprocessoruint)微处理器单元。MCU集成了片上外围器件,而MPU不带外围器件(例如存储器阵列),是高度集成的通用结构的处理器,是去除了集成外设的MCU。还有DSP就不说了。
多核处理器的三种架构:SMP、NUMA、MPP
SMP:Symmetric Multi-Processor对称多处理器。多个CPU是对等的共享所有资源。其问题是扩展能力有限,随着CPU数增多资源冲突(主要是内存)迅速增加导致CPU的浪费,CPU有效性能大大降低。目前SMP中2个到4个CPU的利用率最好
NUMA(Non-Uniform Memory Access):非一致存储访问。专门解决SMP的扩展能力问题的。每个CPU模块包含多个CPU有自己独立内存,当需要访问其他CPU模块的内存资源时多个CPU模块间通过通信访问。
MPP(Massive Parallel Processing):海量并行处理。多个SMP服务器通过一定的节点互联网络进行连接,协同工作,完成相同的任务。我感觉这个玩意儿就是云计算。
CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的软件抽象层。 使用CMSIS,可以为处理器和外设实现一致且简单的软件接口。例如STM32和CSR-M3提供相同的库函数,让ARM开发者对不同厂家的芯片用同样的代码就可以操作。有了这个规范的库函数,对一个新芯片只需花1个多星期就可以上手了。它其实就是让芯片厂商自己实现了标准驱动程序来方便开发者。现在的芯片厂商基本都提供驱动程序,只是有的可能不是遵循CMSIS规范的。
CPLD和FPGA:可编程硬件。注意FPGA价格很贵,几百上千,所以不会用它做批量投产产品,如果大量投产,都会用ASIC(专用芯片)来实现。最大的两项用途:1 对于一些小企业,没有实力批量生产一种特殊的芯片,或者变种太多,每一版本的售量又不够大,就可以用 FPGA 来“烧制”他的“芯片”。2 对于芯片前端设计,FPGA 验证是非常重要的。它可以用 FPGA 模拟他设计中的芯片,测试其功能正确性。
存储相关:
Flash:ROM的一种。快擦型ROM存储器,这类即Flash。Flash和磁盘的区别是,Flash是用电结的方式存储数据,磁盘是用磁的方式存储。
NAND:一种块存储器,Flash的一种。优点是价格低容量大,缺点是1.只能块(如64KB)操作无法直接小单位(如32bit)操作,2.存储稳定性不高,容易产生坏块,寿命大约为可读写10万次。主要用于手机的大量存储,几个G的那种。
NOR:也是Flash的一种,跟NAND相反,优点是读取速度快(但写入速度比NAND慢),可直接操作小单位,存储稳定性高寿命长,缺点是价格高容量小。一般都只有几百K。主要用作存放BootLoader(类似于PC中的BIOS),主要是在单片机上电后,执行将Nand Flash中的程序(或系统)拷贝到RAM中,然后将CPU控制权交给RAM中的程序。我们做过的嵌入式系统中也经常把重要的不可丢失的配置数据存放到NOR中。操作系统是存储在Nand中,但之所以不能直接在Nand中运行程序,是因为Nand为块存储,无法按字节读取。NOR作为ROM的一种,替代了早期的EEPROM。
EMMC:主控+NAND Flash,一种嵌入式存储器解决方案,用一个小型BGA来封装NAND、MMC多媒体卡接口和存储主控制器。一般是包成一颗MCP。其作用是提供通用标准的存储设备接口,用来屏蔽各厂商各型号NAND Flash芯片的使用差异,使得手机客户只需要采购eMMC芯片,放进新手机中,不需要因为用了新存储器而重新设计。EMMC产品内部的控制器实现了Flash管理技术,包括错误探测和纠正,Flash平均擦写,坏块管理,掉电保护等技术,使用者不用再写软件管理,直接使用MMC接口使用即可。
EMCP:主控+NAND Flash+LPDDR,LPDDR就是LowPowerDDR,DRAM的一种,手机运行内存就是用它。EMCP就是把运行内存和存储器集成到一起了。
MCP:一个封装外壳内,垂直堆叠大小不同的各类存储器或非存储器芯片,用此方法节约小巧印刷电路板PCB空间。例如把SRAM、NAND、NAND控制芯片堆叠封装成一个小片。
BGA:引脚在片子的底部,小球样子,而不是侧边。
LGA:栅格阵列封装。主要在于它用金属触点式封装取代了以往的针状插脚,需要底板上有突起触点来接触并且有压片把CPU压在底板上
DRAM和SRAM(动态RAM和静态RAM):DRAM便宜,多用作PC内存。SRAM贵,高速低功耗,多用作cache。
SPRAM:Scratch Pad RAM。应该是跟CPU集成到一起的一小片RAM
MMU:Memory Management Unit存储器管理单元,实现了寻址、错误探测纠正、坏块管理等
SPI Flash: 外置flash按接口分有总线flash,SPI flash。总线flash需要你的MCU上有外部总线接口,SPI flash就是通过SPI口对flash进行读写。速度上,总线flash比SPI的快,但是SPI的便宜
Boot和下载升级 相关:
XIP:eXecute In Place。指程序直接在Flash(NOR flash)中执行,不必把代码读到系统RAM中。好处是可以减少加载时间。
一个board完整的boot过程:
1.ROM:上电后rom代码开始运行,初始化必要硬件后拷贝uBoot(到RAM),跳转到uBoot执行
2.内存uBoot:初始化RAM等硬件,准备好kernel需要的环境。拷贝内核到RAM,跳转到内核起始处执行。
3.Kernel:解压zImage压缩包,加载驱动,初始化各种外设,mount rootfs,执行init进程(/sbin/init)
4.Rootfs:systemd(或其它初始化程序如sysvinit)来启动各个进程
FOTA:线上升级系统,现有供应商: redbend
总线相关:
UART:早期最典型的协议。例如CPU和NAD之间,CPU和BT芯片之间,很多都是通过UART通信的。但UART速度有点慢,适合传输控制信号和少量数据。大量数据还是USB最吊。
串口:串口是指硬件设备而非协议。UART/COM/USB是几种协议,UART是4个引脚一般在板子上用,COM是9个引脚一般在PC上用,USB就更通用了板子PC均可。TTL、RS-232是不同的电平标准。TTL标准是低电平为0,高电平为1(+5V电平)。RS-232标准是正电平为0,负电平为1(±15V电平)。电脑上那个串口都是RS-232的,板子上都是TTL的。所以需要转换,一般用芯片MAX3232。或者用USB转TTL串口,一般用芯片PL2303HX或者CP2102。参考:http://wenku.baidu.com/link?url=voPV0eLfF_G0OUByAbqt6M8qOyDg9nllJtfkrKQRtXM6epgF1Nw1cPO9tHxBdRDDiEOkh9Qmgaed5k5JFr8oUZeQvm-iog0MnXaQEhr7n-m
各种通用总线:
I2S:(Inter—IC Sound)总线, 又称 集成电路内置音频总线,用于板内各音频设备间传递音频数据
I2C:(Inter-Integrated Circuit),用于连接微控制器及其外围设备,主要是节省引脚
QSPI:Queued SPI,一种增强的SPI,增加了队列传输机制极大提高传输效率,以80字节的RAM代替了SPI的发送和接收数据寄存器
ICode总线:CortexM3内核内总线,该总线将内核的指令总线与Flash(Nor Flash)指令接口相连接。指令预取在此总线上完成。
DCode总线:CortexM3内核内总线,该总线将内核的DCode总线与Flash(Nor Flash)数据接口相连接(常量加载和调试访问)。
USB总线:目前最吊的。新设备几乎都支持它,例如NAD。
RF模块:Radio Frequency,射频收发模块,RF表示可以辐射到空间的电磁频率,频率范围从300KHz~300GHz之间
BLE:蓝牙低功耗,Bluetooth Low Energy,广泛应用于穿戴式设备。比较典型的控制芯片是Dialog公司的DA14580。
CCU:Connectivity Control Unit
显示相关:
LCDC:LCD Controller显示控制器。主要负责从内存中或者FIFO通道中获取图像/视频数据,以一定的方式叠加、混合,将最终的图像送出到外部液晶显示器去显示,并具有0、1、2层的FIFO输入接口及一个外部FIFO输出接口。也即是有多个FrameBuffer,最终LCDC中的硬件会对这多个FrameBuffer进行混合。
LCD控制器同LCD驱动器是有着本质区别的。简单来说LCD控制器在嵌入式系统中的功能如同显卡在计算机中所起到的作用。LCD控制器负责把显存中的LCD图形数据进行混合、缩放等,传输到LCD驱动器(LCD driver)上,并用LCD控制信号控制LCD驱动器,LCD驱动器则只负责把收到的图像数据在LCD显示出来,不会对图像做任何的处理。
LVDS:Low Voltage Differential Signaling,一种板内数据传输接口,用于LCD驱动器把图像数据传输到显示器。与HDMI区别:HDMI是外部设备连接电视机(电路板)较多的;LVDS主要是电路板与液晶屏之间连接的,一般是一个排线。
HDCP(High-bandwidth Digital Content Protection):保证HDMI或者DVI传输的高清晰信号不会被非法录制
CVBS:老式的那种电视上3个头子的视频传入接口。跟HDMI一样是外部视频传输接口,但比较老
导航相关:
GNSS:Global Navigation Satellite System,全球卫星导航系统,是GPS,北斗,Galileo等的泛指。
可靠性保证:
硬件上:1.低制程,2.高规格(铜的换成金的),3.严格测试(车规测试)
软件上:1.高可靠platform,2.严格单元测试(googleTest),代码规范(如中断触发定时不能用),代码静态检查,code review等。
生产线:1.硬件上预留硬件测点,生产线上自动化检测硬件(电阻、电容、屏幕等)、诊断程序自动化检测底层软件(CAN总线联通)、上层功能(通过设备检测声音等)。博世的生产线可以做到100万台3台的故障率,比一般生产线100台1台的故障率低很多,所以生产线返修率和客户返修率低导致成本低、质量高。
产后:各元器件的寿命和环境参数要求,极端环境测试测试承受力,老化测试测试寿命。还有极端环境整体实地测试来测试整体的承受力和寿命。
其实本质上就是2条:1.开发人员素质,2.花时间做各种质量保证。
冗余设计:最原始的博世是用两片单片机一起工作,一块坏了另一块能探测到,但成本太高。后来是多个ECU之间相互监控,例如ABS和ESP相互监控(可以用心跳包),任何一个坏了另外一个会探测到并提示告警。
输入输出:
对芯片的操作,本质上就是“寄存器+中断”两个操作。例如GPIO,软件就是读写它的寄存器,同时可以使能GPIO上升沿中断让其产生中断,再写中断处理函数
读取一个特定功能的pin脚,不能直接读取,需要把接到一个GPIO上,读取这个GPIO来获取pin脚的电平。因为对于特定功能的pin脚(例如EXT_ON),它是没有直接读取的方法的。