最新日志

发表于:2008-7-6 10:11:08
标签:无标签

0

ARM发布适于高性能、低成本应用的Cortex-M3处理器

  ARM在美国加利福尼亚州圣塔克莱拉市召开的第一届ARM开发者年会上发布了ARM Cortex-M3处理器。该处理器尤为适用于高性能、极其低成本需求的嵌入式应用,如:微控制器、汽车系统、大型家用电器、网络装置等。
该处理器是首个新的ARM Cortex系列CPU内核,强调了ARM为目标应用市场提供所需性能的战略。ARM Cortex系列使芯片制造商和OEM厂商能围绕某一体系结构标准化其产品,从低端的微控制器到高性能的应用处理器运用Thumb-2技术,大大降低了研发成本,提高企业效率。
 
  ARM Cortex-M3处理器结合了多种突破性技术,令芯片供应商提供超低费用的芯片,仅33000门的内核性能可达1.2DMIPS/MHz。该处理器还集成了许多紧耦合系统外设,令系统能满足下一代产品的控制需求。
 
  ARM Cortex-M3处理器是ARM首次针对低成本应用提供技术,这些应用的内存和内核面积都会直接影响装置的成本,如:微控制器、汽车市场。目前,微控制器市场约为25亿美元,均传统地采用8位和16位产品,但随着用户需求的提高,市场对性能的需求也随之大大提高,同时价格因素促使多个应用综合到一个产品。ARM Cortex-M3处理器结合多种技术,减少使用内存,并在极小的RISC内核上提供业界领先的功耗和性能,为全球成千上万的应用由以往的代码向32位微控制器的快速移植提供了理想的平台。
 
  Gartner公司研发副总裁Tom  Starnes先生表示:“32位微控制器在过去的五年中发展迅速,至2003年营业额增加了三倍,达24亿美元。在未来的五年间,市场还将增长一倍。”
 
  此外,ARM Cortex-M3处理器大大减少了内存的使用,为ARM的半导体合作伙伴和用户降低更多成本。ARM Cortex-M3处理器是使用最少门数的ARM CPU,相较于过去的设计大大减少了芯片面积,可减小装置的体积或采用更低成本的工艺进行生产。此外,基本系统外设的高度集成化最佳地使用了芯片空间。ARM Cortex-M3处理器还推出了新的单线调试技术,避免使用多管脚进行JTAG调试,为费用敏感的应用大大节约成本。
 
  ARM公司市场执行副总裁Mike  Inglis先生说:“ARM Cortex-M3处理器极大地拓展了ARM体系结构,进一步实现了我们为数字世界提供处理器技术方案的目标。我们向合作伙伴提供高性能、低成本的技术,令合作伙伴能快速地为大量的汽车和微控制器市场提供极具竞争优势的产品,并加速代码移植。”
 
  明导(Mentor Graphics)嵌入式系统部门加速技术市场总监Robert Day先生说:“加速技术很欢迎ARM Cortex-M3处理器技术的到来,新的处理器为众多设计者提供了向32位平台移植、开发实时应用的方案。结合使用Nucleus实时操作系统和加载了中间件的Cortex-M3处理器将为设计者提供进入32位世界最为完整的高性能技术方案。”
 
  Express Logic公司总裁William E. Lamie先生表示:“ARM Cortex-M3处理器提供高性能、中断处理、低成本体系结构,是开发深层嵌入式实时应用的理想平台。为了帮助设计者运用这些卓越的性能,Express Logic公司已表示在通用版本的Cortex-M3处理器上移植我们最受欢迎的ThreadX?实时操作系统, NetX TCP/IP堆栈和FileX文件系统。”
 
  ARM Cortex-M3处理器紧凑地结合了执行Thumb-2指令的高效32位哈佛微体系结构和系统外设,包括Nested Vectored Interrupt Controller和Arbiter总线。该技术方案在测试和实例应用中都体现了卓越的性能,台积电180纳米工艺下,芯片性能达1.2DMIPS/MHz,时钟频率高达100兆赫。ARM Cortex-M3还实现了Tail-Chaining?中断技术,该技术是一项完全基于硬件的中断处理技术,最多可减少12个时钟周期数,在实际应用中可减少70%中断。此外,ARM Cortex-M3处理器的性能还提高了60%,面积减小了33%,与同类处理器相比功耗降低了75%。RealView编译器和RealView调试产品都支持ARM Cortex-M3处理器,提高了调试性能,如:单线调试和优化的系统可视性。
 
  ARM首席执行官Warren East先生强调了公司的战略方针:拓展处理器系列,继续提高体系结构的创新性。ARM Cortex系列处理器的推出为合作伙伴提供了适用于特殊应用的多种性能的优化技术方案。
 
  依据市场的不同需求,ARM Cortex处理器分三个系列,均执行Thumb-2指令集,分别如下:
 
  ARM Cortex-A系列:用于复杂操作系统和用户应用软件的应用处理器;ARM Cortex-R系列:用于实时系统的嵌入式处理器;ARM Cortex-M系列;用于微控制器和低成本应用优化的深层嵌入式处理器。
 
  ARM公司产品市场总监John Cornish先生称:“我们的半导体合作伙伴希望获得适用于整个数字产品领域的革新而稳固的体系结构,降低成本,为每种应用提供更高的性能。新的Cortex系列战略令我们为特殊应用提供更符合需求的内核产品,如:微控制器市场。新的ARM Cortex-M3技术向这些领域提供了低成本、卓越的32位性能,使我们的合作伙伴能生产极富竞争力的装置。”
 
  ARM Cortex系列处理器基于新一代ARM体系结构,支持包含16位和32位指令的Thumb-2技术,提供了最佳的编码方式和性能。Thumb-2技术较纯32位编码技术减少使用26%内存,降低系统费用,同时较16位编码,性能提高了25%,通过降低时钟速度,令设计者提供更低的功耗。
 
  Embedded Trace Macrocell (ETM)技术现为ARM Cortex-M3处理器中的可选授权。2005年第三季度,ARM的合作伙伴将可获得与RealView开发工具兼容的模块和可综合RTL。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(35)
发表于:2008-6-28 11:59:20
标签:无标签

0

C++结构体对齐

 

#include<stdio.h>
struct a
{
char no[10];
int p;
long int pp;
unsigned int ppp;
char x;
float y;
double h;
}xy;
void main()
{
printf("struct a: %d \n",sizeof(struct a)); // 不是等于 35 吗??? 为什么等于 40 啦?
}

结构体的sizeof
这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体:
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;
};
看看sizeof(S2)的结果为多少,怎么还是8再看看内存,原来成员c后面仍然有3个填充字节,这又是为什么啊别着急,下面总结规律。

字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

对于上面的准则,有几点需要说明:
1) 前面不是说结构体成员的地址是其大小的整数倍,怎么又说到偏移量了呢因为有了第1点存在,所以我们就可以只考虑成员的偏移量,这样思考起来简单。想想为什么。

