博文

sizeof()(2008-10-06 20:16:00)

摘要:这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体:
  struct S1
  {
  char c;
  int i;
  };
  问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。是这样吗你在你机器上试过了吗也许你是对的,但很可能你是错的!VC6中按默认设置得到的结果为8。
  Why为什么受伤的总是我
  请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况:
  S1 s1 = { 'a', 0xFFFFFFFF };
  定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么
  以我的VC6.0为例,s1的地址为0x0012FF78,其数据内容如下:
  0012FF78: 61 CC CC CC FF FF FF FF
  发现了什么怎么中间夹杂了3个字节的CC看看MSDN上的说明:
  When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.
  原来如此,这就是传说中的字节对齐啊!一个重要的话题出现了。
  为什么需要字节对齐计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被 4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。
  让我们交换一下S1中char与int的位置:
  struct S2
  {
  int i;
  char c;
  };
  ......

阅读全文(3989) | 评论:0

ARM9处理器与ARM7处理器比较(2008-09-26 19:09:00)

摘要:摘要:ARM处理器是世界上最流行的嵌入式处理器,广泛应用于个人通信等嵌入式领域。ARM7处理器虽然功能强大,但是目前已经开始退出主流应用领域,代替它的是性能更加强大的ARM9系列处理器。介绍了ARM9处理器与ARM7处理器的不同之处,并且给出了ARM9的应用实例。     关键词:ARM9 ARM7 流水线 指令周期 ARM9系列处理器是英国ARM公司设计的主流嵌入式处理器,主要包括ARM9TDMI和ARM9E-S等系列。本文主要介绍它们与ARM7TDMI的结构以及性能比较。 以手机应用为例,2G手机只需提供语音及简单的文字短信功能,而目前的2.5G和未来的3G手机除了提供这两项功能外,还必须提供各种其他的应用功能。主要包括:(1)无线网络设备:手机上网、电子邮件及其他定位服务等功能;(2)PDA功能:含有用户操作系统(Windows CE、Symbian OS、Linux等)及其他功能;(3)高性能功能:音频播放器、视频电话、手机游戏等。在2.5G和3G的应用中ARM9已经全面替代了ARM7。因为ARM9的新特性能够满足各种新需求的同时减少产品研发时间并降低研发费用。 新一代的ARM9处理器,通过全新的设计,采用了更多的晶体管,能够达到两倍以上于ARM7处理器的处理能力。这种处理能力的提高是通过增加时钟频率和减少指令执行周期实现的。 1 时钟频率的提高 ARM7处理器采用3级流水线,而ARM9采用5级流水线,如图1、2、3所示。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内同时有5个指令在执行。在同样的加工工艺下,ARM9TDMI处理器的时钟频率是ARM7TDMI的1.8~2.2倍。

图1、图2和图3

2 指令周期的改进 指令周期的改进对于处理器性能的提高有很大的帮助。性能提高的幅度依赖于代码执行时指令的重叠,这实际上是程序本身的问题。对于采用最高级的语言,一般来说,性能的提高在30%左右。 2.1 loads 指令矛n stores指令 指令周期数的改进最明显的是loads指令和stores指令。从ARM7到ARM9这两条指令的执行时间减少了30%。指令周期的减少是由于ARM7和ARM9两种处理器内的两个基本的微处理结......

阅读全文(1481) | 评论:0

嵌入式系统设计要点(2008-09-26 19:07:00)

