嵌入式

首先我们来看一下嵌入式WiFi的来源以及与普通WiFi的区别。

我们都知道笔记本、手机、平板电脑等这类产品具有强大的CPU和大容量的存储器进行网络通信数据的处理和存储,因此在使用WiFi时不需要额外的MCU,完全借助其高速处理器和庞大的软件系统。但是对于家电、仪表、LED灯等智能家居产品,因为该类产品的主控芯片可能是成本很低、功能简单的MCU,因此这类产品无法支持普通Wi-Fi的功能。同时,还有一个重要的原因就是普通Wi-F的功耗比较高,而嵌入式WIFI在功耗上做了很大的改善,比较适合对功耗要求高的无线家电设备。

基于上述原因,各个无线厂商相继推出了嵌入式WiFi模块。嵌入式WiFi模块的特点是软硬件集成度高,整个嵌入式WiFi模块集成了射频收发器、MAC、WIFI驱动、所有WIFI协议、无线安全协议、一键连接等。总之,一句话:嵌入式WiFi应物联网而生!

下面我们针对嵌入式WiFi与普通WiFi来进行对比,通过下表的对比,我们大致上可以理解到什么是嵌入式WiFi。

嵌入式WiFi与普通WiFi有什么不同?

在分析WiFi驱动前,分享一下本人对Linux驱动的一些了解,其实纵观Linux众多的设备驱动,几乎都是以总线为载体,所有的数据传输都是基于总线形式的,即使设备没有所谓的总线接口,但是Linux还是会给它添加一条虚拟总线,如platform总线等;介于WIFI的驱动实在是太庞大了,同时又是基于比较复杂的USB总线,所以建议大家先了解一下USB设备驱动和网络设备驱动。

我们要看懂WiFi驱动,首先要明白WiFi的工作原理。从对于支持802.11n、802.11ac这些比较无线标准的WiFi芯片,其驱动程序也会越来越复杂。那么我们怎么入手去了解及分析它呢?

网上很多人分析Linux设备驱动都是从模块加载入手去分析它的驱动源码。以本人从事Linux设备驱动多年的经验,这确实是一条很直观又非常好的思路。但是这只局限于设备功能少、接口较简单、驱动源码较少的设备驱动。对于功能复杂、驱动源码庞大的设备驱动,根据这条思路,很多开发者可能会无耐心走下去,或者会走向死胡同。

现在我们可以这样来看,从硬件层面上看,WIFI设备与CPU通信是通过USB接口的,与其他WiFi设备之间的通信是通过无线射频(RF)。从软件层面上看,Linux操作系统要管理WiFi设备,那么就要将WiFi设备挂载到USB总线上,通过USB子系统实现管理。而同时为了对接网络,又将WiFi设备封装成一个网络设备。

我们以USB接口的WIFI模块进行分析:

(1)从USB总线的角度去看,它是USB设备;
(2)从Linux设备的分类上看,它又是网络设备;
(3)从WIFI本身的角度去看,它又有自己独特的功能及属性,因此它又是一个私有的设备。

通过上述的分析,我们只要抓住这三条线索深入去分析它的驱动源码,整个WIFI驱动框架就会浮现在你眼前。

1、现在我们先从USB设备开始,要写一个USB设备驱动,那么大致步骤如下:

(1)需要针对该设备定义一个USB驱动,对应到代码中即定义一个usb_driver结构体变量。代码如下:
struct usb_driver xxx_usb_wifi_driver;

(2)填充该设备的usb_driver结构体成员变量。代码如下:
static struct usb_driver xxx_usb_wifi_driver = {
.name = "XXX_USB_WIFI",
.probe= xxx_probe,
.disconnect= xxx_disconnect,
.suspend= xxx_suspend,
.resume= xxx_resume,
.id_table= xxx_table,
};

(3)将该驱动注册到USB子系统。代码如下:
usb_register(&xxx_usb_wifi_driver);

以上步骤只是一个大致的USB驱动框架流程,而最大和最复杂的工作是填充usb_driver结构体成员变量。以上步骤的主要工作是将USB接口的WIFI设备挂载到USB总线上,以便Linux系统在USB总线上就能够找到该设备。

2、接下来是网络设备的线索,网络设备驱动大致步骤如下:

(1)定义一个net_device结构体变量ndev。代码如下:
struct net_device *ndev;

(2)初始化ndev变量并分配内存。代码如下:
ndev=alloc_etherdev();

(3)填充ndev -> netdev_ops结构体成员变量。代码如下:
static const struct net_device_ops xxx_netdev_ops= {
.ndo_init= xxx_ndev_init,
.ndo_uninit= xxx _ndev_uninit,
.ndo_open= netdev_open,
.ndo_stop= netdev_close,
.ndo_start_xmit= xxx_xmit_entry,
.ndo_set_mac_address= xxx_net_set_mac_address,
.ndo_get_stats= xxx_net_get_stats,
.ndo_do_ioctl= xxx_ioctl,
};

(4)填充ndev->wireless_handlers结构体成员变量,该变量是无线扩展功能。代码如下:
ndev->wireless_handlers = (struct iw_handler_def *)&xxx_handlers_def;

(5)将ndev设备注册到网络子系统。代码如下:
register_netdev(ndev);

3、WiFi设备本身私有的功能及属性,如自身的配置及初始化、建立与用户空间的交互接口、自身功能的实现等。

(1)自身的配置及初始化。代码如下:
xxx_read_chip_info();
xxx_chip_configure();
xxx_hal_init();

(2)主要是在proc和sys文件系统上建立与用户空间的交互接口。代码如下:
xxx_drv_proc_init();
xxx_ndev_notifier_register();

(3)自身功能的实现,在前面已经讲解过WiFi的网络及接入原理,如扫描等。同时由于WiFi在移动设备中,相对功耗比较大,因此,对于功耗、电源管理也会在驱动中体现。

转自: 嵌入式资讯精选

围观 641

在单片机编程的过程中,如果一名设计者能够同时掌握多门编程语言,那么这名设计者肯定是一位非常优秀的人才。但是想要同时精通汇编、C语言、C++这三门语言实在是太难了,很多初学者在其中一门的学习中就已经到处碰壁,苦不堪言。本文特意为大家整理了拥有嵌入式编程领域多年工作经验的工程师意见,汇总成了一篇能够对嵌入式编程经验有着指导意义的注意事项,感兴趣的朋友快来看一看吧。

在单片机嵌入式编程中,最难的两部分是interrupt和MM(memory manage),之所以有人觉得并不困难,那是因为太多数情况下芯片制造商都已经直接写好,但是如果设计者本身就在为芯片制造商工作,那就必须自己会写配置文件。

这两个东西之所以比较难是因为要用汇编或类C来写,属于比较低层的东西,中断有外部中断和内部中断,外部中断有两种实现模式,硬件中断模式和软件中断模式,相对来说比较简单,属于应用层面的,相比之下,内部中断就要复杂得多,内部中断主要是发生重起,总线出错、溢出、校验出错等情况产生的,很多软件开发人员基本上不写对应的中断服务程序,因为它太难了而且一般也用不到。但是一旦发生,那就是致命错误,因此从整个系统健壮性来考虑必须要有相应的ISR才行,这也是freescale的专家建议的,因所以下面就谈一下嵌入式编程应该注意的问题。

延时

嵌入式编程经常会涉及到硬件的操作,如ADC,打开或者关闭一个电流源,这些都是需要时间的,因此当在发出这些指令的时候立即读取寄存器的值是得不到想要的结果的,而且还找不出原因,有时候需要的延时还比较长,达到ms级,一般情况下us级就够了,根据各芯片的时钟频率而定,不单指MCU的总线时钟频率。

变量

一般来说如果非常明确某个变量的作用域和生命周期就应该定义相对的变量,如const、static等,这样不容易出错,不建议将所有变量都定义成全局变量,这样管理起来比较麻烦,程序一旦出错,破坏性也比较大,函数也是如此,全局变量和通用函数一定要申明,这样在调用的时候不容易出错,而且有些编译器对于未申明的函数是不会报错的,但在调用的时候又会发出类型隐含转换的警告,在这里就不举例子了,总之这点要特别小心。

宏定义

在程序编写过程对于一些特定的数字应该尽量使用宏定义,这样做有个好处就是比较直观,便于日后维护,要不然时间久了看到那个数字根本就想不起它代表什么意思,宏定义并不会给程序带来任何负担,因为它在编译的时候就已经全部替代了,所以尽可以广而用之。值得一提的是宏定义并不局限于使用常量,它可以定义函数,因为它是直接替换,因此避免了入栈和出栈,提高了程序执行的效率,但是同时增加了代码量,因此一般用比较简单的函数,它还有一个缺点是在替换的过程不检查参数类型是否正常,从而增加了安全隐患,解决此问题的方法是使用一个称之为inline的内联函数,它继承了宏定义的优点,又弥补了它的缺点,是个最佳的选择,但是这个属于C++的范畴,有一定的难度,在这里也不多讲,有兴趣的朋友可以参考一下相关资料。

浮点运算

大多数低档次的单片机都是不支持浮点运算的,因此在实际使用过程中也很少用到,因此为了降低成本,一般都去掉了浮点运算模块,这就带来了一个问题,如果万一要用到浮点运算怎么办?细心的朋友可能会发现,即使不具有浮点运算的单片机在仿真调试过程依然可以使用float or double的数据类型进行计算,而且结果也很准确,这是为什么呢?这个因为编译器自动调用了库函数来实现的,一般是通过迭代的方法,因此它的执行效率非常慢,不建议采用此方法,而通常采用的是“定点”的方法来解决这个问题,比如说一个32bit的数据,可以假定它的低8位是小数位,然后移位计算,类似于整数运算,这种方法比较复杂,但是可以非常精确,还有一种方法就是直接放大10的N次方倍进行整数的计算,可以得出近似值,因此为了不增加不必要的麻烦,应该总是尽量避免使用浮点运算,一般情况也都是可以避免的。

watch dog