结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏也在stddef.h中定义,如下:
#define offsetof(s,m) (size_t)&(((s *)0)->m)
例如,想要获得S2中c的偏移量,方法为
size_t pos = offsetof(S2, c);// pos等于4

2) 基本类型是指前面提到的像char、short、int、float、double这样的内置数据类型,这里所说的“数据宽度”就是指其sizeof的大小。由于结构体的成员可以是复合类型,比如另外一个结构体,所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。
这里叙述起来有点拗口,思考起来也有点挠头,还是让我们看看例子吧(具体数值仍以VC6为例,以后不再说明):
struct S3
{
char c1;
S1 s;
char c2;
};
S1的最宽简单成员的类型为int,S3在考虑最宽简单类型成员时是将S1“打散”看的,所以S3的最宽简单类型为int,这样,通过S3定义的变量,其存储空间首地址需要被4整除,整个sizeof(S3)的值也应该被4整除。
c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。最后得到sizeof(S3)的值为16。

通过上面的叙述,我们可以得到一个公式:
结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目,即:

sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )

到这里,朋友们应该对结构体的sizeof有了一个全新的认识,但不要高兴得太早,有一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令。它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关。#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么
该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,
公式如下:
offsetof( item ) = min( n, sizeof( item ) )
再看示例:
#pragma pack(push) // 将当前pack设置压栈保存
#pragma pack(2) // 必须在结构体定义之前使用
struct S1
{
char c;
int i;
};
struct S3
{
char c1;
S1 s;
char c2;
};
#pragma pack(pop) // 恢复先前的pack设置
计算sizeof(S1)时,min(2, sizeof(i))的值为2,所以i的偏移量为2,加上sizeof(i)等于6,能够被2整除,所以整个S1的大小为6。
同样,对于sizeof(S3),s的偏移量为2,c2的偏移量为8,加上sizeof(c2)等于9,不能被2整除,添加一个填充字节,所以sizeof(S3)等于10。

现在,朋友们可以轻松的出一口气了,:)
还有一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。如下:
struct S5 { };
sizeof( S5 ); // 结果为1

点击此处查看原文 >>

系统分类: 接口电路   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(53)
发表于:2008-6-27 0:14:09
标签:无标签

0

VC++ 笔记

1,改变单文档主窗口标题文字,在View::OnDraw(CDC* pDC)中加 AfxGetMainWnd()- > SetWindowText( "三相表调试软件 ");如果改变对话框标题在::OnInitDialog()  加 SetWindowText("三相表校准"); 

2,CList 和 CArray的区别Array采用队列方式存储数据,因而其内部数据元素是以物理方式顺序排列的,所以检索、顺序执行GetAt()等函数的速度是相当快的。但是由于每次队列长度变化后,数据都要重新申请内存、拷贝内存、释放内存,因而Insert/Add/RemoveAt()的速度都很慢。如果你使用的数据元素尺寸相当大,而且数组的操作相当复杂,频繁使用InsertAt/SetAt/RemoveAt等,应该考虑使用CList来代替。但是如果考虑Array中存储指针而不是数据本身,效率也可以接受。  
   
  List采用链表方式存储数据,因而当链表数据有所变动时,只做了一下指向变动,所以即使数据元素非常多单个数据元素也很大,执行Insert/Add/Remove的速度都很快,但是因为没有统一的Index,因而如果要找到某个元素只有遍历整个链表。整体上说,List的使用比较繁琐,特别为小尺寸数据设计List更是得不偿失的,这也是为什么有CWordArray而没有CWordList的原因,因而在大多数情况下应该有限考虑是否可以使用Array来存储数据。  

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(168)
发表于:2008-6-14 23:31:11
标签:无标签

0

ADC 的INL,DNL

说精度之前,首先要说分辨率。最近已经有贴子热门讨论了这个问题,结论是分辨率决不等同于精度。比如一块精度0.2%(或常说的准确度0.2级)的四位半万用表,测得A点电压1.0000V,B电压1.0005V,可以分辨出B比A高0.0005V,但A点电压的真实值可能在0.9980~1.0020之间不确定。

   那么,既然数字万用表存在着精度和分辨率两个指标,那么,对于ADC和DAC,除了分辨率以外,也存在精度的指标。
   模数器件的精度指标是用积分非线性度(Interger NonLiner)即INL值来表示。也有的器件手册用 Linearity error 来表示。他表示了ADC器件在所有的数值点上对应的模拟值,和真实值之间误差最大的那一点的误差值。也就是,输出数值偏离线性最大的距离。单位是LSB(即最低位所表示的量)。
   比如12位ADC:TLC2543,INL值为1LSB。那么,如果基准4.095V,测某电压得的转换结果是1000,那么,真实电压值可能分布在0.999~1.001V之间。对于DAC也是类似的。比如DAC7512,INL值为8LSB,那么,如果基准4.095V,给定数字量1000,那么输出电压可能是0.992~1.008V之间。

   下面再说DNL值。理论上说,模数器件相邻量个数据之间,模拟量的差值都是一样的。就相一把疏密均匀的尺子。但实际并不如此。一把分辨率1毫米的尺子,相邻两刻度之间也不可能都是1毫米整。那么,ADC相邻两刻度之间最大的差异就叫差分非线性值(Differencial NonLiner)。DNL值如果大于1,那么这个ADC甚至不能保证是单调的,输入电压增大,在某个点数值反而会减小。这种现象在SAR(逐位比较)型ADC中很常见。
   举个例子,某12位ADC,INL=8LSB,DNL=3LSB(性能比较差),基准4.095V,测A电压读数1000,测B电压度数1200。那么,可判断B点电压比A点高197~203mV。而不是准确的200mV。对于DAC也是一样的,某DAC的DNL值3LSB。那么,如果数字量增加200,实际电压增加量可能在197~203mV之间。


   很多分辨率相同的ADC,价格却相差很多。除了速度、温度等级等原因之外,就是INL、DNL这两个值的差异了。比如AD574,贵得很,但它的INL值就能做到0.5LSB,这在SAR型ADC中已经很不容易了。换个便宜的2543吧,速度和分辨率都一样,但INL值只有1~1.5LSB,精度下降了3倍。

   另外,工艺和原理也决定了精度。比如SAR型ADC,由于采用了R-2R或C-2C型结构,使得高权值电阻的一点点误差,将造成末位好几位的误差。在SAR型ADC的2^n点附近,比如128、1024、2048、切换权值点阻,误差是最大的。1024值对应的电压甚至可能会比1023值对应电压要小。这就是很多SAR型器件DNL值会超过1的原因。但SAR型ADC的INL值都很小,因为权值电阻的误差不会累加。
   和SAR型器件完全相反的是阶梯电阻型模数/数模器件。比如TLC5510、DAC7512等低价模数器件。比如7512,它由4095个电阻串联而成。每个点阻都会有误差,一般电阻误差5%左右,当然不会离谱到100%,更不可能出现负数。因此这类器件的DNL值都很小,保证单调。但是,每个电阻的误差,串联后会累加,因此INL值很大,线性度差。

   这里要提一下双积分ADC,它的原理就能保证线性。比如ICL7135,它在40000字的量程内,能做到0.5LSB的INL值(线性度达到1/80000 !!)和0.01LSB的DNL值.这两个指标在7135的10倍价钱内,是不容易被其他模数器件超越的。所以7135这一类双积分ADC特别适合用在数字电压表等需要线性误差非常小的场合。

   还要特别提一下基准源。基准源是测量精度的重要保证。基准的关键指标是温飘,一般用ppm/K来表示。假设某基准30ppm/K,系统在20~70度之间工作,温度跨度50度,那么,会引起基准电压30*50=1500ppm的漂移,从而带来0.15%的误差。温漂越小的基准源越贵,比如30ppm/K的431,七毛钱;20ppm/K的385,1块5;10ppm/K的MC1403,4块5;1ppm/K的LM399,14元;0.5ppm/K的LM199,130元。
   该死的教科书害了一代学生。说起来好笑的一个现象:我这边新来的学生大多第一次设计ADC电路的时候,基准直接连VCC,还理直气壮的找来N本教科书,书上的基准写了个网标:+5V。天下的书互相抄,也就所有的学校的教科书都是基准接5V。教科书把5V改成5.000V多好?学生就会知道,这个5V不是VCC。或者提一下基准需要高稳定度,也好啊!  