摘要:1.嵌入式系统
      采用大容量EPROM来固化程序的专用系统,正在智能仪器和自动化等领域里得到广泛应用。传统设计方法用汇编语言编写程序,这主要是从保证速度和节省存储空间考虑,但编程费时,调试和排错很不容易。微电子技术的飞速发展,使高性能微处理器和大容量存储器的价格变得十分便宜,速度和存储容量不再是困扰设计者的主要问题。人们将ROMBIOS和CRT显示器等外设加进这类专用系统,并尝试用高级语言来开发其软件,即把通用计算机上的软件和硬件“嵌入”专用系统,构成所谓的嵌入式系统(EmbeddedSystem)。由于C语言容易编程、代码紧凑、可移植性和可维护性好,因而被普遍用于嵌入式程序的设计。
       大多数嵌入式系统无操作系统支持,要由设计者提供所有低级I/O功能。系统I/O资源有限,程序必须固化在EPROM中,不能象在DOS下那样从磁盘装入和由用户编程。设计者要编写一个定位程序(Locator),把EXE格式的应用程序转换成可固化进EPROM的二进制文件(ROM图)。还要编写一个启动程序(runtimeStartupCode),与ROM图一起嵌入EPROM,先由它建立数据区和对系统硬件作必要初始化,然后调Main函数,执行应用程序。若想发挥C语言之优势,使用一些标准I/O语句,如用printf驱动显示器等,则要在嵌入式程序中加进经过修改的库函数。总之,C语言编程会使系统开发面临一 些新问题,要求设计人员具备软硬件方面的综合知识,才能正确进行系统调试和排错。
     当然,如果拥有专用的嵌入式系统开发工具,设计工作便要省劲些。它们通常配有定位程序和可供设计者修改的启动程序样板,有些还能通过串口或并口,在PC机上联机调试程序,甚至有源级代码调试功能。利用工控机来设计系统,事情就更简单。
       不过,专用开发工具和工控机价格昂贵,因此许多人在设计嵌入式系统时选择自己编写定位程序和启动程序,甚至编写可嵌入的I/O库函数。本文就嵌入式系统的程序设计方法及设计中可能遇到的问题作些讨论,供打算设计嵌入式程序的读者参考,有关......

阅读全文(4182) | 评论:0

UC/OS和UCLinux比较(2008-09-26 19:05:00)

摘要:uc/os和uclinux操作系统是两种性能优良源码公开且被广泛应用的的免费嵌入式操作系统,可以作为研究实时操作系统和非实时操作系统的典范。本文通过对c/os和uclinux的对比,分析和总结了嵌入式操作系统应用中的若干重要问题,  归纳了嵌入式系统开发中操作系统的选型依据。   两种开源嵌入式操作系统介绍   uc/os和uclinux操作系统,是当前得到广泛应用的两种免费且公开源码的嵌入式操作系统。uc/os适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2k。uclinux则是继承标准linux的优良特性,针对嵌入式处理器的特点设计的一种操作系统,具有内嵌网络协议、支持多种文件系统,开发者可利用标准linux先验知识等优势。其编译后目标文件可控制在几百k量级。     uc/os是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。     uclinux是一种优秀的嵌入式linux版本。uclinux是micro-conrol-linux的缩写。同标准linux相比,它集成了标准linux操作系统的稳定性、强大网络功能和出色的文件系统等主要优点。但是由于没有mmu(内存管理单元),其多任务的实  现需要一定技巧。     两种嵌入式操作系统主要性能比较      嵌入式操作系统是嵌入式系统软硬件资源的控制中心,它以尽量合理的有效方法组织多个用户共享嵌入式系统的各种资源。其中用户指的是系统程序之上的所有软件。所谓合理有效的方法,指的就是操作系统如何协调并充分利用硬件资源来实现多任务。复杂的操作系统都支持文件系统,方便组织文件并易于对其规范化操作。     嵌入式操作系统还有一个特点就是针对不同的平台,系统不是直接可用的,一般需要经过针对专门平台的移植操作系统才能正常工作。进程调度、文件系统支持和系统移植是在嵌入式操作系统实际应用中最常见的问题,下文就从这几个角度入手对uc/os和uclinux进行分析比较。      进程调度      任务调度主要是协调任务对计算机系统内资源(如内存、i/o设备、cpu)的争夺使用。进程调度又称为cpu调度,其根本任务是按照某种原则为处于就绪状态的进程分......

阅读全文(4329) | 评论:0

arm9和arm7的比较(2008-09-26 19:05:00)