以三重watch dog为例,watch dog1检查时钟频率,watch dog2监视一小段代码,它必须在一个比较短的时间里喂一次,一般要求在250us到650us之间喂一次,watch dog3监视一大段代码,要求在比较长的时间内喂一次,一般是100ms以内,三个条件必须同时满足才行,这要求对代码的执行过程非常清楚,或者将导致喂狗出错重起。

这里需要向大家强调的是,在单片机嵌入式的编程过程中程序的好坏往往是由细节决定的,一个程序写的是否详细、灵活,是与日积月累的知识积累与实际磨练成正比的。虽然编程是意见非常枯燥甚至乏味的过程,但成功后的喜悦能够让大家相信这份付出是值得的。

来源:互联网

围观 353

作者:胡恩伟

嵌入式MCU与MPU的区分

嵌入式系统中的处理器按照是否集成片上Flash和RAM可以分为MCU(MicroControl Unit—微控制器)和MPU(MicroProcess Unit—微处理器)。典型的MCU如Freescale S08、S12和MPC56xx以及8051单片机等,而典型的MPU如基于ARMCortex A系列内核的i.MX系列处理器:

本文中的观点针对仅针对嵌入式MCU,也就是我们常说的单片机。其为单芯片集成解决方案—片上集成了嵌入式系统工作所需的逻辑计算内核CPU,存储数据/代码的RAM,EEPROM和Flash,内部互联总线—Crossbar、AMBA(APB、AHB以及AXIbus),定时器资源(Timer)、中断控制器(INTC,通用输入输出接口(GPIO),模拟数字转换模块—ADC、DAC和ACMP,段码LCD控制器、TFTLCD控制器,步进电机驱动(SMC),通信接口/控制器—I2C、SPI、UART/SCI、CAN、SDIO/eMMC、以太网MAC等;当然,MPU中也会集成很多嵌入式系统工作所需的大部分片上外设,但因为其计算单元CPU内核运行速度非常快,所以其一般不会再片内集成系统工作所需的RAM和Flash存储器,而是集成SDR/DDR2/3/4等外部SRAM扩展接口和NAND/NOR Flash扩展接口,用户设计基于MPU的硬件系统时还需选择合适的SRAM和外部Flash才可以保证系统正常工作。

当然还有我们常说的CPU(CentralProcess Unit—中央处理器),常见PC上所使用的Intel的x86处理器,比如奔腾、至强、酷睿i3/i5/i7系列等,其片上只集成了中央计算内核单元CPU,少量的一级/二级/三级缓存以及GPU,但不包含中断控制器、定时器等,它需要通过主板进行扩展,更不包含存储器,需要用户在主板上外界DDR内存条和Flash硬盘。

浅谈嵌入式MCU开发中的三个常见误区

按照内核的运行速度和片上集成外设资源的丰富程度以及功耗,MCU、MPU和CPU的对比分布如下:
浅谈嵌入式MCU开发中的三个常见误区

误区一:MCU的程序都是存储在片上Flash上,然后拷贝到RAM中执行的

很多刚接触MCU的人受学校老师讲授计算机硬件和C语言课程时一些观点的影响,认为MCU中程序都是存储在片上Flash上,然后拷贝到RAM中执行的,这其实是错误。原因如下:

1. MCU的片上RAM资源和Flash存储器相比一般都比较小,其比例大概为1:16到1:5,其不可能将存储在Flash中的程序代码全部拷贝到片上RAM中;
以下为Freescale S12G系列、S12XE系列以及MPC574xB/C/D/G系列MCU的片上RAM和Flash存储器资源的对比:

浅谈嵌入式MCU开发中的三个常见误区
浅谈嵌入式MCU开发中的三个常见误区

2. 在嵌入式MCU中内核CPU的工作频率一般为总线频率的两倍(S08和S12(X)系列MCU的内核CPU工作频率固定为总线工作频率的2倍)或者相等(PowerPC MPC560x系列),而挂到Flash的指令/数据总线宽度一般与CPU位宽的1~2倍,虽然Flash的访问频率比较低(几MHz到数十MHz,一般不超过100MHz),而嵌入式MCU内核CPU的运行频率也不高,在300MHz以内,所以总线每次可以从Flash取出2~4条指令(PS:当PowerPC e200内核使用VLE指令集时,大多数指令都为16位长度,若指令/数据总线宽度为64位宽,则一次可以读出4条VLE指令),从而弥补与内核CPU运行速度的差距,保证在硬件物理上实现在Flash取值执行嵌入式MCU程序是没有问题的。

以下为NXP MPC5744P的内部Cross Bar总线互联框图,其指令和数据总线均为64位宽:

浅谈嵌入式MCU开发中的三个常见误区

3. 在嵌入式MCU的硬件设计上没有自动将Flash程序提前拷贝到RAM的机制,在软件设计上也没有相应的代码执行这个拷贝工作--这样的拷贝过程无疑会造成内核CPU资源的浪费,代码搬移的过程总内核CPU无法处理其他任务;(除非是在开发嵌入式MCU的BootLoader时,需要对片上Flash进行擦除和编程,而大多数嵌入式MCU片上都只有一个Flash块(block/partion), 不支持read-while-read操作,所以需要将Flash驱动程序事先拷贝到RAM然后调用—事实上,只需要将Flash擦除和编程命令的launch语句和查询等待命令完成的程序拷贝到RAM执行即可。程序的执行至少包含取指à译码à执行三个环节,其中取指就是从存储器中读出指令,需要访问Flash/RAM)

4. 通过调试嵌入式MCU,在CPU寄存器窗口查看程序运行时PC寄存器的值也可以验证嵌入式MCU程序默认运行时就是在Flash本地执行的、即存储地址与运行时地址相同;

浅谈嵌入式MCU开发中的三个常见误区

由于S12XE系列MCU的Flash分页访问机制,地址0xFE8029其实是其Flash的Page_FE的逻辑地址,对应的Flash物理地址(也称作全局地址--GlobalAddress)为0x7F8029;
浅谈嵌入式MCU开发中的三个常见误区

误区二:工程编译生成的下载文件大小即为最终占用Flash的大小

很多工程师判断一个嵌入式MCU应用工程的编译结果大小往往看工程编译生成的HEX/S19/BIN等下载文件(Flash编程文件)的大小,认为工程编译生成的下载文件大小即为最终占用Flash的大小,这是不正确的。

因为在HEX/S19/BIN等Flash编程文件往往还包含了编译器版本信息,工程配置信息,每行数据/代码的存储地址,长度、校验和以及整个工程的复位运行地址等非常丰富的信息。因为只有具备了这些信息,编程器才找到将编译结果中的数据和代码烧写到Flash/EEPROM存储器的具体地址并保证数据/代码的完整性,通过每一行和整个文件的校验(Verify)来保证整个编程过程的正确完整。

以下以Motorola的S19文件(也称为S-Record)格式进行说明:
S-record每行最大是78个字节,156个字符
S-record 格式如下:

浅谈嵌入式MCU开发中的三个常见误区

其中:

type(类型):2个字符。用来描述记录的类型 (S0,S1,S2,S3,S5,S7,S8,S9)。

count(计数):2个字符。 用来组成和说明了一个16进制的值,显示了在记录中剩余成对字符的计数。

address(地址):4或6或8个字节。用来组成和说明了一个16进制的值,显示了数据应该装载的地址, 这部分的长度取决于载入地址的字节数。2个字节的地址占用4个字符,3个字节的地址占用6个字符,4个字节的地址占用8个字符。

data(数据):0—64字符。用来组成和说明一个代表了内存载入数据或者描述信息的16进制的值。
checksum(校验和):2个字符。这些字符当被配对并换算成16进制数据的时候形成了一个最低有效字符节,该字符节用来表达作为补充数据,地址和数据库的字符对所代表的(字节的)补码的byte总和。即计数值、地址场和数据场的若干字符以两个字符为一对,将它们相加求和,和的溢出部分不计,只保留最低两位字符NN,checksum=0xFF-0xNN。

S0 Record:记录类型是“S0” (0x5330)。地址场没有被用,用零置位(0x0000)。数据场中的信息被划分为以下四个子域:

name(名称):20个字符,用来编码单元名称
ver(版本):2个字符,用来编码版本号
rev(修订版本):2个字符,用来编码修订版本号
description(描述):0-36个字符,用来编码文本注释

此行表示程序的开始,不需烧入memory。

S1 Record:记录类型是“S1” (0x5331)。地址场由2个字节地址来说明。数据场由可载入的数据组成。
S2 Record:记录类型是“S2” (0x5332)。地址场由3个字节地址来说明。数据场由可载入的数据组成。
S3 Record:记录类型是“S3” (0x5333)。地址场由4个字节地址来说明。数据场由可载入的数据组成。
S5 Record:记录类型是“S5” (0x5335)。地址场由2字节的值说明,包含了先前传输的S1、S2、S3记录的计数。没有数据场。
S7 Record:记录类型是“S7” (0x5337)。地址场由4字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
S8 Record:记录类型是“S8” (0x5338)。地址场由3字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
S9 Record:记录类型是“S9” (0x5339)。地址场由2字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。

一个具体的S12XEP100的CodeWarrior5.2工程编译后S19文件的大小为6KB,而实际占用Flash的大小只有2445个字节,远小于S19文件的大小,所以判断一个应用工程编译结果所占Flash和RAM的大小,应该看MAP文件中的统计结果,而非S19文件的大小:

浅谈嵌入式MCU开发中的三个常见误区

或者以IDE(比如CodeWarrior 10.6或者S32DS)的Print Size工具从控制台(console)打印出来的text + data来判断,下面是一个具体的MPC5748G S32DSfor Power V1.2工程,其编译及我国所占Flash的大小为23366(text) + 1372(data)=24738 Byte,而其S19文件大小为73KB。
浅谈嵌入式MCU开发中的三个常见误区

误区三:用户应用工程的编译结果建议不能超过MCU片上Flash的80%

通过对以上误区一的分析,嵌入式MCU中用户应用工程的编译结果(数据和程序代码)是一直存储在片上Flash中的,对其下载编程之后在整个产品的生命周期中都不会再改变(除非用户开发了在线/远程升级的BootLoader功能),因此,完全可以将将Flash全部用来保存编译结果,只要在工程链接文件中按照MCU实际存储器大小和地址进行配置,编译链接结果没有存储器溢出即可。用户应用工程的编译结果建议不能超过MCU片上Flash的80%的说法没有任何理论依据。

转自: 汽车电子expert成长之路

围观 581

随着Internet与网络的迅速发展并向家庭领域不断扩展,使消费电子、计算机、通信(3C)一体化趋势日趋明显,嵌入式系统再度成为研究与应用的热点。嵌入式实时Linux操作系统以价格低廉、功能强大又易于移植而正在被广泛采用,成为新兴的力量,如今随着WAP手机、PDA、机顶盒、及DVD/VCD播放机已经迅速普及,用户对这些手持式设备的GUI提出了更高的要求,希望能看到像PC机才拥有的华丽美观的GUI。GUI已经成为了人与机器沟通的桥梁,嵌入式系统对GUI的需求越来越高,而这一切均要求有一个轻型、占用资源少、高性能、高可靠、可配置及美观的GUI支持。

1 Java的图形界面工具

Java技术对于服务器,个人电脑和嵌入式系统来说是一项伟大的技术。由于其具有跨平台等特性。Java在服务器和桌面电脑方面的应用是非常成功的。然而在GUI方面,Java只用非常有限的一些特征去构建图形用户界面。其思想就是采用平台无关的Java应用程序接口打包到不同的操作系统来开发本地图形用户界面,被称之为抽象的窗口工具(AWT)。仅有普通的部件如文件域、文本区、选择框、单选按钮、列表框和按钮被AWT支持,图形和图像的特性支持非常有限,也就是说,只足够构建简单的applet程序。认识到需要更高级的图形用户界面组件和图形能力,Sun公司开发了Swing,Java 2D,Java3D,图像的输入/输出,以及Java高级图像(JAI)。Swing是用来构建Java图形界面的标准API(应用程序接口),一些AWT类由Swing基础而来。它有一套完全的组件从按钮到文件域、表格、树型和文件编辑器。这些组件不依赖于操作系统本地的部件,而是用原始的图形像直线、矩形、文字画出。这种画代表感观插件,它能够模仿本地的感观。SWT是基于Java开发的,它的设计理念是最大化了操作系统的图形构件的API,就是说只要操作系统提供了相应图形的构件,那么SWT只是简单应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。另外SWT还提供对操作系统本地图形用户界面的直接访问,因此,基于SWT的Java应用程序拥有本地的图形用户界面并且可以和本地别的应用程序和部件集成在一起。使用SWT开发包,简单、跨平台、可靠等这些Jaya语言本身所具有的优点正渐渐融合到图形界面的应用程序开发中去。Java语言的另一扇成功之门正在逐渐打开。

几种常用的嵌入式Linux GUI及其特点

2 SWT+GtkFB图形系统的体系结构

2.1 SWT+GtkFB图形系统的体系结构

2.1.1 SWT

SWT处于体系机构的最上层,它与Java内的AwT和Swing同属于设计图形界面所需的高级函数库。而且SWT针对AWT 以及Swing的一些问题作了改善,如今它已发展成一套与作业系统无关的图形元件函数库。在元件的产生方面采用了适当的模拟,在基本的元件方面是采用原有作业系统的,对于较复杂的元件才用仿真的技术。基于SWT的Java应用程序拥有本地的图形用户界面,并且可以和本地别的应用程序,以及部件集成在一起。

SWT是基于Java语言开发出来的高级图形元件库,如图2所示SWT在Java端通过JNI(Java Native InteRFace)技术直接调用native端的GtkFB来使用操作系统的资源,JNI技术使得SWT程序可以与其他语言编写的Native端的代码互相协作,将它们整合在一起;另一方面可使运行在JVM(JAava虚拟机)中的SWT代码调用GtkFB库函数或其他程序;此外利用InvocatiON API,可将Java虚拟机嵌入到native端的应用中。JNI这个接口是双向的,相当于桥梁和纽带,它将SWT代码和native端的GtkFB代码连接起来。

几种常用的嵌入式Linux GUI及其特点

2.1.2 Gtk库

如图1所示,GTK会用到几个连接库,如基本数据类型用的Glib库,它是由基础类、核心应用支持类、实用功能类、数据类和对象系统类五个部分组成的。

Pango是用于国际化文本的布局和显示的全功能框架。Pango可以处理以非从左到右方向排列的文本,并且可以容易地管理复杂语言,甚至还可以处理根据使用环境而采用不同形式的信函。例如它支持双向文本,用户可以将从左到右的文本和从右到左的文本混合编排;还可有用于确定各种复杂文本(如阿拉伯语和泰米尔语)形状的插件。Pango不仅仅是国际化,而且Pango库在Xft和XRender的支持下能很好地处理抗锯齿字体文本的显示。

Pango还支持各种图形格式如libpng,libjpeg,libtiff和Framebuffer port用的FreeType等。实际上GTK提供gdk-pixbuf,gdk和gtk三个连接库,其中Gdk-pixbuf让我们可做相关的图像工作,gdk是窗口绘图系统的抽象层,framebuffer相关的工作大部分在此完成,而gtk则是高层的应用程序接口。

几种常用的嵌入式Linux GUI及其特点

Atk(Accessibility Toolkit)可访问性工具箱。GTK充分利用ATK使残障人士(如视力低下或行动不便)与GTK应用程序交互成为可能。

2.1.3 GtkFB的工作原理

DirectFB访问图形硬件设备依赖于操作系统提供的内核接口,即帧缓冲设备(FrameBuffer)。FrameBuffer实际上是用一块硬件来做显卡和软件之间的桥梁,Linux的内核将其开放出来,使用户的程序可以通过块内存来存取显卡。例如设定显示分辨率和色彩数、存取显示内存区等。不同的Linux需要提供针对不同显示硬件FrameBuffer的驱动程序,这就是说DirectFB需要运行于FramBuffer之上,然而Linux内核提供了常见芯片的FrameBuffer驱动。

当一个应用程序连接到GtkFB时会调用gtk_init(),如图3所示,此时GtkFB 启动Linux的Framebiffer,设定分辨率和色彩数,接下来打开键盘和鼠标等外设(PDA打开按键和触控屏幕).然后到特定目录去读取字型,最后对窗口和事件管理作初始化操作。GtkFB可以支持8、16、24、32bpp的framebuffer。

为了执行一个特定的图形操作,DirectFB芯片驱动程序将访问图形设备内存映射的I/O端口,并且把命令传递到图形设备卡的加速引擎。实际的硬件加速是完全在用户空间内完成的。

2.2 SWT+GtkFB图形系统的优点

2.2.1 内存消耗小、运行速度快特别适合嵌入式产品

由于GtkFB直接运行在FrameBufer之上,跳过X系统,这样省下了X Server这一部分资源,这使得在内存消耗、运行速度上得到显著提高。另外采用的JNI技术使得程序运行速度、事件的响应有较高的提高,能满足时间要求较为严格的实时应用场合。

2.2.2 系统稳定性好

SWT 的稳定性,关键是源于SWT 的设计理念。SWT最大化了操作系统的图形构件API,就是说只要操作系统提供了相应图形的构件,那么SWT只是应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。可以看出SWT性能上的稳定很大程度上取决于相应操作系统图形构件的稳定性。

2.2.3 易于移植和共享

SWT的API和桌面版完全相同,因而代码可以很容易地在桌面和嵌入式设备之间移植与共享。

2.2.4 小巧可配置

SWT采用了LGPL授权方式,用户可以自由地甚至是鼓励修改源代码使其更加满足用户的需求,很容易根据用户的需求来裁减特定的SWT+GtkFB,依据LGPL许可证,用户需要公布修改的源代码,但用户不必公布自给应用程序的源代码。

2.2.5 易于开发

SWT是基于Java语言开发的,具有平台独立性、面向对象、可移植、安全等Java语言所拥有特点。用户可以很容易的基于SWT提供的Widget(构件)开发出满足自己需要的Widget,而且很容易地使用这些Widget去构建应用程序。

3 SWT+GtkFB图形系统的实现

3.1 前期准备

在Linux编译和安装SWT+GtkFB,首先到http://www.gtk.org/download下载如下的包:pkg-config、glib2.x;atk、pango、DirectFB、gtk+2.x。其次到http://www.eclipse.org/download下载swt.tgr.gz。

下一步就是在/home/XXX/目录下创建SWT 和GTK两个目录并且设置环境变量。如下:

export SWT_HOME=/home/XXX/SWTexport SWT_HOME=/home/XXX/GTKexport PKG_CONFIG_PATH=$GTK_HOME /lib/pkgconfigexport LD_LIBRARY_PATH=$GTK_HOME/lib;$LD_LIBRARY_PATH此外增加“/home/XXX/GTK/bin”到系统的环境变量PATH下。

3.2 编译和安装Gtk+2.0

3.2.1 编译和安装pkg-config

  tar zxvf glib-2.0.6.tar.gz -C $GTK_HOME/src
  cd $GTK HOME/src/glib-2.0.6
  。/configure --prefix=$GTK_HOME
  make
  make inSTall
  3.2.2 编译和安装atk
  tar zxvf atk-1.0.1.tar.gz -C $GTK_HOME/src
  cd $GTK_HOME/src/atk-1.0.1
  。/configure --prefix=$GTK_HOME
  make
  make install

3.2.3 编译和安装pango、Direct FB、gtk+2.0 、swt-forgtk2.2

步骤类似atk的安装。

4 嵌入式Linux GUI的应用前景展望

嵌入式Linux GUI的应用领域很多,既可以用于家电市场,还可以用于商业市场、工业及自动化市场、国防市场、通讯市场等。例如,在通讯市场,手机、可视电话、机顶盒等可能成为嵌入式Linu.x的运行平台,一个人性化的用户界面是赢得消费者关键因素。因此嵌入式Linux图形系统将担任着更加重要的角色。

未来几年,嵌入式Linux GUI将朝以下方向发展:第一,轻型、占用资源少,不希望建立在庞大累赘的、非常消耗系统资源的操作系统和GUI之上。第二,高性能、高可靠性,特别是工业实时控制系统,对实时性的要求非常高,并且比起嵌入式系统来说,对GUI的要求也更高。第三,可配置,我们必须清楚的意识到,嵌入式系统是一种定制设备,它们对GUI的需求各不相同,有的系统只要求一些图形功能,而有些系统要求完备的GUI支持,因此,GUI也必须是可定制的。

转自: eepw.com

围观 298

1. Flash 存储器

(1)Flash 存储器是一种非易失性存储器,根据结构的不同可以将其分为 NOR Flash 和 NAND Flash 两种。

(2) Flash 存储器的特点:

A、 区块结构:在物理上分成若干个区块,区块之间相互独立。

B、 先擦后写:Flash 的写操作只能将数据位从1写成0,不能从0写成1,所以在对存储器进行写入之前必须先执行擦除操作,将预写入的数据位初始化为1。擦除操作的最小单位是一个区块,而不是单个字节。

C、 操作指令:执行写操作,它必须输入一串特殊指令(NOR Flash)或者完成一段时序(NAND Flash )才能将数据写入。

D、 位反转:由于 Flash 的固有特性,在读写过程中偶尔会产生一位或几位的数据错误。位反转无法避免,只能通过其他手段对结果进行事后处理。

E、 坏块:区块一旦损坏,将无法进行修复。对已损坏的区块操作其结果不可预测。

(3) NOR Flash 的特点:

应用程序可以直接在闪存内运行,不需要再把代码读到系统 RAM 中运行。NOR Flash 的传输效率很高,在1MB~4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。

(4) NAND Flash 的特点

能够提高极高的密度单元,可以达到高存储密度,并且写入和擦除的速度也很快,这也是为何所有的 U盘都使用 NAND Flash 作为存储介质的原因。应用 NAND Flash 的困难在于闪存需要特殊的系统接口。

(5)NOR Flash 与 NAND Flash 的 区别:

A、NOR Flash 的读速度比 NAND Flash 稍快一些。

B、NAND Flash 的擦除和写入速度比 NOR Flash 快很多

C、NAND Flash 的随机读取能力差,适合大量数据的连续读取。

D、NOR Flash 带有 SRAM 接口,有足够的地址引进来寻址,可以很容易地存取其内部的每一个字节。NAND Flash 的地址、数据和命令共用8位总线(有写公司的产品使用16位),每次读写都要使用复杂的 I/O 接口串行地存取数据。

E、NOR Flash 的容量一般较小,通常在1MB~8MB 之间;NAND Flash 只用在8MB 以上的产品中 。因此,NOR Flash 只要应用在代码存储介质中,NAND Flash 适用于资料存储。

F、NAND Flash 中每个块的最大擦写次数是一百万次,而 NOR Flash 是十万次。

G、NOR Flash 可以像其他内存那样连接,非常直接地使用,并可以在上面直接运行代码;NAND Flash需要特殊的 I/O 接口,在使用的时候,必须先写入驱动程序,才能继续执行其他操作。因为设计师绝不能向坏块写入,这就意味着在 NAND Flash 上自始至终必须进行虚拟映像。

H、NOR Flash 用于对数据可靠性要求较高的代码存储、通信产品、网络处理等领域,被成为 代码闪存;NAND Flash 则用于对存储容量要求较高的 MP3、存储卡、U 盘等领域,被成为 数据闪存。

2 、 RAM 存储器

(1)SRAM 的特点:

SRAM 表示 静态随机存取存储器,只要供电它就会保持一个值,它没有刷新周期,由 触发器构成基本单元, 集成度低,每个 SRAM 存储单元由6 6 6 6 个晶体管组成,因此其 成本较高。它具有 较高速率,常用于高速缓冲存储器。

通常 SRAM 有4种引脚:

CE:片选信号,低电平有效。
R/W:读写控制信号。
ADDRESS:一组地址线。
DATA :用于数据传输的一组双向信号线。

(2)DRAM 的特点:

DRAM 表示 动态随机存取存储器。这是一种 以电荷形式进行存储的半导体存储器。它的每个存储单元由 一个晶体管和一个电容器组成,数据存储在电容器中。电容器会由于漏电而导致电荷丢失,因而 DRAM器件是不稳定的。它必须有规律地 进行刷新,从而将数据保存在存储器中。

DRAM 的接口比较复杂,通常有一下引脚:

CE:片选信号,低电平有效。
R/W:读写控制信号。
RAS:行地址选通信号,通常接地址的高位部分。
CAS:列地址选通信号,通常接地址的低位部分。
ADDRESS:一组地址线。
DATA :用于数据传输的一组双向信号线。

(3)SDRAM 的特点:

SDRAM 表示 同步动态随机存取存储器。同步是指内存工作需要同步时钟,内部的命令发送与数据的传输都以它为基准;动态是指存储器阵列需要不断的刷新来保证数据不丢失。它通常只能工作在 133MHz 的主频。

(4)DDRAM 的特点

DDRAM 表示 双倍速率同步动态随机存取存储器,也称 DDR。DDRAM 是基于 SDRAM 技术的,SDRAM 在一个时钟周期内只传输一次数据,它是在时钟的上升期进行数据传输;而 DDR 内存则是一个时钟周期内传输两次次数据,它能够在时钟的上升期和下降期各传输一次数据。在133MHz 的主频下,DDR内存带宽可以达到133×64b/8×2=2.1GB/s。

3、 GPIO 原理与结构

GPIO 是 I/O 的最基本形式,它是一组输入引脚或输出引脚。有些 GPIO 引脚能够加以编程改变工作方向,通常有两个控制寄存器:数据寄存器和数据方向寄存器。数据方向寄存器设置端口的方向。如果将引脚设置为输出,那么数据寄存器将控制着该引脚状态。若将引脚设置为输入,则此输入引脚的状态由引脚上的逻辑电路层来实现对它的控制。

4、 A/D 接口

(1)A/D 转换器是把电模拟量转换为数字量的电路。实现 A/D 转换的方法有很多,常用的方法有计数法 、双积分法和逐次逼进法。

(2)计数式 A/D 转换法

其电路主要部件包括:比较器、计数器、D/A 转换器和标准电压源。

其 工作原理简单来说就是,有一个计数器,从0开始进行加1计数,每进行一次加1,该数值作为 D/A 转换器的输入,其产生一个比较电压 V O 与输入模拟电压 V IN 进行比较。如果 V O 小于 V IN 则继续进行加1计数 ,直到 V O 大于 V IN ,这时计数器的累加数值就是 A/D 转换器的输出值。这种转换方式的 特点是简单,但是速度比较慢,特别是模拟电压较高时,转换速度更慢。例如对于一个8位 A/D 转换器,若输入模拟量为最大值,计数器要从0开始计数到255,做255次 D/A 转换和电压比较的工作,才能完成转换。

(3)双积分式 A/D 转换法

其电路主要部件包括:积分器、比较器、计数器和标准电压源。其 工作原理是,首先电路对输入待测电压进行固定时间的积分,然后换为标准电压进行固定斜率的反向积分,反向积分进行到一定时间,便返回起始值。由于使用固定斜率,对标准电压进行反向积分的时间正比于输入模拟电压值,输入模拟电压越大,反向积分回到起始值的时间越长。只要用标准的高频时钟脉冲测定反向积分花费的时间,就可以得到相应于输入模拟电压的数字量,也就完成了 A/D 转换。其 特点是,具有很强的抗工频干扰能力,转换精度高,但转换速度慢,通常转换频率小于10Hz,主要用于数字式测试仪表、温度测量等方面。

(4)逐次逼近式 A/D 转换法

其电路主要部件包括:比较器、D/A 转换器、逐次逼近寄存器和基准电压源。其 工作原理是,实质上就是对分搜索法,和平时天平的使用原理一样。在进行 A/D 转换时,由 D/A 转换器从高位到低位逐位增加转换位数,产生不同的输出电压,把输入电压与输出电压进行比较而实现。首先使最高位为1,这相当于取出基准电压的1/2与输入电压比较,如果在输入电压小于1/2的基准电压,则最高位置0,反之置1。之后,次高位置1,相当于在1/2的范围中再作对分搜索,以此类推,逐次逼近。其 特点是,速度快,转换精度高,对 N 位 A/D 转换器只需要 M 个时钟脉冲即可完成,一般可用于测量几十到几百微秒的过渡过程的变化,是目前应用最普遍的转换方法。

(5)A/D 转换的重要指标

A、 分辨率:反映 A/D 转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟电压的电平值表示。n 位 A/D 转换器能反映1/2 n 满量程的模拟输入电平。

B、 量程:所能转换的模拟输入电压范围,分为单极性和双极性两种类型。

C、 转换时间:完成一次 A/D 转换所需要的时间,其倒数为转换速率。

D、 精度:精度与分辨率是两个不同的概念,即使分辨率很高,也可能由于温漂、线性度等原因使其精度不够高。精度有绝对精度和相对精度两种表示方法。通常用数字量的最低有效位 LSB 的分数值来表示绝对精度,用其模拟电压满量程的百分比来表示相对精度。例如,满量程10V,10位 A/D 芯片,若其绝对精度为±1/2LSB,则其最小有效位 LSB 的量化单位为 :10/1024=9.77mv,其绝对精度为9.77mv/2=4.88mv,相对精度为:0.048%。

5 、 D/A 接口基本

(1)D/A 转换器使将数字量转换为模拟量。

(2)在集成电路中,通常采用 T 型网络实现将数字量转换为模拟电流,再由运算放大器将模拟电路转换为模拟电压。进行 D/A 转换实际上需要上面的 两个环节。

(3)D/A 转换器的分类:

A、 电压输出型:常作为高速 D/A 转换器。
B、 电流输出型:一般外接运算放大器使用。
C、 乘算型:可用作调制器和使输入信号数字化地衰减。

(4)D/A 转换器的主要指标:分辨率、建立时间、线性度、转换精度、温度系数。

6 、键盘接口

(1)键盘的两种形式:线性键盘和矩阵键盘。

(2)识别键盘上的闭合键通常有两种方法:行扫描法和行反转法。

(3)行扫描法是矩阵键盘按键常用的识别方法,此方法分为两步进行:

A、识别键盘哪一列的键被按下:让所有行线均为低电平,查询各列线电平是否为低,如果有列线为低,则说明该列有按键被按下,否则说明无按键按下。

B、如果某列有按键按下,识别键盘是哪一行按下:逐行置低电平,并置其余各行为高电平,查询各列的变化,如果列电平变为低电平,则可确定此行此列交叉点处按键被按下。

7 、显示接口

(1)LCD 的基本原理是,通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。

(2)LCD 的光源提供方式有两种: 投射式和 反射式。笔记本电脑的 LCD 显示器为投射式,屏的背后有一个光源,因此外界环境可以不需要光源。一般微控制器上使用的 LCD 为反射式,需要外界提供电源,靠反射光来工作。 电致发光( EL )是液晶屏提供光源的一种方式。

(3)按照液晶 驱动方式分类,常见的 LCD 可以分为三类:扭转向列类(TN)、超扭曲向列型(STN)和薄膜晶体管型(TFT)。

(4)市面上出售的 LCD 有两种类型:带有驱动电路的 LCD 显示模块,只要 总线方式驱动;没有驱动电路的 LCD 显示器,使用 控制器扫描方式。

(5)通常,LCD 控制器工作的时候,通过 DMA 请求总线,直接通过 SDRAM 控制器读取 SDRAM 中指定地址(显示缓冲区)的数据,此数据经过 LCD 控制器转换成液晶屏扫描数据格式,直接驱动液晶显示器。

(6)VGA 接口本质上是一个 模拟接口,一般都采用统一的 15 引脚接口,包括2个 NC 信号、3根显示器数据总线、5个 GND 信号、3个 RGB 色彩分量、1个行同步信号和1个场同步信号。其色彩分量采用的电平标准为 EIA 定义的 RS343 标准。

8 、触摸屏接口

(1)按工作原理分,触摸屏可以分为:表面声波屏、电容屏、电阻屏和红外屏几种。

(2)触摸屏的控制采用专业芯片,例如 ADS7843。(具体工作原理看《教程》176页)。

9 、音频接口

(1)基本原理:麦克风输入的数据经音频编解码器解码完成 A/D 转换,解码后的音频数据通过音频控制器送入 DSP 或 CPU 进行相应的处理,然后数据经音频控制器发送给音频编码器,经编码 D/A 转换后由扬声器输出。

(2)数字音频的格式有多种,最常用的是下面三种:

A、 采用数字音频 ( PCM) ):是 CD 或 DVD 采用的数据格式。其采样频率为44.1kHz。精度为16位时 ,PCM 音频数据速率为1.41Mb/s;精度为32位时为2.42 Mb/s。一张700MB 的 CD 可以保存大约60分钟的16位 PCM 数据格式的音乐。