点击此处查看原文 >>

系统分类: 模拟技术   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(126)
发表于:2008-6-14 12:50:15
标签:无标签

0

C++串口API应用

/***********************************************************************************************
          initialSerial
功能:串口初始化

参数:无

返回:无

***********************************************************************************************/

void initialSerial()   //串口初始化
{
 char szComParams[50];
 DCB dcb;
 char *m_com; char *m_baud; char *m_jiaoyan;
    m_com="Com1";
 m_baud="1200";
 m_jiaoyan="E";

 COMMTIMEOUTS CommTimeOuts;
 m_hIDComDev = NULL;
 m_hIDComDev = CreateFile(m_com, GENERIC_READ|GENERIC_WRITE, 0, NULL, 
         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  //打开串口

 if(m_hIDComDev==INVALID_HANDLE_VALUE)
 {
  AfxMessageBox("打开串口错误0,请检查!");
  goto endd;
 }
 if(m_hIDComDev ==(HANDLE) -1)
 {
  AfxMessageBox("打开串口错误,请检查!");
  goto endd;
 }

 SetCommTimeouts(m_hIDComDev, &CommTimeOuts);  //串口超时配置
 CommTimeOuts. ReadIntervalTimeout="0xFFFFFFFF";
 CommTimeOuts. ReadTotalTimeoutMultiplier = 0;
 CommTimeOuts. ReadTotalTimeoutConstant =5000;
 CommTimeOuts. WriteTotalTimeoutMultiplier = 0;
 CommTimeOuts. WriteTotalTimeoutConstant = 5000;
 PurgeComm(m_hIDComDev, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR ) ;
 m_com="Com1:38400,E,8,1";
 wsprintf(szComParams, m_com);   //设置串口参数

 dcb. DCBlength = sizeof(DCB);
 GetCommState(m_hIDComDev, &dcb);//

 int baud;
 baud = atoi(m_baud);
 dcb. BaudRate = baud;   //设置波特率 
 dcb. ByteSize= 8; //设置校验字节

 if ((!SetCommState(m_hIDComDev, &dcb))||(!SetupComm(m_hIDComDev,10000,10000)))//设置串口和收发缓冲器的大小
    {
  DWORD dwError = GetLastError();
  CloseHandle(m_hIDComDev);
 }
 PurgeComm(m_hIDComDev,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_TXABORT|PURGE_RXABORT);//清收发缓冲器
endd:
;
}
/************************************************************************************************
           SendData
功能:发送数据给串口

参数: buff发送的数据
  send_length   长度

返回:  成功 1  失败  0


************************************************************************************************/
DWORD SendData( unsigned char buff[],int send_length)    //发送数据
{  
 int t;
 DWORD dwBytesWritten;
 if(!WriteFile(m_hIDComDev,buff,send_length,&dwBytesWritten,NULL))
 {
  return 0;
 }
 for (t=0;t  fprintf(stdout," %2X ",buff[t]);
    printf("\n");
 PurgeComm(m_hIDComDev,PURGE_TXCLEAR); //清发送缓冲区
    return 1;
}
/***********************************************************************************************
          ReadData
功能:从串口读取数据

参数:rebuff  收到的数据  dwBytesRead   要收到的长度    delay   延时


***********************************************************************************************/
DWORD ReadData(unsigned char rebuff [],DWORD dwBytesRead )  //读取数据
{
 DWORD dwErrorFlags;
 COMSTAT stat;
 if(delay>0)                                                                                   
  ClearCommError(m_hIDComDev,&dwErrorFlags,&stat); 
 if(stat.cbInQue <= 0)  //"stat.cbInQue" is  bytes in input buffer
  return 0;
 dwBytesRead = min(dwBytesRead,(DWORD)stat.cbInQue); //获取字符个数
 
 if(!ReadFile(m_hIDComDev,rebuff,dwBytesRead,&dwBytesRead,NULL))  //整体读入
 {
  
  return 0;
 }
 return dwBytesRead;
}
下面三个函数中所用到结构本OR函数

COMMTIMEOUTS

The COMMTIMEOUTS structure is used in the SetCommTimeouts and GetCommTimeouts functions to set and query the time-out parameters for a communications device. The parameters determine the behavior of ReadFile, WriteFile, ReadFileEx, and WriteFileEx operations on the device.

typedef struct _COMMTIMEOUTS {  
    DWORD ReadIntervalTimeout; 
    DWORD ReadTotalTimeoutMultiplier; 
    DWORD ReadTotalTimeoutConstant; 
    DWORD WriteTotalTimeoutMultiplier; 
    DWORD WriteTotalTimeoutConstant; 
} COMMTIMEOUTS,*LPCOMMTIMEOUTS; 
 

Members

ReadIntervalTimeout
Specifies the maximum time, in milliseconds, allowed to elapse between the arrival of two characters on the communications line. During a ReadFile operation, the time period begins when the first character is received. If the interval between the arrival of any two characters exceeds this amount, the ReadFile operation is completed and any buffered data is returned. A value of zero indicates that interval time-outs are not used.

A value of MAXDWORD, combined with zero values for both the ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies that the read operation is to return immediately with the characters that have already been received, even if no characters have been received.

ReadTotalTimeoutMultiplier
Specifies the multiplier, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is multiplied by the requested number of bytes to be read.
ReadTotalTimeoutConstant
Specifies the constant, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is added to the product of the ReadTotalTimeoutMultiplier member and the requested number of bytes.

A value of zero for both the ReadTotalTimeoutMultiplier and ReadTotalTimeoutConstant members indicates that total time-outs are not used for read operations.

WriteTotalTimeoutMultiplier
Specifies the multiplier, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is multiplied by the number of bytes to be written.
WriteTotalTimeoutConstant
Specifies the constant, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is added to the product of the WriteTotalTimeoutMultiplier member and the number of bytes to be written.

A value of zero for both the WriteTotalTimeoutMultiplier and WriteTotalTimeoutConstant members indicates that total time-outs are not used for write operations.

PurgeComm

The PurgeComm function can discard all characters from the output or input buffer of a specified communications resource. It can also terminate pending read or write operations on the resource.

BOOL PurgeComm(
  HANDLE hFile,  // handle to communications resource
  DWORD dwFlags  // action to perform
);
 

Parameters

hFile
Handle to the communications resource. The CreateFile function returns this handle.
dwFlags
Specifies the action to take. This parameter can be a combination of the following values:
Value Meaning
PURGE_TXABORT Terminates all outstanding overlapped write operations and returns immediately, even if the write operations have not been completed.
PURGE_RXABORT Terminates all outstanding overlapped read operations and returns immediately, even if the read operations have not been completed.
PURGE_TXCLEAR Clears the output buffer (if the device driver has one).
PURGE_RXCLEAR Clears the input buffer (if the device driver has one).

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

GetCommState

The GetCommState function fills in a device-control block (a DCB structure) with the current control settings for a specified communications device.

BOOL GetCommState(
  HANDLE hFile,  // handle to communications device
  LPDCB lpDCB    // pointer to device-control block structure
);
 

Parameters

hFile
Handle to the communications device. The CreateFile function returns this handle.
lpDCB
Pointer to the DCB structure in which the control settings information is returned.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

SetCommState

The SetCommState function configures a communications device according to the specifications in a device-control block (a DCB structure). The function reinitializes all hardware and control settings, but it does not empty output or input queues.

BOOL SetCommState(
  HANDLE hFile,  // handle to communications device
  LPDCB lpDCB    // pointer to device-control block structure
);
 

Parameters

hFile
Handle to the communications device. The CreateFile function returns this handle.
lpDCB
Pointer to a DCB structure containing the configuration information for the specified communications device.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

SetupComm

The SetupComm function initializes the communications parameters for a specified communications device.

BOOL SetupComm(
  HANDLE hFile,     // handle to communications device
  DWORD dwInQueue,  // size of input buffer
  DWORD dwOutQueue  // size of output buffer
);
 

Parameters

hFile
Handle to the communications device. The CreateFile function returns this handle.
dwInQueue
Specifies the recommended size, in bytes, of the device's internal input buffer.
dwOutQueue
Specifies the recommended size, in bytes, of the device's internal output buffer.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

PurgeComm

The PurgeComm function can discard all characters from the output or input buffer of a specified communications resource. It can also terminate pending read or write operations on the resource.

BOOL PurgeComm(
  HANDLE hFile,  // handle to communications resource
  DWORD dwFlags  // action to perform
);
 

Parameters

hFile
Handle to the communications resource. The CreateFile function returns this handle.
dwFlags
Specifies the action to take. This parameter can be a combination of the following values:
Value Meaning
PURGE_TXABORT Terminates all outstanding overlapped write operations and returns immediately, even if the write operations have not been completed.
PURGE_RXABORT Terminates all outstanding overlapped read operations and returns immediately, even if the read operations have not been completed.
PURGE_TXCLEAR Clears the output buffer (if the device driver has one).
PURGE_RXCLEAR Clears the input buffer (if the device driver has one).

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

COMSTAT

The COMSTAT structure contains information about a communications device. This structure is filled by the ClearCommError function.

typedef struct _COMSTAT { 
    DWORD fCtsHold : 1;   // Tx waiting for CTS signal 
    DWORD fDsrHold : 1;   // Tx waiting for DSR signal 
    DWORD fRlsdHold : 1;  // Tx waiting for RLSD signal 
    DWORD fXoffHold : 1;  // Tx waiting, XOFF char received 
    DWORD fXoffSent : 1;  // Tx waiting, XOFF char sent 
    DWORD fEof : 1;       // EOF character sent 
    DWORD fTxim : 1;      // character waiting for Tx 
    DWORD fReserved : 25; // reserved 
    DWORD cbInQue;        // bytes in input buffer 
    DWORD cbOutQue;       // bytes in output buffer 
} COMSTAT, *LPCOMSTAT; 
 

Members

fCtsHold
Specifies whether transmission is waiting for the CTS (clear-to-send) signal to be sent. If this member is TRUE, transmission is waiting.
fDsrHold
Specifies whether transmission is waiting for the DSR (data-set-ready) signal to be sent. If this member is TRUE, transmission is waiting.
fRlsdHold
Specifies whether transmission is waiting for the RLSD (receive-line-signal-detect) signal to be sent. If this member is TRUE, transmission is waiting.
fXoffHold
Specifies whether transmission is waiting because the XOFF character was received. If this member is TRUE, transmission is waiting.
fXoffSent
Specifies whether transmission is waiting because the XOFF character was transmitted. If this member is TRUE, transmission is waiting. Transmission halts when the XOFF character is transmitted to a system that takes the next character as XON, regardless of the actual character.
fEof
Specifies whether the end-of-file (EOF) character has been received. If this member is TRUE, the EOF character has been received.
fTxim
If this member is TRUE, there is a character queued for transmission that has come to the communications device by way of the TransmitCommChar function. The communications device transmits such a character ahead of other characters in the device's output buffer.
fReserved
Reserved; do not use.
cbInQue
Specifies the number of bytes received by the serial provider but not yet read by a ReadFile operation.
cbOutQue
Specifies the number of bytes of user data remaining to be transmitted for all write operations. This value will be zero for a nonoverlapped write.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 整理

评论(0) | 阅读(96)
发表于:2008-6-13 9:33:29
标签:无标签

0

在多费率电表中实现灵活的费率管理

在多费率电表中实现灵活的费率管理

电力公司采用分时电价体系,以鼓励人们在用电高峰时节约用电。这些不同的电价时段称为费率时段,这种计费方法称为灵活的费率管理方法。本电表参考设计采用了MAXQ3120微控制器,能够满足多费率电表的各种要求,甚至能够提供更加灵活的用电监测功能。

电力公司鼓励人们在用电高峰时期节约用电的唯一手段是采取分时电价措施。确切地说,就是在用电高峰时段提高电价,在用电低谷时段降低电价。这些不同的电价时段被称为费率时段,这种计费方法称为灵活的费率管理方法。

多费率电表对于实现灵活的费率管理非常重要。实际上,采用多费率电表的目的就是:跟踪不同费率时段的用电量,维护多个电能累加器,而每个累加器都有自己的寄存器。因此,多费率电表是电力公司实施分时电价的最佳手段。 能够支持分时电价的电表与传统电表存在以下几方面的差异:

多费率电表必须含有精确的日历时钟,从而知道什么时候停止一个费率寄存器的累加操作,转而启用另一个费率寄存器累加操作。

简单的机械式计数器根本无法满足多费率电表的显示要求。需要采用某种电子显示方式,能够独立显示每个费率寄存器的内容。

从电表中读取单个用电量数据已无法满足实际需要。在单费率电表中,从当前读数中减去以前的累积读数,即得到最近一段时期内的用电总量。多费率电表监测多个不同的费率时段,必须将这些不同时段的用电量传送给收费部门。必须采用自动抄表技术才能满足后一种要求。

MAXQ3120参考设计构建的电表能够满足多费率电表的所有要求,还能够为用电监测提供更加灵活的功能。

时段机制

点击看大图
一年中的每一天都由一个日时段表来控制。在一天当中,按照日时段表的规定,将不同时段的用电量分别累积至对应的费率寄存器。在上面的时段表中,费率2 (Tariff 2)对应用电高峰的资费。上午5:30到下午6:00消耗的电能被记录在Tariff 2中(计费价格大概要高一些)。下午6:00到晚上10:00消耗的电能被累积在Tariff 3中,属于正常费率。最后,晚上10:00到早上5:30的用电量被累积至用电低谷费率寄存器,一般费率较低。通过这种方式,鼓励用户在用电高峰时期节约用电,从而可敦促用户将大功率设备的运转时段推向非高峰时期。

可以在全年范围内修改用于定义费率时段的日时段表,并且周末和假期时段表具有更高优先级。在这个例子中,5月份突出显示的1天由日时段表5 (Day Schedule 5)控制。除了周末和假期以外,将一直采用Day Schedule 5,直到7月中旬Day Schedule 3生效为止。

平日按日历时段表来处理,那么周末呢?参考设计中电表的设置指定了一周的某几天为“周末”,采用单独的日时段表替代普通的日时段表。假期采用单独的日时段表,替代普通的日时段表和周末时段表。

采用这些手段,电力公司可以建立一套标准,自动实施灵活的价格政策。

点击此处查看原文 >>

系统分类: 消费电子   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(116)
发表于:2008-6-11 18:22:24
标签:无标签

0

Hex文件转BIN

These programs work with Intel HEX, HEX-286, and HEX-386 files and Motorola S-Record S1, S2, S3 files. 

Syntax: HEX2BIN [/option] hexfile [binfile]

hexfile is the Intel HEX input file
binfile is the binary file to create

option  may be any of the following

  /Ln     Binary file length
  /Pn     Pad data for binary file
  /On     Address offset (to add to HEX records)
  /M      Merge data into existing BIN file
  /Q      Quiet mode (no statistics are displayed)
  /X      Don't process ext. segment/linear address records

  /?      This help text
点击下载

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类: 无分类    |    来源: 整理

评论(0) | 阅读(112)
发表于:2008-6-3 23:21:58
标签:无标签

0

ARM---Cortex系列微处理器技术特点

关键字: 架构 内存 代码 浮点
引 言

  随着嵌入式技术应用领域的不断扩展,对嵌入式系统的要求越来越高,而作为嵌入式系统核心的微处理器也面临日益严竣的挑战。ARM公司从成立以来,一直以知识产权(IP,Intelligence Property)提供者的身份出售知识产权,在32位RISC CPU开发领域中不断取得突破,其设计的微处理器结构已经从v3发展到现在的v7。Cortex系列处理器是基于ARMv7架构的,分为Cortex-M、Cortex-R和Cortex-A三类。ARM系列微处理器的核心及体系结构如表1所列。

1 ARM Cortex处理器技术特点

  ARMv7架构是在ARMv6架构的基础上诞生的。该架构采用了Thumb-2技术,它是在ARM的Thumb代码压缩技术的基础上发展起来的,并且保持了对现存ARM解决方案的完整的代码兼容性。Thumb-2技术比纯32位代码少使用31%的内存,减小了系统开销。同时能够提供比已有的基于Thumb技术的解决方案高出38%的性能。ARMv7架构还采用了NEON技术,将DSP和媒体处理能力提高了近4倍,并支持改良的浮点运算,满足下一代3D图形、游戏物理应用以及传统嵌入式控制应用的需求。此外,ARMv7还支持改良的运行环境,以迎合不断增加的JIT(Just In Time)和DAC(DynamicAdaptive Compilation)技术的使用。

  在与早期的ARM处理器软件兼容性方面,ARMv7架构在设计时充分考虑到了。ARM Cortex-M系列支持Thumb-2指令集(Thumb指令集的扩展集),可以执行所有已存的为早期处理器编写的代码。通过一个前向的转换方式,为ARM Cortex-M系列处理器所写的用户代码可以与ARM Cortex-R系列微处理器完全兼容。ARMCortex-M系列系统代码(如实时操作系统)可以很容易地移植到基于ARM Cortex-R系列的系统上。ARMCortex-A和Cortex-R系列处理器还支持ARM 32位指令集,向后完全兼容早期的ARM处理器,包括从1995年发布的ARM7TDMI处理器到2002年发布的ARMll处理器系列。图1为v5~v7架构的处理器技术比较。由于应用领域的不同,基于v7架构的Cortex处理器系列所采用的技术也不相同。

  在命名方式上,基于ARMv7架构的ARM处理器已经不再延用过去的数字命名方式,而是冠以Cortex的代号。基于v7A的称为"Cortex-A系列",基于v7R的称为"Cortex-R系列",基于v7M的称为"Cortex-M3"。

2 ARM Cortex-M3处理器技术特点

  ARM Cortex-M3处理器是为存储器和处理器的尺寸对产品成本影响极大的各种应用专门开发设计的,其结构如图2所示。它整合了多种技术,减少使用内存,并在极小的RISC内核上提供低功耗和高性能,可实现由以往的代码向32位微控制器的快速移植。ARM Cortex-M3处理器是使用最少门数的ARM CPU,相对于过去的设计大大减小了芯片面积,可减小装置的体积或采用更低成本的工艺进行生产,仅33 000门的内核性能可达1.2DMIPS/MHz。此外,基本系统外设还具备高度集成化特点,集成了许多紧耦合系统外设,合理利用了芯片空间,使系统满足下一代产品的控制需求。

  ARM Cortex-M3处理器结合了执行Thumb-2指令的32位哈佛微体系结构和系统外设,包括Nested Vec-tored Interrupt Controller和Arbiter总线。该技术方案在测试和实例应用中表现出较高的性能:在台机电180 nm工艺下,芯片性能达1.2 DMIPS/MHz,时钟频率高达100 MHz。Cortex-M3处理器还实现了Tail-Chaining中断技术。该技术是一项完全基于硬件的中断处理技术,最多可减少12个时钟周期数,在实际应用中可减少70%中断;推出了新的单线调试技术,避免使用多引脚进行JTAG调试,并全面支持RealView编译器和RealView调试产品。RealView工具向设计者提供模拟、创建虚拟模型、编译软件、调试、验证和测试基于ARMv7架构的系统等功能。 为微控制器应用而开发的Cortex-M3拥有以下性能:

  实现单周期Flash应用最优化;

  准确快速地中断处理,永不超过12周期,仅6周期tail-chaining(末尾连锁);

  有低功耗时钟门控(Clock Cating)的3种睡眠模式;

  单周期乘法和乘法累加指令;

  ARM Thumb-2混合的16/32位同有指令集,无模式转换;

  包括数据观察点和Flash补丁在内的高级调试功能;

  原子位操作,在一个单一指令中读取/修改/编写;

  1.25 DMIPS/MHz(与O.9DMIPS/MHz的ARM7和1.1 DMIPS/MHz的ARM9相比)。

  3 ARM Cortex-R处理器技术特点

  ARM Cortex-R系列处理器目前包括ARM Cortex-R4和ARM Cortex-R4F两个型号,主要适用于实时系统的嵌入式处理器。

  3.1 ARM Cortex-R4处理器技术特点

  Cortex-R4处理器结构如图3所示。该处理器支持手机、硬盘、打印机及汽车电子设计,能协助新一代嵌入式产品快速执行各种复杂的控制算法与实时工作的运算;可通过内存保护单元(MPU,Memory Protection Unit)、高速缓存以及紧密耦合内存(TCM,Tightly Coupled Memory)让处理器针对各种不同的嵌入式应用进行最佳化调整,且不影响基本的ARM指令集兼容性。这种设计能够在延用原有程序代码的情况下,降低系统的成本与复杂度,同时其紧密耦合内存功能也能提供更小的规格及更高效率的整合,并带来快速的响应时间。



  Cortex-R4处理器采用ARMv7体系结构,让它能与现有的程序维持完全的回溯兼容性,能支持现今建立在全球各地数十亿的系统;并已针对Thumb-2指令进行最佳化设计。此项特性带来很多的利益,其中包括:更低的时钟速度所带来的省电效益;更高的性能将各种多功能特色带人移动电话与汽车产品的设计;更复杂的算法支持更高性能的数码影像与内建硬盘的系统。运用Thumb-2指令集,加上RealView开发套件,使芯片内部存储器的容量最多得以降低30%,大幅降低系统成本,其速度比在ARM946E-S处理器所使用的Thumb指令集高出40%。由于存储器在芯片中的占用空间愈来愈多,因此这项设计将大幅节省芯片容量,让芯片制造商运用这款处理器开发各种SoC(System on a Chip)器件。相比于前几代的处理器,Cortex-R4处理器高效率的设计方案,使其能以更低的时钟达到更高的性能;经过最佳化设计的Artisan Metro内存,则进一步降低嵌入式系统的体积与成本。处理器搭载一个先进的微架构,具备双指令发送功能,采用90 nm工艺并搭配Artisan Advantage程序库的组件,底面积不到1 mm2,耗电量低于0.27mW/MHz,并能提供超过600 DMIPS的性能。

  Cortex-R4处理器在各种安全应用上加入容错功能和内存保护机制,支持最新版OSEK实时操作系统;支持RealView Develop系列软件开发工具、RealView Create系列ESL工具与模块,以及Core Sight除错与追踪技术,协助设计者迅速开发各种嵌入式系统。

  3.2 ARM Cortex-R4F处理器技术特点

  Cortex-R4F处理器结构如图4所示。该处理器拥有针对汽车市场而开发的各项先进功能,包括自动除错功能、可相互连结的错误侦测机制,以及可选择优化的浮点运算单元(FPU,Floating-Point Unit)。ECC技术能监控内存存取作业,侦测并校正各种错误。当发生内存错误时,ECC逻辑除通报错误并停止系统运作外,还会加以校正。它还拥有Cortex-R4系列的各项先进功能,能够透过高效能内存保护单元、高速缓存,以及紧密耦合内存,使处理器能针对各种不同的应用进行最佳化调整;同时将传统处理器中的错误侦测功能延伸至整个SoC中,系统会不断地扫描先前侦错的资料,以提升系统的可靠度。基于对安全性能的重视,Cortex-R4F处理器特别搭载了高分辨率内存保护机制,能严密控制独立的软件作业。

  Cortex-R4F处理器中执行浮点运算的FPU,提供胜过固定小数点操作数的动态范围及精准度。该FPU与ARM其他处理器核心之间的FPU均维持回溯兼容性,并针对各种汽车应用常见的单精度处理作业进行优化。使用单倍精度格式,而非双倍精度的数值资料,不仅能将数据处理速度提升至2倍,更能维持必要的精度以提高SoC设计的效率。

  Cortex-R4F处理器采用一套具备双指令发送功能的先进微架构,透过ARM Artisan Advantage程序库中针对90 nm工艺的优化,达到超过800 DMIPS的性能水准。Level 1内存松散的时序设计,使组件能使用高密度、低功耗的RAM,使在总成本中占有高比重的内存,能像处理器逻辑一样拥有节省空间的优势。在90 nm工艺下,占用空间不到1 mm2,且耗电量不到0.27 mW/MHz,有效地协助系统开发者降低成本与功耗。该处理器采用ARMv7ISA架构,能与已被全球数十亿台系统所采用的ARM程序代码维持回溯兼容性,并针对Thumb-2指令集进行最优化设计。运用Thumb-2指令,搭配ARM RealView开发套件,使芯片内部存储器的容量最大能缩减30%,大幅降低系统成本。此外,相较于内建在ARM946E-S处理器的旧版Thumb指令集,新技术能够提高40%的工作效能。

4 ARM Cortex-A8处理器技术特点

  ARM Cortex-A8处理器是一款适用于复杂操作系统及用户应用的应用处理器,其结构如图5所示。支持智能能源管理(IEM,Intelligent Energy Manger)技术的ARM Artisan库以及先进的泄漏控制技术,使得Cortex-A8处理器实现了非凡的速度和功耗效率。在65 nm上艺下,ARM cortex-A8处理器的功耗不到300 mW,能够提供高性能和低功耗。它第一次为低费用、高容量的产品带来了台式机级别的性能。

  Cortex-A8处理器是第一款基于下一代ARMv7架构的应用处理器,使用了能够带来更高性能、更低功耗和更高代码密度的Thumb-2技术。它首次采用了强大的NEON信号处理扩展集,为H.264和MP3等媒体编解码提供加速。Cortex-A8的解决方案还包括Jazelle-RCTJava加速技术,对实时(JIT)和动态调整编译(DAC)提供最优化,同时减少内存占用空间高达3倍。该处理器配置了先进的超标量体系结构流水线,能够同时执行多条指令,并且提供超过2.0 DMIPS/MHz的性能。处理器集成了一个可调尺寸的二级高速缓冲存储器,能够同高速的16 KB或者32 KB一级高速缓冲存储器一起工作,从而达到最快的读取速度和最大的吞吐量。新处理器还配置了用于安全交易和数字版权管理的Trust Zone技术,以及实现低功耗管理的IEM功能。

  Cortex-A8处理器使用了先进的分支预测技术,并且具有专用的NEON整型和浮点型流水线进行媒体和信号处理。在使用小于4 mm2的硅片及低功耗的65 nm工艺的情况下,Cortex-A8处理器的运行频率将高于600MHz(不包括NEON追踪技术和二级高速缓冲存储器)。在高性能的90 nm和65 nm工艺下,Cortex-A8处理器运行频率最高可达1 GHz,能够满足高性能消费产品设计的需要。

结 语

  这些新的ARM Cortex处理器系列都是基于ARMv7架构的产品,从尺寸和性能方而来看,既有少于33 000个门电路的ARM Cortex-M系列,也有高性能的ARMCortex-A系列。其中,ARM Cortex-A系列是针对日益增长的,运行包括Linux、Windows,CE和Symbian操作系统在内的消费者娱乐和无线产品设计的;ARM Cortex-R系列针对的是需要运行实时操作系统来进行控制应用的系统,包括汽车电子、网络和影像系统;ARM Cortex-M系列则是为那些对丌发费用非常敏感同时对性能要求小断增加的嵌入式应用(如微控制器、汽车车身控制系统和各种大型家电)所设计的。随着在各种不同领域应用需求的增加,微处理器市场也在趋于多样化。为了适应市场的发展变化,基于ARMv7架构的ARM处理器系列将不断拓展自己的应用领域。

编辑:

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(36)
发表于:2008-5-16 11:50:37
标签:无标签

0

Motorola S-records 16进制文件的常见格式

Motorola S-records 16进制文件的另一种常见格式,Fujitsu平台的Softune编译出来就是这种格式
这篇文章介绍了一下各个数据记录的意义。

The following fairly complete description of Motorola S-records was found a number of years ago on the man pages of a UNIX system.
--------------------------------------------------------------------------------
NAME
srec - S-record file and record format
DESCRIPTION

An S-record file consists of a sequence of specially formatted ASCII character strings. An S-record will be less than or equal to 78 bytes in length.
The order of S-records within a file is of no significance and no particular order may be assumed.

The general format of an S-record follows:

+-------------------//------------------//-----------------------+
| type | count | address | data | checksum |
+-------------------//------------------//-----------------------+

type -- A char[2] field. These characters describe the type of record (S0, S1, S2, S3, S5, S7, S8, or S9).
count -- A char[2] field. These characters when paired and interpreted as a hexadecimal value, display the count of remaining character pairs in the record.

address -- A char[4,6, or 8] field. These characters grouped and interpreted as a hexadecimal value, display the address at which the data field is to be loaded into memory. The length of the field depends on the number of bytes necessary to hold the address. A 2-byte address uses 4 characters, a 3-byte address uses 6 characters, and a 4-byte address uses 8 characters.

data -- A char [0-64] field. These characters when paired and interpreted as hexadecimal values represent the memory loadable data or descriptive information.

checksum -- A char[2] field. These characters when paired and interpreted as a hexadecimal value display the least significant byte of the ones complement of the sum of the byte values represented by the pairs of characters making up the count, the address, and the data fields.

Each record is terminated with a line feed. If any additional or different record terminator(s) or delay characters are needed during transmission to the target system it is the responsibility of the transmitting program to provide them.

S0 Record. The type of record is 'S0' (0x5330). The address field is unused and will be filled with zeros (0x0000). The header information within the data field is divided into the following subfields.


mname is char[20] and is the module name.
ver is char[2] and is the version number.
rev is char[2] and is the revision number.
description is char[0-36] and is a text comment.

Each of the subfields is composed of ASCII bytes whose associated characters, when paired, represent one byte hexadecimal values in the case of the version and revision numbers, or represent the hexadecimal values of the ASCII characters comprising the module name and description.
S1 Record. The type of record field is 'S1' (0x5331). The address field is intrepreted as a 2-byte address. The data field is composed of memory loadable data.

S2 Record. The type of record field is 'S2' (0x5332). The address field is intrepreted as a 3-byte address. The data field is composed of memory loadable data.

S3 Record. The type of record field is 'S3' (0x5333). The address field is intrepreted as a 4-byte address. The data field is composed of memory loadable data.

S5 Record. The type of record field is 'S5' (0x5335). The address field is intrepreted as a 2-byte value and contains the count of S1, S2, and S3 records previously transmitted. There is no data field.

S7 Record. The type of record field is 'S7' (0x5337). The address field contains the starting execution address and is intrepreted as 4-byte address. There is no data field.

S8 Record. The type of record field is 'S8' (0x5338). The address field contains the starting execution address and is intrepreted as 3-byte address. There is no data field.

S9 Record. The type of record field is 'S9' (0x5339). The address field contains the starting execution address and is intrepreted as 2-byte address. There is no data field.

EXAMPLE

Shown below is a typical S-record format file.

S00600004844521B
S1130000285F245F2212226A000424290008237C2A
S11300100002000800082629001853812341001813
S113002041E900084E42234300182342000824A952
S107003000144ED492
S5030004F8
S9030000FC
The file consists of one S0 record, four S1 records, one S5 record and an S9 record.

The S0 record is comprised as follows:

S0 S-record type S0, indicating it is a header record.
06 Hexadecimal 06 (decimal 6), indicating that six character pairs (or ASCII bytes) follow.
00 00 Four character 2-byte address field, zeroes in this example.

48 44 52 ASCII H, D, and R - "HDR".
1B The checksum.
The first S1 record is comprised as follows:
S1 S-record type S1, indicating it is a data record to be loaded at a 2-byte address.
13 Hexadecimal 13 (decimal 19), indicating that nineteen character pairs, representing a 2 byte address, 16 bytes of binary data, and a 1 byte checksum, follow.
00 00 Four character 2-byte address field; hexidecimal address 0x0000, where the data which follows is to be loaded.
28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C Sixteen character pairs representing the actual binary data.
2A The checksum.
The second and third S1 records each contain 0x13 (19) character pairs and are ended with checksums of 13 and 52, respectively. The fourth S1 record contains 07 character pairs and has a checksum of 92.

The S5 record is comprised as follows:

S5 S-record type S5, indicating it is a count record indicating the number of S1 records
03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow.
00 04 Hexadecimal 0004 (decimal 4), indicating that there are four data records previous to this record.
F8 The checksum.
The S9 record is comprised as follows:

S9 S-record type S9, indicating it is a termination record.
03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow.
00 00 The address field, hexadecimal 0 (decimal 0) indicating the starting execution address.
FC The checksum.


--------------------------------------------------------------------------------

Instructor Notes
There isn't any evidence that Motorola ever has made use of the header information within the data field of the S0 record, as described above. This must have been used by some third party vendors.
This is the only place that a 78-byte limit on total record length or 64-byte limit on data length is documented. These values shouldn't be trusted for the general case.
The count field can have values in the range of 0x3 (2 bytes of address + 1 byte checksum = 3, a not very useful record) to 0xff; this is the count of remaining character pairs, including checksum.
If you write code to convert S-Records, you should always assume that a record can be as long as 514 (decimal) characters in length (255 * 2 = 510, plus 4 characters for the type and count fields), plus any terminating character(s). That is, in establishing an input buffer in C, you would declare it to be an array of 515 chars, thus leaving room for the terminating null character.

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(130)
发表于:2008-4-19 0:14:58
标签:无标签

0

AT指令

根据V.25TER的AT指令概要(Overview of AT Commands According to V.25TER)
A/  重新发送最后给的AT指令(Reissues the last command given)
ATA 接听外来电话  (ANSWER INCOMING CALL)
ATD 向外拨打电话   (MOBILE ORIGINATED CALL TO DIALABLE NUMBER)
ATDL 重拨上次拨打的电话号码 (REDIAL LAST TELEPHONE NUMBER USED)
ATE 设置回声模式 (SET COMMAND ECHO MODE)
ATH 断开现有连接/挂断电话(DISCONNECT EXISTING CONNECTION)
ATI 显示产品的标志信息(DISPLAY PRODUCT IDENTIFICATION INFORMATION)
ATL 设置监听话筒大声(SET MONITOR SPEAKER LOUDNESS)
ATM 设置监听话筒模式(SET MONITOR SPEAKER MODE)
+++ 从数据模式或PPP上网模式回到命令模式(SWITCH FROM DATA MODE OR PPP ONLINE MODE TO COMMAND MODE)
ATO 从命令模式回到数据模式(SWITCH FROM COMMAND MODE TO DATA MODE)
ATP 选择脉冲拨号(SELECT PULSE DIALLING)
ATQ 设定结果代码颁布方式 (SET RESULT CODE PRESENTATION MODE)
ATS0 设置在接电话前的响铃次数(SET NUMBER OF RINGS BEFORE AUTOMATICALLY ANSWERING THE CALL)
ATS3 设置命令行终止字符(SET COMMAND LINE TERMINATION CHARACTER)
ATS4 设置响应初始化字符(SET RESPONSE FORMATTING CHARACTER)
ATS5 设置命令行编辑特性(SET COMMAND LINE EDITING CHARACTER)
ATS6 设置停止在盲目拨号之前(SET PAUSE BEFORE BLIND DIALLING)
ATS7 设置等待连接完成的秒数(SET NUMBER OF SECONDS TO WAIT FOR CONNECTION COMPLETION)
ATS8 设置当遇到逗号,拨出被修改者使用等待的秒数(SET NUMBER OF SECONDS TO WAIT WHEN COMMA DIAL MODIFIER USED)
ATS10 设置在表明没有数据传送后断开延迟(SET DISCONNECT DELAY AFTER INDICATING THE ABSENCE OF DATA CARRIER)
ATT 选择音频(SELECT TONE DIALLING)
ATV 设置结果代码格式方式(SET RESULT CODE FORMAT MODE)
ATX 设置连接结果码格式和呼叫监视(SET CONNECT RESULT CODE FORMAT AND CALL MONITORING)
ATZ 设定用户定义当前所有参数(SET ALL CURRENT PARAMETERS TO USER DEFINED PROFILE)
AT&C 设置DCD功能模式(SET DCD FUNCTION MODE)
AT&D 设置DTR功能模式(SET DTR FUNCTION MODE)
AT&F 设置缺省制造商当前所有参数(SET ALL CURRENT PARAMETERS TO MANUFACTURER DEFAULTS)
AT&V 显示当前配置(DISPLAY CURRENT CONFIGURATION)
AT&W 存储用户定义的当前参数(STORE CURRENT PARAMETER TO USER DEFINED PROFILE)
AT+DR V.42bis数据压缩控制报告(V.42BIS DATA COMPRESSION REPORTING CONTROL)
AT+DS V.42bis 数据压缩控制(V.42BIS DATA COMPRESSION REPORTING CONTROL)
AT+GCAP 请求完成电讯能力清单(REQUEST COMPLETE TA CAPABILITIES LIST)
AT+GMI 要求制造商鉴定(REQUEST MANUFACTURER IDENTIFICATION)
AT+GMM 请求电讯模型鉴定(REQUEST TA MODEL IDENTIFICATION)
AT+GMR 请求电讯修改鉴定(REQUEST TA REVISION IDENTIFICATION)
AT+GOI 请求全球性对象鉴定(REQUEST GLOBAL OBJECT IDENTIFICATION)
AT+GSN 请求电讯序号标志(IMEI)(REQUEST TA SERIAL NUMBER IDENTIFICATION (IMEI))
AT+ICF 设置特讯控制性构筑(SET TE-TA CONTROL CHARACTER FRAMING)
AT+IFC 设置特讯本地流量控制(SET TE-TA LOCAL DATA FLOW CONTROL)
AT+ILRR 设置特讯本地速率报告模式(SET TE-TA LOCAL RATE REPORTING MODE)
AT+IPR 设定当地固定速率(SET FIXED LOCAL RATE)

在TCPIP 应用上的AT指令(AT Commands for TCPIP Application Toolkit)
AT+CIPSTART 启动TCP或UDP的连接(START UP TCP OR UDP CONNECTION)
AT+CIPSEND 发送数据通过TCP或UDP的连接(SEND DATA THROUGH TCP OR UDP CONNECTION)
AT+CIPCLOSE 关闭连接(CLOSE CONNECTION)
AT+CIPSHUT 撤销GPRS PDP 环境(DEACTIVATE GPRS PDP CONTEXT)
AT+CLPORT 设置本地端口(SET LOCAL PORT)
AT+CSTT 设置APN, 用户名, 密码(SET APN, USER NAME, PASSWORD)
AT+CIICR 提出与GPRS 或CSD 的无线连接(BRING UP WIRELESS CONNECTION WITH GPRS OR CSD)
AT+CIFSR 获得本地IP地址(GET LOCAL IP ADDRESS)
AT+CIPSTATUS 查询当前的连接状态(QUERY CURRENT CONNECTION STATUS)
AT+CDNSCFG 配置域名服务器(CONFIGURE DOMAIN NAME SERVER)
AT+CDNSGIP 查询所给出域名的IP地址(QUERY IP ADDRESS OF GIVEN DOMAIN NAME)
AT+CDNSORIP 连接用IP 地址或域名服务器(CONNECT WITH IP ADDRESS OR DOMAIN NAME SERVER)
AT+CIPHEAD 接收数据时加上一个IP头(ADD AN IP HEADER WHEN RECEIVING DATA)
AT+CIPATS 设置自动送出时间(SET AUTO SENDING TIMER)
AT+CIPSPR