摘要:新一代的ARM9处理器,通过全新的设计,采用了更多的晶体管,能够达到两倍以上于ARM7处理器的处理能力。这种处理能力的提高是通过增加时钟频率和减少指令执行周期实现的。 1 时钟频率的提高   ARM7处理器采用3级流水线,而ARM9采用5级流水线,如图1、2、3所示。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内同时有5个指令在执行。在同样的加工工艺下,ARM9TDMI处理器的时钟频率是ARM7TDMI的1.8~2.2倍。
2 指令周期的改进   指令周期的改进对于处理器性能的提高有很大的帮助。性能提高的幅度依赖于代码执行时指令的重叠,这实际上是程序本身的问题。对于采用最高级的语言,一般来说,性能的提高在30%左右。 2.1 loads 指令和 stores指令   指令周期数的改进最明显的是loads指令和stores指令。从ARM7到ARM9这两条指令的执行时间减少了30%。指令周期的减少是由于ARM7和ARM9两种处理器内的两个基本的微处理结构不同所造成的。 (1)ARM9有独立的指令和数据存储器接口,允许处理器同时进行取指和读写数据。这叫作改进型哈佛结构。而ARM7只有数据存储器接口,它同时用来取指令和数据访问。 (2)5级流水线引入了独立的存储器和写回流水线,分别用来访问存储器和将结果写回寄存器。 以上两点实现了一个周期完成loads指令和stores指令。
2.2 互锁(interlocks)技术  当指令需要的数据因为以前的指令没有执行完而没有准备好就会产生管道互锁。当管道互锁发生时,硬件会停止这个指令的执行,直到数据准备好为止。虽然这种技术会增加代码执行时间,但是为初期的设计者提供了巨大的方便。编译器以及汇编程序员可以通过重新设计代码的顺序或者其他方法来减少管道互锁的数量。 2.3 分枝指令 ARM9和ARM7的分枝指令周期是相同的。而且ARM9TDMI和ARM9E-S并没有对分枝指令进行预测处理。 附:哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和......

阅读全文(1977) | 评论:1

ARM9与ARM7的比较及优化(2008-09-26 19:04:00)

摘要:ARM9与ARM7的比较及优化

目前越来越多的嵌入式系统设计开始采用ARM9处理器。理解ARM9与ARM7的差别,以及如何针对ARM9进行系统优化,成为了一个令人关注的话题。本文通过对ARM9处理器的特点介绍,介绍针对ARM9处理器进行系统优化的一些有效方法。 随着更多应用在嵌入式系统中的实现,嵌入式系统设计向着更高级、更复杂的方向发展。作为32位结构体系中的翘楚,ARM在各种应用领域里得到了极其广泛的应用,成为目前国内电子设计领域里面的焦点之一(2005年一项针对国内嵌入式系统开发者的调查表明,有63%的工程师把ARM作为32位CPU的首选)。过去几年里,绝大部分ARM系统都是基于ARM7处理器,最近一年里,基于ARM9处理器的产品越来越多,研究ARM9的特点以及如何优化从ARM7到 ARM9的移植,成为很多嵌入式系统设计者所关注的热点问题。 我们惯称的ARM9系列中又存在ARM9与ARM9E两个系列,其中ARM9 属于ARM v4T架构,典型处理器如ARM9TDMI和ARM922T;而ARM9E属于ARM v5TE架构,典型处理器如ARM926EJ和ARM946E。因为后者的芯片数量和应用更为广泛,所以我们提到ARM9的时候更多地是特指ARM9E系列处理器(主要就是ARM926EJ和ARM946E这两款处理器)。下面关于ARM9的介绍也是更多地集中于ARM9E。 ARM7处理器和ARM9E处理器的流水线差别 对嵌入式系统设计者来说,硬件通常是第一考虑的因素。针对处理器来说,流水线则是硬件差别的最明显标志,不同的流水线设计会产生一系列硬件差异。让我们来比较一下ARM7和ARM9E的流水线,如图1。 可以看到ARM9E从ARM7的3级流水线增加到了5级,ARM9E的流水线中容纳了更多的逻辑操作,但是每一级的逻辑操作却变得更为简单。比如原来 ARM7的第三级流水,需要先内部读取寄存器、然后进行相关的逻辑和算术运算,接着处理结果回写,完成的动作非常复杂;而在ARM9E的5级流水中,寄存器读取、逻辑运算、结果回写分散在不同的流水当中,使得每一级流水处理的动作非常简洁。这就使得处理器的主频可以大幅度地提高。因为每一级流水都对应 CPU的一个时钟周期,如果一级流水中的逻辑过于复杂,使得执行时间居高不下,必然导致所需的时钟周期变长,造成CPU的主频不能提升。所以流......

阅读全文(1597) | 评论:1

嵌入式Linux下ARM处理器与DSP的数据通信(2)(2008-09-22 22:23:00)

摘要:4.3 驱动程序的系统调用接口