B、 MPEG 层3 3 3 3频 音频 ( MP3) ):MP3播放器采用的音频格式。立体声 MP3数据速率为112kb/s 至128kb/s。

C、 ATSC 数字音频压缩标准 ( AC3) ):数字 TV、HDTV 和电影数字音频编码标准,立体声 AC3编码后的数据速率为192kb/s。

(3)IIS 是音频数据的编码或解码常用的串行音频数字接口。IIS 总线只处理声音数据,其他控制信号等则需要单独传输。IIS 使用了3根串行总线:数据线 SD、字段选择线 WS、时钟信号线 SCK。

(4)当接收方和发送方的数据字段宽度不一样时,发送方不考虑接收方的数据字段宽度。如果发送方发送的数据字段小于系统字段宽度,就在低位补0;如果发送方的数据宽度大于接收方的宽度,则超过 LSB的部分被截断。字段选择 WS 用来选择左右声道,WS=0表示选择左声道;WS=1表示选择右声道。此外 ,WS 能让接收设备存储前一个字节,并准备接收下一个字节。

10 、串行接口

(1)串行通信是指,使数据一位一位地进行传输而实现的通信。与并行通信相比,串行通信具有传输线少、成本低等优点,特别适合远距离传送;缺点使速度慢。

(2)串行数据传送有3种基本的通信模式:单工、半双工、全双工。

(3)串行通信在信息格式上可以分为2种方式:同步通信和异步通信。

A、 异步传输:把每个字符当作独立的信息来传输,并按照一固定且预定的时序传送,但在字符之间却取决于字符与字符的任意时序。异步通信时,字符是一帧一帧传送的,每帧字符的传送靠起始位来同步。一帧数据的各个代码间间隔是固定的,而相邻两帧数据其时间间隔是不固定的。

B、 同步传输:同步方式不仅在字符之间是同步的,而且在字符与字符之间的时序仍然是同步的,即同步方式是将许多字符聚集成一字符块后,在每块信息之前要加上1~2个同步字符,字符块之后再加入适当的错误检测数据才传送出去。

(4)异步通信必须遵循3项规定:

A、字符格式:起始位+数据+校验位+停止位(检验位可无),低位先传送。
B、波特率:每秒传送的位数。
C、校验位:奇偶检验。
a、奇校验:要使字符加上校验位有奇数个“1”。
b、偶检验:要使字符加上校验位有偶数个“1”。

(5)RS-232C 的电气特性: 负逻辑。

A、在 TxD 和 RxD 上:逻辑1为-3V~-15V,逻辑0为3V~15V。
B、在 TES、CTS、DTR、DCD 等控制线上:
信号有效(ON 状态)为3V~15V
信号无效(OFF 状态)为-3V~-15V