为对处于总线地址0x4000_0000的DSP板进行操作,首先应用open打开设备,该设备可以通过mknod建立(本例建立的是/dev/hpi)。然后mmap完成映射。
Int dev_hpi_open(str_HPI *ss)
{size_t length=1024;
int i;
if((*ss).hpi_number==0)
{
(*ss).hpi_fd=open(/dev/hpi,O_RDWR);
}
if((*ss).hpi_fd==-1)return -1;
(*ss).hpi_mmap_start =mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,((*ss).hpi_fd),0); //获得映射区内存的起始地址
return 0;
} //dev_hpi_open
mmap的作用是将文件内容映射到内存中。函数的原形及各参数定义如下:

*mmap(void *start,size_length,int prot,int flags,intfd,off_t offset)
start指向欲对应的内存地址,size-length的含义是要映射的量;prot代表映射区域的保护方式;flag会影响映射区域的各种特性;fd为文件描述符;offtoffset代表文件的偏移量,通常设置为零。

示例程序中的结构体变量ss用来总知各种变量。通过mmap可以获得映射后的内存地址,用(*ss).hpi_mmap_start表示。

一旦获得了这个起始地址,就能对0x4000_0000起始的总线地址进行操作,因为映射已经完成,对(*ss).hpi_mmap_start的操作就是对0x4000_0000起始的总线地址进行操作,而DSP板HPI接口的控制线正是在这个位置。这样就实现了物理地址和用户空间的转换。

4.4 用户程序接口部分

下面以HPI接口读写中最复杂的自增读方式用户程序为例说明用户接口程序的设计过程。要完成自增读的操作,对于HPI一侧,假设采用软件握手的方式。要完成的工作如下:

首先读HPIC以查询其中的HRDY位......

阅读全文(1875) | 评论:1

嵌入式Linux下ARM处理器与DSP的数据通信(1)(2008-09-22 22:23:00)

摘要:1 引言

基于ARM核心处理器的嵌入式系统以其自身资源丰富、功耗低、价格低廉、支持厂商众多的缘故,越来越多地应用在各种需要复杂控制和通信功能的嵌入式系统中。

内核源码开放的Linux与ARM体系处理器相结合,可以发挥Linux系统支持各种协议及存在多进程调度机制的优点,从而使开发周期缩短,扩展性增强。作为数字处理专用电路,DSP的数字信号处理能力十分强大,但对诸如任务管理、通信、人机交互等功能的实现较为困难。

如果将这三者结合起来,即由DSP结合采样电路采集并处理信号,由ARM处理器作为平台,运行Linux操作系统,将经过DSP运算的结果发送给用户程序进行进一步处理,然后提供给图形化友好的人机交互环境完成数据分析和网络传输等功能,就会最大限度的发挥三者所长。


  
2 系统结构

该系统硬件由二部分组成,其中一部分为若干块DSP板,各自独立承接数据采集和信号处理。另一部分为以ARM为核心处理器的CPU板。系统硬件框图如图1所示(仅接口部分)。
  
3 接口硬件部分设计

3.1 HPI接口简介

HPI接口是TI公司新一代、高性能DSP上用以完成与主机或其他DSP之间数据交换的接口,这里主要介绍实际电路中使用的控制引脚和时序。
HCNTL0和HCNTL1为访问控制选择。用来确定主机(ARM)究竟对TMS320C6711中的哪一个HPI寄存器进行处理。具体功能如表1所列。



HHWIL:半字节定义选择,与HPIC寄存器中的HWOB位进行配合可以选择当前传输的是高半字还是低半字。低电平是第一个半字,高电平是第二个半字。

HCS:选通脉冲(Strobe),与HDS1、HDS2相互配合完成内部信号HSTROBE的生成。逻辑关系如图2所示。

将HDS1、HDS2分别固定为高电平和低电平,这样HCS就和HSTROBE完全一致。
HSTROBE读时序如图3所示。

3.2 接口电路

ARM处理器通过DSP的HPI接口与DSP进行连接的硬件原理如图4所示(以单板DSP为例)。其中SN74LVTH16245为16位(二个8位)双向三态总线收发器,主要起总线驱动和方向控制的作......

阅读全文(1981) | 评论:3

DSP与单片机通信的多种方案设计(2008-09-22 22:22:00)

摘要:基于嵌入式系统发展的需要,提出TMS320VC5402 DSP与AT89C51单片机通信的三种设计方案。利用TMS320VC5402的多通道缓冲串口MCBSP分别实现TMS320VC5402与AT89C51的SCI和SPI串行通信,以及通过TMS320VC5402的8位增强主机接口HPI一8实现TMS320VC5402与AT89C5l并行通信。就硬件接口电路和软件编程进行详细的阐述。

将DSP和单片机构成双CPU处理器平台,可以充分利用DSP对大容量数据和复杂算法的处理能力,以及单片机接口的控制能力。而DSP与单片机之间快速正确的通信是构建双CPU处理器的关键问题。下面就此问题分别设计串行SCI、SPI和并行HPI三种连接方式。

1 串行通信设计与实现

1 1 SCI串行通信设计

1.1.1 多通道缓冲串行口McBSP原理

TMS320VC5402(简称VC5402)提供了2个支持高速、全双工、带缓冲、多种数据格式等优点的多通道缓冲串行口McBSP。MCESP分为数据通路和控制通路。①数据通路负责完成数据的收发。CPU或DMAC能够向数据发送寄存器DXR写入数据,DXR中的数据通过发送移位寄存器XSR输出到DX引脚。DR引脚接收数据到接收移位寄存器RSR,再复制到接收缓冲寄存器RBR,最后复制到数据接收寄存器DRR。这两种数据多级缓冲方式使得数据搬移和片外数据通信能够同时进行。②控制通路负责内部时钟产生,帧同步信号产生,信号控制和多通道选择。另外.还具有向CPU发送中断信号和向DMAC发送同步事件的功能。MCBSP时钟和帧同步信号通过CLKR、CLKX、FXR、FSX引脚进行控制,接收器和发送器可以相互独立地选择外部时钟和帧同步信号,也可以选择由内部采样率发生器产生时钟和帧同步信号。帧同步脉冲有效表示传输的开始。

1.1.2 SCI串行接口设计

设置VC5402的McRSP输出时钟和帧同步信号由内部采样率发生器产生,内部数据时钟CLKG和帧同步信号FSG驱动发送时钟CLKX和帧同步FSX(CLKXM=l,FSXM=l,FSGM=1),输入时钟也由内部采样率发生器产生,内部数据时钟CLKG驱动接收时钟CLKR(CLKRM=1),同时由CPU时钟驱动采样率发生器......

阅读全文(1407) | 评论:0

唐僧与婚介所大妈精彩"斗嘴"经过(zt)(2008-09-17 21:12:00)

摘要:唐僧与婚介所大妈精彩"斗嘴"经过 
 
猪八戒背着媳妇来看望师父,唐僧瞅见徒弟和老婆卿卿我我,甚是嫉妒,于是去婚介所相亲,婚介所大妈接待了他。 
    
    婚介:姓名? 
    
    唐僧:唐僧,三藏,也可以叫我小唐,玄奘。 
    
    婚介:到底叫什么? 
    
    唐僧:TOM。 
    
    婚介:年龄? 
    
    唐僧:不大。 
    
    婚介:不大?哪一年生的? 
    
    唐僧:唐朝。 
    
    婚介:职业? 
    
    唐僧:化缘。 
    
    婚介:什么叫化缘? 
    
    唐僧:就是要饭。 
    
    婚介:有住房吗? 
    
    唐僧:没有。 
    
    婚介:那你住哪? 
    
    唐僧:天上。 
    
    婚介:有交通工具吗? 
    
    唐僧:有。 
    
    婚介:什么类型的? 
    
    唐僧:白马。 
    
    婚介:之前有过女朋友吗? 
    
    唐僧:有。 
    
    婚介:都是做什么的? 
    
    唐僧:白骨精,蜘蛛精,牛魔王……
    
    婚介:你玩的挺深啊! 
    
    唐僧:那都是逢场作戏,感情破裂了。 
    
    婚介:为什么分手呢? 
    
    唐僧:他们都想吃我的肉。 
    
    婚介:对择偶有什么要求吗? 
    
    唐僧:首先要不喜欢吃肉。 
    
    婚介:那尼姑好不好? 
    
    唐僧:不好,本是同根生,相煎何太急。 
    
    婚介:那观音好不好? 
    
    唐僧:不好,观音是我顶头上司,我不想发生办公室恋情......

阅读全文(4649) | 评论:1