(6)TTL 标准与 RS-232C 标准之间的电平转换利用集成芯片 RS232实现。(详见《教程》182页)

(7)RS-422串行通信接口

A、RS-422是一种单机发送、多机接收的单向、平衡传输规范,传输速率可达10Mb/s。
B、RS-422采用 差分传输方式,也称做平衡传输,使用一对双绞线。
C、RS-422需要一终端电阻,要求其阻值约等于传输电缆的特性阻抗。

(8)RS-485串行总线接口

A、RS-485是在 RS-422的基础上建立的标准,增加了多点、双向通信能力,通信距离可为几十米到上千米。
B、RS-485收发器采用 平衡发送和 差分接收,具有抑制共模干扰的能力。
C、RS-485需要两个终端电阻。在近距离(300m 一下)传输可不需要终端电阻。

11 、并行接口

(1)并行接口的数据传输率比串行接口快8倍,标准并行接口的数据传输率为1Mb/s,一般用来连接打印机、扫描仪等,所以又称打印口。

(2)并行接口可以分为 SPP(标准并口)、EPP(增强型并口)和 ECP(扩展型并口)。

(3)并行总线分为标准和非标准两类。常用的并行标准总线有 IEEE 488总线和 ANSI SCSI 总线。MXI总线是一种高性能非标准的通用多用户并行总线。

来源:http://www.cnblogs.com/chenshikun/p/7723699.html

围观 535

单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们自己的定义,接下来,就谈谈这两个概念的深入理解。

什么是单片机

首先明确概念,什么是单片机,单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。

从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。比如最经典的51系列单片机,外观只是一块一个拇指大小的长方体芯片,共40个引脚,里面包含了逻辑运算单元。实际上也就是一个cpu。
  
在最开始接触单片机的时候,还曾经有过一个疑问,为什么单片机是黑色的而不可以是别的颜色,后来才知道是单片机材料的限制。
  
对单片机而言,其实一个芯片就是全部,其他的比如单片机最小系统都是为了单片机的正常运作而加入其他元件,比如晶振,5v电源,电感电阻等。当然最小系统只能保证单片机正常运行,几乎实现不了基于单片机的任何应用。

为了使单片机实现应用,必须要加入其他外设。比如按键,led灯,led屏,蜂鸣器,各种sensor。这也就是市面上很多公司都在做的单片机开发板。
  
总结,单片机就是完成运算、逻辑控制、通信等功能的单一模块。也就是单片机真的姓“单”。DSP芯片也可以认为是一个单片机。当然它们性能很强大,但是功能依然很单一,总之就是处理数据、逻辑。
  
什么是嵌入式

那么什么是嵌入式呢,一般说嵌入式都是指嵌入式系统,IEEE(InsTItuteof Electrical and ElectronicsEngineers,美国电气和电子工程师协会)对嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。

嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。

嵌入式系统是将应用程序、操作系统、和计算机硬件在一起的系统,是指以应用为中心,以计算机技术为基础,软硬件可裁剪,其针对的用户应用对功能、可靠性、成本、体积、功耗和使用环境有特殊要求的专用计算机系统。

事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。这是因为嵌入式系统一般用于工业控制,也就是说对外设的控制都是写死的,并不需要人工干预,同时也为了保证系统的稳定和可靠。
  
我们经常可以听到公司招聘的要求是嵌入式软件工程师或者嵌入式硬件工程师,也就是说嵌入式系统包括软件和硬件,其实仔细想想也能明白,都已经跑系统了,当然有软件也有bsp硬件啦。

也就是说嵌入式系统是软硬件结合体,国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

嵌入式的硬件层

硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。其中操作系统和应用程序都可以固化在ROM中。
  
其中核心就是微处理器,嵌入式处理器和一般的电脑cpu还有区别,嵌入式微处理器大多工作在特定设计的系统中,比如TI或者Atmel公司都有很多定位不同的处理器,atmel的SAM系列是专门为物联网设计的,AVR则由于性能十分突出,广泛应用于工业领域。
  
嵌入式微处理器有各种不同的体系,即使在同一体系中也可能具有不同的时钟频率和数据总线宽度,或集成了不同的外设和接口。据不完全统计,全世界嵌入式微处理器已经超过1000多种,体系结构有30多个系列,其中主流的体系有ARM、MIPS、PowerPC、X86和SH等。

但与全球PC市场不同的是,没有一种嵌入式微处理器可以主导市场,仅以32位的产品而言,就有100种以上的嵌入式微处理器。嵌入式微处理器的选择是根据具体的应用而决定的。

在嵌入式领域,可以说arm架构的处理器占据了半壁江山,而arm公司也成为著名的科技公司,而它却没有生产任何处理器,而只是提供了IP,可以看出一流公司做标准。而其他用的比较多的架构就是sparc、powerpc等。

比如arm公司有各种各样的处理器架构,最经典的cortex系列,它属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。ARMv7架构定义了三大分工明确的系列:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用;“R”系列针对实时系统;“M”系列对微控制器。
  
嵌入式系统和外界交互需要一定形式的通用设备接口,如A/D、D/A、I/O等,外设通过和片外其他设备的或传感器的连接来实现微处理器的输入/输出功能。每个外设通常都只有单一的功能,它可以在芯片外也可以内置芯片中。外设的种类很多,可从一个简单的串行通信设备到非常复杂的802.11无线设备。
  
嵌入式系统中常用的通用设备接口有A/D(模/数转换接口)、D/A(数/模转换接口),I/O接口有RS-232接口(串行通信接口)、Ethernet(以太网接口)、USB(通用串行总线接口)、音频接口、VGA视频输出接口、I2C(现场总线)、SPI(串行外围设备接口)和IrDA(红外线接口)等。这一点其实和单片机类似。
  
嵌入式的软件层

也就是操作系统了,包括内核和文件系统,还有就是更为顶层的应用程序,嵌入式操作系统一般都是Linux或者其他类Unix,还有一些实时操作系统(RTOS)比如VxWorks、RTEMS、ucOS等。
  
其中Linux还包括不同的distribuTIon,比如Ubuntu、Redhat、Debian、centos等,他们都是采用Linux的内核,不同的是上面的software和tools,当然不用太过于担心标准问题,这些Linux发行版选择的软件几乎都是比较通用的,比如网页服务器的Apache、电子邮件服务器的postfix、sendmail、文件服务器的Samba等。此外还有Linuxstandard base等标准来规范开发者。类Unix主要是FreeBSD以及Solaris等。
  
嵌入式领域最常用的还是一些实时操作系统,实时操作系统的核心就是实时性,本质就是任务处理所华为时间的可预测性,即任务需要在规定内时限内完成。IEEE对实时系统的定义是“那些正确性不仅取决于计算的逻辑结果也取决于产生结果所花费时间的系统”。

实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。

那么实时操作系统和Linux这种分时操作系统的区别列举如下:

(1)多路性。实时信息处理系统与分时系统一样具有多路性。系统按分时原则为多个终端用户服务;而对实时控制系统,其多路性则主要表现在经常对多路的现场信息进行采集以及对多个对象或多个执行机构进行控制。
  
(2)独立性。实时信息处理系统与分时系统一样具有独立性。每个终端用户在向分时系统提出服务请求时,是彼此独立的操作,互不干扰;而在实时控制系统中信息的采集和对对象的控制,也彼此互不干扰。
  
(3)及时性。实时信息系统对实时性的要求与分时系统类似,都是以人所能接受的等待时间来确定;而实时控制系统的及时性,则是以控制对象所要求的开始截止时间或完成截止时间来确定的,一般为秒级、百毫秒级直至毫秒级,甚至有的要低于100微秒。
  
(4)交互性。实时信息处理系统具有交互性,但这里人与系统的交互,仅限于访问系统中某些特定的专用服务程序。它不像分时系统那样能向终端用户提供数据处理服务、资源共享等服务。
  
(5)可靠性。分时系统要求系统可靠,相比之下,实时系统则要求系统高度可靠。因为任何差错都可能带来巨大的经济损失甚至无法预料的灾难性后果。因此,在实时系统中,采取了多级容错措施来保证系统的安全及数据的安全。
  
由于更加可靠和及时。嵌入式实时操作系统更加广泛应用于工业控制、航空航天、军工等领域,比如美国航天局NASA近几年发射的火星探测器等都是采用的RTEMS实时操作系统。

嵌入式的中间层

所谓的中间层就是软件层和硬件层之间的接口层,其实严格而言也属于软件层。一般开发者称之为BSP,这一层主要负责的是向下提供硬件的驱动,硬件的配置等操作,向上则向软件开发者提供标准API,进行中间层开发的开发者通常称为嵌入式驱动工程师。
  
从这里也可以看出来,嵌入式设计和软硬都分不开,既要掌握底层硬件的特性以及如何驱动其工作,也要了解操作系统的相关知识,才可以编写相应功能的应用。
  
因此看一个操作系统是否支持某个芯片或者某个开发板,只要看其源码中是否包含相应芯片或开发板的板级支持包。

嵌入式系统应该跑在什么样的硬件上?

谈起嵌入式硬件或者开发板,我想很多人第一印象就是RaspberryPi,是一块只有信用卡大小的微型电脑,别看其外表“娇小”,内“心”却很强大,视频、音频等功能通通皆有,可谓是“麻雀虽小,五脏俱全”。树莓派推出后,很多厂商争相推出类似产品,比如香蕉派之类的。

还有TI的Beagleboneblack板子,体积大小和树莓派类似,外设包括有USBhost和USBmini以及网卡接口,背面还有一个sd卡槽和HDMI接口。BBB的处理器采用的是当前嵌入式系统中最流行的ARMv7指令集。采用当今广泛使用的指令集的处理器可以被更多的软件支持。例如,一些操作系统已经不支持在ARMv6指令集上运行,例如,Ubuntu在2012年4月放弃了对ARMv6指令集的支持。
  
ARMv7相对与ARMv6指令集的另一个优势在于,使用ARMv7的处理器的实际性能更加强劲。ARMv7相对与ARMv6的优势还有很多,比如一些显著的改进:实现了超标量架构、包含了SIMD操作指令、改进了分支预测算法从而极大的提高了某些性能。
  
总结

以上就是一块基本的嵌入式核心板所具有的性能参数,和上面说到的单片机的性能参数相比较,单片机的处理能力较低,主频大多在几十M上下,和嵌入式动辄上百上千M的处理速度还是相差较多,此外单片机并不具有图形界面的处理能力,也就是GPU的缺乏导致单片机几乎不可能带动图形界面。

单片机的存储空间和嵌入式处理器也不是一个等级的,单片机通常片内存储只有几k大小,而由于外设的限制也不太可能大范围增加外设emmc,而嵌入式处理器通常有几百兆的RAM,如此巨大的差别导致单片机几乎不可能像嵌入式处理器那样运行操作系统,甚至连TCP/IP协议栈和USB协议栈都跑不起来,一些高端的单片机比如ST公司的STM32系列,可能可以跑一些轻量级的系统os和嵌入式网络协议栈,比如IwIP协议栈。

嵌入式处理器丰富强大的性能决定它能完成更多单片机不能完成的应用,比如网络通信功能,视频传输处理功能等,而当外设存储增加后,嵌入式处理器能够轻松运行各种Linux系统,以及图形GUI界面。
  
在开发方式上单片机和嵌入式也有较大差别,也就是编译过程的区别,单片机主要在Windows等图形界面下开发,目前有很多成熟的IDE工具比如keil、IAR、以及ti的CCS等,这些工具集编译、汇编、链接、仿真为一体,并且由于在Windows下开发,具有友好的用户界面,开发者只需编写c代码,然后点击编译链接按键即可,出现错误还可以debug或者仿真,上手还是非常快的。

而嵌入式开发一般是在Linux下进行的,要将c代码在自己主机上编译完成,然后通过系统镜像或者uboot引导将编译好的文件烧入开发板,由于主机的处理器的x86架构,而编写的代码是为了运行在arm架构或sparc架构的处理器上,因此存在一个交叉编译链的安装,此外,Linux下没有Windows那样的IDE,也就是编译,链接源代码都需要开发者自己完成,一般都是利用GNUmake脚本编写Makefile以及configure文件来完成,Makefile文件中编写如何对c或者h文件编译,也就是编译规则以及依赖文件是什么。这些都需要开发者自己完成。并且以上过程都是在Linux下的终端也就是命令行中完成,这也给嵌入式开发增加了难度。

转自: 玩转单片机

围观 263

LCD的接口有多种,分类很细。主要看的驱动方式和控制方式,目前手机上的彩色的连接方式一般有这么几种:MCU模式,RGB模式,SPI模式,VSYNC模式,MDDI模式,DSI模式。MCU模式(也写成MPU模式的)。只有TFT模块才有RGB接口。

但应用比较多的就是MUC模式和RGB模式,区别有以下几点:

1.MCU接口:会解码命令,由ming generator产生时序信号,驱动COM和SEG驱器。
RGB接口:在写LCD register setng时,和MCU接口没有区别。区别只在于图像的写入方式。

2.用MCU模式时由于数据可以先存到IC内部GRAM后再往屏上写,所以这种模式LCD可以直接接在MEMORY的总线上。

用RGB模式时就不同了,它没有内部RAM,HSYNC,VSYNC,ENABLE,CS,RESET,RS可以直接接在MEMORY的GPIO口上,用GPIO口来模拟波形。

3.MPU接口方式:显示数据写入DDRAM,常用于静止图片显示。
RGB接口方式:显示数据不写入DDRAM,直接写屏,速度快,常用于显示视频或动画用。

MCU接口和RGB接口主要的区别是:
MCU接口方式:显示数据写入DDRAM,常用于静止图片显示。
RGB接口方式:显示数据不写入DDRAM,直接写屏,速度快,常用于显示视频或动画用。

MCU模式

因为主要针对单片机的领域在使用,因此得名。后在中低端手机大量使用,其主要特点是价格便宜的。

MCU-LCD接口的标准术语是Intel提出的8080总线标准,因此在很多文档中用I80 来指MCU-LCD屏。主要又可以分为8080模式和6800模式,这两者之间主要是时序的区别。数据位传输有8位,9位,16位,18位,24位。连线分为:CS/,RS(寄存器选择),RD/,WR/,再就是数据线了。

优点是:控制简单方便,无需时钟和同步信号。
缺点是:要耗费GRAM,所以难以做到大屏(3.8以上)。

对于MCU接口的LCM,其内部的芯片就叫LCD驱动器。主要功能是对主机发过的数据/命令,进行变换,变成每个象素的RGB数据,使之在屏上显示出来。这个过程不需要点、行、帧时钟。

MCU接口的LCD的DriverIC都带GRAM,Driver IC作为MCU的一片协处理器,接受MCU发过来的Command/Data,可以相对独立的工作。对于MCU接口的LCM(LCD Module),其内部的芯片就叫LCD驱动器。主要功能是对主机发过的数据/命令,进行变换,变成每个象素的RGB数据,使之在屏上显示出来。这个过程不需要点、行、帧时钟。

M6800模式

M6800模式支持可选择的总线宽度8/9/16/18-bit(默认为8位),其实际设计思想是与I80的思想是一样的,主要区别就是该模式的总线控制读写信号组合在一个引脚上(/WR),而增加了一个锁存信号(E)数据位传输有8位,9位,16位和18位。

嵌入式彩色LCD六大连接方式详解

I8080模式

I80模式连线分为:CS/,RS(寄存器选择),RD/,WR/,再就是数据线了。优点是:控制简单方便,无需时钟和同步信号。缺点是:要耗费GRAM,所以难以做到大屏(QVGA以上)。

嵌入式彩色LCD六大连接方式详解

MCU接口标准名称是I80,管脚的控制脚有5个:
- CS 片选信号
- RS (置1为写数据,置0为写命令)
- /WR (为0表示写数据) 数据命令区分信号
- /RD (为0表示读数据)
- RESET 复位LCD( 用固定命令系列 0 1 0来复位)

VSYNC模式

该模式其实就是就是在MCU模式上加了一个VSYNC信号,应用于运动画面更新,这样就与上述两个接口有很大的区别。该模式支持直接进行动画显示的功能,它提供了一个对MCU接口最小的改动,实现动画显示的解决方案。在这种模式下,内部的显示操作与外部VSYNC信号同步。可以实现比内部操作更高的速率的动画显示。但由于其操作方式的不同,该模式对速率有一个限制,那就是对内部SRAM的写速率一定要大于显示读内部SRAM的速率。

嵌入式彩色LCD六大连接方式详解

RGB模式

大屏采用较多的模式,数据位传输也有6位,16位和18位,24位之分。连线一般有:VSYNC,HSYNC,DOTCLK,CS,RESET,有的也需要RS,剩下就是数据线。它的优缺点正好和MCU模式相反。

MCU-LCD屏它与RGB-LCD屏主要区别在于显存的位置。RGB-LCD的显存是由系统内存充当的,因此其大小只受限于系统内存的大小,这样RGB-LCD可以做出较大尺寸,象现在4.3“只能算入门级,而MID中7”,10“的屏都开始大量使用。而MCU-LCD的设计之初只要考虑单片机的内存较小,因此都是把显存内置在LCD模块内部。然后软件通过专门显示命令来更新显存,因此MCU屏往往不能做得很大。同时显示更新速度也比RGB-LCD慢。显示数据传输模式也有差别。RGB屏只需显存组织好数据。启动显示后,LCD-DMA会自动把显存中的数据通过RGB接口送到LCM。而MCU屏则需要发送画点的命令来修改MCU内部的RAM(即不能直接写MCU屏的RAM)。所以RGB显示速度明显比MCU快,而且播放视频方面,MCU-LCD也比较慢。

对于RGB接口的LCM,主机输出的直接是每个象素的RGB数据,不需要进行变换(GAMMA校正等除外),对于这种接口,需要在主机部分有个LCD控制器,以产生RGB数据和点、行、帧同步信号。

嵌入式彩色LCD六大连接方式详解

彩色TFT液晶屏主要有2种接口:TTL接口(RGB颜色接口), LVDS接口(将RGB颜色打包成差分信号传输)。TTL接口主要用于12.1寸一下的小尺寸TFT屏,LVDS接口主要用于8寸以上的大尺寸TFT屏。TTL接口线多,传输距离短;LVDS接口传输距离长,线的数量少。大屏采用较多的模式,控制脚是VSYNC,HSYNC,VDEN,VCLK, S3C2440最高支持24个数据脚,数据脚是VD[23-0]。

CPU或显卡发出的图像数据是TTL信号(0-5V、0-3.3V、0-2.5V、或0-1.8V),LCD本身接收的也是TTL信号,由于TTL信号在高速率的长距离传输时性能不佳,抗干扰能力比较差,后来又提出了多种传输模式,比如LVDS、TDMS、GVIF、P&D、DVI和DFP等。他们实际上只是将CPU或显卡发出的TTL信号编码成各种信号以传输,在LCD那边将接收到的信号进行解码得到TTL信号。

但是不管采用何种传输模式,本质的TTL信号是一样的。

注意:TTL/LVDS分别是两种信号的传输模式,TTL是高电平表示1,低电平表示0的模式,LVDS是正负两个对应波形,用两个波形的差值来表示当前是1还是0。

SPI模式

采用较少,有3线和4线的,连线为CS/,SLK,SDI,SDO四根线,连线少但是软件控制比较复杂。

MDDI模式(MobileDisplayDigitalInterface)

高通公司于2004年提出的接口MDDI,通过减少连线可提高移动电话的可靠性并降低功耗,这将取代SPI模式而成为移动领域的高速串行接口。 连线主要是host_data,host_strobe,client_data,client_strobe,power,GND几根线。

DSI模式

该模式串行的双向高速命令传输模式,连线有D0P,D0N,D1P,D1N,CLKP,CLKN。

来源: 捷配电子市场

围观 361

1. 嵌入式微处理器的基本结构

(1)嵌入式硬件系统一般由嵌入式微处理器、存储器和输入/输出部分组成。

(2)嵌入式微处理器是嵌入式硬件系统的核心,通常由控制单元、算术逻辑单元和寄存器3大部分组成:

A、控制单元:主要负责取指、译码和取数等基本操作并发送主要的控制指令。

B、算术逻辑单元:主要处理数值型数据和进行逻辑运算工作。

C、寄存器:用于暂存临时性的数据。

2. 嵌入式微处理器的分类(根据用途)

(1)嵌入式微控制器(MCU):又称为单片机,片上外设资源一般比较丰富,适合于控制。最大的特点是单片化,体积小,功耗和成本低,可靠性高。目前约占70%的市场份额。

(2)嵌入式微处理器(EMPU):又称为单板机,由通用计算机中的 CPU 发展而来,它的特征是具有32位以上的处理器,具有较高的性能。通常嵌入式微处理器把 CPU、  ROM、RAM 及 I/O 等模块做到同一个芯片上。

(3)嵌入式 DSP 处理器(DSP):专门用于信号处理方面的处理器,其在系统结构和指令算法方面进行了特殊设计,使其处理速度比最快的 CPU 还快10~50倍,在数字滤     波、FFT、频谱分析等方面获得了大量的应用。

(4)嵌入式片上系统(SOC):追求产品系统最大包容的集成器件,其最大的特点是成功实现了软硬件的无缝结合,直接在微处理器片内嵌入操作系统的代码模块。

3. 典型的微处理器的结构和特点

(1)8位微处理器:以8051为重点,彻底搞清楚8位单片机的工作原理,外设控制、存储分布 、寻址方式以及典型应用。

(2)16位微处理器:典型的微处理器可以参考 MSP430,找一本这方面的书看看关于 MSP430的结构原理以及典型应用。

(3)32位微处理器:32位处理器采用32位的地址和数据总线,其地址空间达到了2 32 =4GB 。目前主流的32位嵌入式处理器系统主要有 ARM 系列、MIPS 系列、PoewrPC系列等。ARM 微处理器体系结构目前被公认为是嵌入式应用领域领先的32位嵌入式 RISC 处理器结构。按照目前的发展形式,ARM 几乎成了嵌入式应用的代名词。

4、单片机系统的基本概念

(1)单片机组成:中央处理器、存储器、I/O 设备。

(2) 存储器:物理实质是一组或多组具备数据输入/输出和数据存储功能的集成电路,用于充当设备缓存或保存固定的程序及数据。

A、ROM(只读存储器):一般用于存放固定的程序或数据表格等,数据在掉电后仍然会保留下来。
B、RAM(随机存储器):用于暂存程序和数据、中间计算结果,或用作堆栈用等,数据在掉电后就会丢失。

(3) I/O 端口:单片机与外界联系的通道,它可以对各类外部信号(开关量、模拟量、频率信号)进行检测、判断、处理,并可控制各类外部设备。现在的单片机 I/O 口已经    集成了更多的特性和功能,对 I/O端口的功能进行了拓展和复用,例如外部中断、ADC 检测以及 PWM 输出等等。

(4)输出电平:高电平电压(输出“1”时)和低电平电压(输出“0”时)

A、TTL 电平:正逻辑,5V 为逻辑正,0V 为逻辑负,例如单片机的输出。
B、RS232电平:负逻辑,-12V 为逻辑正,+12V 为逻辑负,例如 PC 的输出。

注:因此在单片机和 PC 进行通讯的时候需要一个 MAX232芯片进行电平转换。

(5)堆栈:它是一种线性的数据结构,是一个只有一个进出口的一维空间。

A、堆栈特性:后进先出(LIFO)

B、堆栈指针:用于指示栈顶的位置(地址),当发生压栈或者出栈操作时,导致栈顶位置变化时,堆栈指针会随之变化。

C、堆栈操作:压栈操作(PUSH)和出栈操作(POP)。

D、堆栈类型:“向上生长”型堆栈,每次压栈时堆栈指针加1;“向下生长”型堆栈,每次压栈堆栈时指针减1。

E、堆栈应用:调用子程序、响应中断时,堆栈用于保护现场;还可以用作临时数据缓冲区来使用。

F、使用注意:堆栈溢出问题,压栈和出栈的匹配问题。

(6)定时计数器:实质都是计数器。用作定时器时是对单片机内部的时钟脉冲进行计数,而在用作计数器时是对单片机外部的输入脉冲进行计数,其作用如下:

A、计时、定时或延时控制;

B、脉冲技术;

C、测量脉冲宽度或频率(捕获功能)

(7)中断:优先级更高的事件发生,打断优先级低的时间进程。引起中断的事件称为中断源。一个单片机可能支持多个中断源,这些中断源可以分为可屏蔽中断和非可屏蔽中    断,而这些中断源并不都是系统工作所需的,我们可以根据系统需求屏蔽那些不需要的中断源。

A、中断嵌套:当一个低级中断尚未执行完毕,又发生了一个高级优先级的中断,系统转而执行高级中断服务程序,待处理完高级中断后再回过头来执行低级中断服务程序。

B、中断响应时间是指从发出中断请求到进入中断处理所用的时间;中断处理时间是指中断处理开始到中断处理结束的时间。

C、中断响应过程:

a、保护现场:将当前地址、累加器 ACC、状态寄存器保存到堆栈中。
b、切换 PC 指针:根据不同的中断源所产生的中断,切换到相应的入口地址。
c、执行中断服务处理程序。
d、恢复现场:将保存在堆栈中的主程序地址、累加器 ACC、状态寄存器恢复。
e、中断返回:从中断处返回到主程序,继续执行。

D、中断入口地址:单片机为每个中断源分配了不同的中断入口地址,也称为中断向量。

(8)复位:通过外部电路给单片机的复位引进一个复位信号,让系统重新开始运行。

A、复位发生时的动作:
a、PC 指针从起始位置开始执行(大多数单片机都时从0x0000处开始执行)。
b、I/O 端口设置成缺省状态(高阻态、或者输出低电平)。
c、部分专用控制寄存器 SFR 恢复到缺省状态。
d、普通 RAM 不变(如果时上电复位,则是随即数)。

B、两种不同的复位启动方式:

a、冷启动:也叫上电复位,指在断电状态下给系统加电,让系统开始正常运行。
b、热启动:在不断电的状态下,给单片机复位引进一个复位信号,让系统重新开始。

C、两种类型的复位电路:高电平复位和低电平复位。

D 注意事项:

a、 注意复位信号的电平状态及持续时间必须满足系统要求。
b、 注意避免复位信号抖动。

(9)时钟电路:单片机是一种时序电路,必须提供脉冲电路才能正常工作。时钟电路相当于单片机的心脏,它的每一次跳动(振动节拍)都控制着单片机的工作节奏。振荡得慢时,系统工作速度就慢,振荡得快时,系统工作速度就快(功耗也增大)。

A、振荡周期:振荡源的振荡节拍。
B、机器周期:单片机完成一个基本操作需要的振荡周期(节拍)。
C、指令周期:执行一条指令需要几个机器周期。不同的指令需要的机器周期数不同。

5、 ARM 体系结构的基本概念

(1) ARM :Advanced RISC Machine。

(2) ARM 体系结构中支持两种指令集:ARM 指令集和 Thumb 指令集。

(3) ARM 内核有 T 、 D 、 M 、 I 四个功能模块:

A、T 模块:表示16位 Thumb,可以在兼顾性能的同时减少代码尺寸。
B、D 模块:表示 Debug,内核中放置了用于调试的结构,通常为一个边界扫描链 JTAG。
C、M 模块:表示8位乘法器。
D、I 模块:表示 EmbeddedICE Logic,用于实时断点观测及变量观测的逻辑电路部分。

(4) ARM 处理器有7 种运行模式:

A、用户模式(User):正常程序执行模式,用于应用程序。
D、快速中断模式(FIQ):快速中断处理,用于高速数据传输和通道处理。
C、外部中断模式(IRQ):用于通用的中断处理。
D、管理模式(SVE):供操作系统使用的一种保护模式。
E、数据访问中止模式(Abort):用于虚拟存储及存储保护。
F、未定义指令中止模式(Undefined):当未定义指令执行时进入该模式。
G、系统模式(System):用于运行特权级的操作系统任务。

除了用户模式之外的其他6种处理器模式称为 特权模式,在这些模式下,程序可以访问所有的系统资源 ,也可以任意地进行处理器模式切换,其中,除了系统模式外,其他的5种特权模式又称为 异常模式。处理器模式可以通过 软件控制进行切换,也可以通过 外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下,这时,应用程序不能访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理中进行处理器模式的切换。这种体系结构可以使操作系统控制整个系统的资源。当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式种都有一组寄存器,供相应的异常处理程序使用,这样就可以保证进入异常模式时,用户模式下的寄存器不被破坏。系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器,但是系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换,它主要供操作系统任务使用。

(5) ARM 处理器共有 37 个寄存器: 31 个通用寄存器和6个状态寄存器

A、通用寄存器包括 R0~R15,可以分为3类:

a、未备份寄存器 R0~R7:在所有的处理器模式下,未备份寄存器都是指向同一个物理寄存器。
b、备份寄存器 R8~R14:
对于 R8~R12来说,每个寄存器对于2个不同的物理寄存器,它们每次所访问的物理寄存器都与当前的处理器运行模式有关。对于 R13、R14来说,每个寄存器对于6个不同的物理寄存器,其中一个是用户模式和系统模式共用。R13在 ARM 指令种常用作堆栈指针。由于处理器的每种运行模式都有自己独立的物理寄存器R13,所有在用户应用程序的初始化部分,一般要初始化每种模式下的 R13,使其指向该运行模式的栈空间。R14又称为连接寄存器(LR),在 ARM 体系种具有下面两种特殊作用:在通过 BL 或 BLX 指令调用子程序时,存放当前子程序的返回地址;在 异常中断发生时,存放异常模式将要返回的地址。
c、程序计数器 R15(PC)。
由于 ARM 采用了流水线机制,在三级流水线中,当正确读取了 PC 的值时,该值为当前指令地址值加8个字节。也就是说,PC 指向当前指令的下两条指令的地         址。在 ARM 指令状态下,PC 的0和1位是0 ,在 Thumb 指令状态下,PC 的0位是0。

B、程序状态寄存器

a、ARM 体系结构包含1个当前程序状态寄存器(CPSR)和5个备份的程序状态寄存器(SPSR),使用MSR 和 MRS 指令来设置和读取这些寄存器。
b、当前程序状态寄存器 CPSR:保存当前处理器状态的信息,可以在任何处理器模式下被访问。
c、备份程序状态寄存器 SPSR:每一种异常处理器模式下都有一个专用的物理状态寄存器。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容,在异常中断程序退出时,可以用 SPSR 中保存的值来恢复 CPSR。
d、由于用户模式和系统模式不属于异常模式,它们没有 SPSR,当在这两种模式下访问 SPSR 时,结果是未知的。

(6) ARM 指令的寻址方式

所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。

A、 立即寻址:操作数本身就在指令中给出,只要取出指令也就取到了操作数。
       ADD R0, R0, #1 ;R0=R0+1
B、 寄存器寻址:利用寄存器中的数值作为操作数。
       ADD R0, R1, R2 ;R0=R1+R2
C、 寄存器间接寻址:以寄存器中的值作为操作数地址,而操作数本身存放在存储器中。
       ADD R0, R1, [R2] ;R0=R1+[R2]
       LDR R0, [R1]    ;R0=[R1]
       STR R0, [R1]    ;[R1]=R0
D、 基址变址寻址:将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
       LDR R0, [R1, #4]    ;R0=[R1+4]
       LDR R0, [R1, #4]!   ;R0=[R1+4] R1=R1+4
       LDR R0, [R1], #4    ;R0=[R1] R1=R1+4
       LDR R0, [R1, R2]!   ;R0=[R1+R2]
E、 多寄存器寻址:一条指令可以完成多个寄存器值的传送。
       LDMIA R0, {R1, R2, R3}   ;R1=[R0] R2=[R0+4] R3=[R0+8]
F、 相对寻址:以程序计数器 PC 的当前值作为基地址,指令中的地址标号作为偏移量,两者相加之后得到操作数的有效地址。

      BL NEXT ;跳转到子程序 NEXT 处执行
        ……
      NEXT
        ……
      MOV PC, LR ;从子程序返回
G、 堆栈寻址:支持4种类型的堆栈工作方式:

a、 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生长。
b、 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生长。
c、 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生长。
d、 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生长。

(7) ARM 的存储方法

A、大端模式:数据的高字节存储在低地址中,低字节存储在高地址中。
B、小端模式:数据的低字节存储在低地址中,高字节存储在高地址中。

(8) ARM 中断与异常

A、ARM 内核支持7种中断,不同的中断处于不同的处理模式,具有不同的优先级,而且每个中断都有固定的中断地址入口。当一个中断发生是,相应的 R14(LR)存储中      断返回地址,SPSR 存储当前程序状态寄存器 CPSR 的值。

B、由于 ARM 内核支持流水线工作,LR 寄存器存储的地址可能是发生中断后面指令的地址,所以不同的中断处理完成后,必须将 LR 寄存器值经过处理后再写P15(PC)      寄存器。

C、ARM 异常的具体含义:

a、复位:当处理器的复位电平有效时,产生复位异常,程序跳转到异常复位异常处理程序处执行。
b、未定义的指令:当 ARM 处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可以使用该异常机制进行软件仿真。
c、软件中断:该异常由执行 SWI 指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现操作系统调用功能。
d、指令预取中止:如果处理器预取指令的地址不存在或该地址不允许当前指令访问,存储器向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
e、数据访问中止:如果处理器数据访问指令的目标地址不存在,或者该地址不允许当前指令访问 ,处理器产生数据访问中止异常。
f、外部中断请求:当 ARM 外部中断请求管脚有效,而且 CPSR 中的 I 位为0时,产生 IRQ 异常 。系统的外设可以通过该异常请求中断服务。
g、快速中断请求:当 ARM 快速中断请求管脚有效,而且 CPSR 的 F 位为0时,产生 FIQ 异常。

D、ARM 处理器对异常中断的响应过程

a、将下一条指令的地址存入相应的连接寄存器 LR 中。
b、将 CPSR 复制到相应的 SPSR 中。
c、根据异常的类型,强制设置 CPSR 的运行模式位。
d、强制 PC 从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

E、ARM 处理器从异常中断处理程序中返回

a、恢复中断的程序的处理器状态,将 SPSR 复制到 CPSR 中。
b、若在进入异常处理时设置了中断禁止位,要在此清除。
c、将连接寄存器 LR 的值减去相应的偏移量后送到 PC。

F、复位异常中断处理程序不需要返回。在复位异常中断程序开始整个用户程序的执行。

转自: 沉舟侧畔

围观 417

页面

订阅 RSS - 嵌入式