嵌入式系统中信息表示需要了解的基本知识•进位计数制与转换–二进制、十进制、十六进制以及相互转换•计算机中数的表示–原码、反码、补码–定点数:纯小数、纯整数–浮点数:尾数、阶数以及IEEE相关标准需要了解的知识(2)•非数值数据编码–字符和字符串的表示(ASCII码,字符串的存放)–汉字的表示方法,输入方法–统一代码(unicode)需要了解的知识(3)–语音编码•音调、音强和音色•波形采样量化•采样量化的技术参数–采样频率–测量精度–声道数差错控制编码在通信过程中,经常会产生错误。产生错误的原因包括:•信道的电气特性引起信号的幅度、频率、相位的畸变;•信号反射;•串扰;•闪电、大功率电机的开关等。•线路传输差错是不可避免的,但要尽量减小其影响。通信双方可采取的对策是:接收方进行差错检测,并向发送方应答,告知是否正确接收。奇偶校验(ParityChecking)•在原始数据字节的最高位增加一个附加比特位,使结果中1的个数为奇数(奇校验)或偶数(偶校验)。增加的位称为奇偶校验位。–例如,原始数据=1100010,采用偶校验,则增加校验位后的数据为11100010。若接收方收到的字节奇偶结果不正确,就可以知道传输中发生了错误。汉明码(海明码)•奇偶校验码只有一位监督位,只能指明有、无差错两种情况,故只能检错。为了纠错,必须增加监督位。汉明码是一种能纠正单比特差错的线性分组码。为了纠错,不仅要指明有奇偶差错,还要能确定差错的位置。•汉明码是1950年由美国贝尔实验室提出来的,是一种多重奇偶检错系统。•设线性分组码(n,k),有k个信息位,r=n-k个监督位。为了能确定n种位置上的差错及线性无差错,要求r的值为:2r≥n+1=k+r+1,即2r-r≥k+1–例如,k=7(7位ASCII字符),则r=4,汉明码长n=7+4=11。–如果k=15呢?•在汉明码字中,比特位从最左边位(位号为1)开始依次编号。位号为2的幂的位(1,2,4,8…)是r个监督位(也称为汉明比特),其余位(3,5,6,7,9…)是k个信息位。–例如,7个信息位为D1D2D3D4D5D6D7,则汉明码表示为:码位号1234567891011码位P1P2D1P3D2D3D4P4D5D6D7•校验子错码位置的对应关系错码位号汉明码位S4S3S2S11P100012P200103D100114P301005D201016D301107D401118P410009D5100110D6101011D71011无错码•写出校验子的表达式:–S1=P1^D1^D2^D4^D5^D7–S2=P2^D1^D3^D4^D5^D7–S3=P3^D2^D3^D4–S4=P4^D5^D6^D7•可以得出监督位的表达式:–P1=D1^D2^D4^D5^D7–P2=D1^D3^D4^D5^D7–P3=D2^D3^D4–P4=D5^D6^D7•以某一字符的ASCII码1100011为例,加以说明。先填入表中,如下图:•将码位中为1的码位号表示为二进制码,再按模2加求和,和为0111,即监督位。•将收到的汉明码中为1的各位码位号表示为二进制码,再按模2求和,无误码则为0。•若收到的汉明码为11110000011,结果如何?码位号1234567891011码位P1P21P3100P4011码位号1234567891011码位11111000011循环冗余校验(CRC)•基本原理:在k位信息码后再拼接r位的校验码,整个编码长度n位。对于给定的(n,k)码,可以证明存在一个最高次幂为n-k=r的多项式g(x),根据g(x)可以生成k位信息的校验码,而g(x)叫做这个CRC码的生成多项式。几个基本概念•多项式与二进制数码–A(x)=x5+x4+x2+1可以转换为二进制码组110101。•生成多项式:生成多项式g(x)是接收端和发送端的一个约定。应满足以下几个条件:–生成多项式的最高位和最低位必须为1–当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使余数不为0。–不同位发生错误时,应该使余数不同。–对余数继续做模2除,应使余数循环。•模2除FCS帧检验序列•将信息位后面添加的r位校验码,称为信息的FCS帧校验序列(FrameCheckSequence)。•求得FCS的方法:假设发送的信息用多项式C(x)表示,将C(x)左移r位,则可表示成C(x)*2r,这样C(x)右边就会空出r位,这就是校验码的位置。通过C(x)*2r除以生成多项式g(x)得到的余数就是校验码。–例子:信息码为11100110,生成多项式为11001,采用CRC进行差错检测,求FCS的产生过程。CRC码的编码方法•将x的最高幂次为r的生成多项式g(x)转换成对应的r+1位二进制数。•将信息码左移r位,相当于对应的多项式C(x)*2r。•用生成多项式对信息码模2除,得到r位的余数——FCS帧校验序列。•将余数拼到信息码左移后空出的位置,得到完整的CRC码。CRC码的出错模式(G(x)=1011)收到的CRC码字余数出错位码位A7A6A5A4A3A2A1正确1010011000无错误10100100011101000101021010111100310110110114100001111051110011111600100111017若收到的码字为1010111结果如何?如何纠错?ARM处理器中的信息表示•首先说明的问题:–51单片机是8位的处理器,即指令代码为8位,以及可进行8位的数据处理(ALU)。–对于32位的ARM处理器来说,情况就复杂一些。它既可以运行32位的ARM指令系统,也可以运行16位的Thumb(拇指)指令系统。另一方面,它既可以处理32位数据,也可以处理16位数据和8位数据。•由于我们习惯于用8位作为一个单位(字节)来存储数据,每个存储单元分配一个存储地址,这样8位的51系统对指令的读取和数据的访问都只针对一个地址值。而在32位的ARM处理器中,32位指令要使用4个地址单元,16位指令要使用两个地址单元。•这样引出了一个问题:所存储的数据的排列问题。先来看一段51单片机的代码,回顾一下51系统中的指令存放情况:00FBHC3CLRC00FCHEFMOVA,R700FDH33RLCA00FEHFFMOVR7,A00FFHEEMOVA,R60100H33RLCA0101HFEMOVR6,A0102HE9MOVA,R10103H33RLCA0104HF9MOVR1,A0105HE8MOVA,R00106H33RLCA•对于ARM这样的结构,每个数据(或指令代码)要占4个存储单元(32位)或2个存储单元(16位),ARM规定有两种存储格式:–一种为大端(big-ending)格式–另一种称为(little-ending)格式小端存储格式位…2423…1615…87…0字节A+3字节A+2字节A+1字节A半字A+2的高字节半字A+2的低字节半字A的高字节半字A的低字节存储地址0x00030x00020x00010x0000注:这个例子中存储一个字(两个半字),一个称为半字A,另一个称为半字A+2。以小端格式存储作答存储值2A36478B6374AC9E008F2366C3A8地址0x000D0C0B0A09080706050403020100半字半字7半字6半字5半字4半字3半字2半字1字字3字2字1半字1的地址是多少?值是多少?半字6的地址是多少?值是多少?字2的地址是多少?值是多少?大端存储格式位…2423…1615…87…0字节A字节A+1字节A+2字节A+3半字A的低字节半字A的高字节半字A+2的低字节半字A+2的高字节存储地址0x00030x00020x00010x0000注:这个例子中存储一个字(两个半字),一个称为半字A,另一个称为半字A+2。以大端格式存储作答存储值2A36478B6374AC9E008F2366C3A8地址0x000D0C0B0A09080706050403020100半字半字8半字5半字6半字3半字4半字1半字2字字3字2字1半字1的地址是多少?值是多少?半字6的地址是多少?值是多少?字2的地址是多少?值是多少?两种格式的说明和比较•对于字的存储来说,两种存储中字的存储地址没有差异,都是从低地址向高地址排列,但数据不一样。•半字的存储位置发生了变化。•字节的存储也发生了变化。•ARM处理器虽然有两种存储的结构,但不一定有两种格式的选择。在硬件逻辑中有一个输入逻辑(BRGEND),存储格式是由外围模块控制这个输入逻辑决定的。•在很多处理器中,存储格式是固定的。如X86构架用大端存储,而PPC用小端存储。思考题•存储器内的内容为:•如果是小端存储,3个字从高到低分别是?•如果是大端存储,3个字从高到低分别是?•如果是小端存储,6个半字从高到低分别是?data204A50CC89217320C02FFF3Aaddr0B0A09080706050403020100再来看一段51单片机的代码,说明地址有效性的问题:0800H00NOP0801H7404MOVA,#04H0803H7D2FMOVR5,#2FH0805H2DADDA,R50806H0DINCR50807H2DADDA,R50808H7590FFMOVP1,#0FFH如果从0802H开始读取指令,指令代码为04(INCA),这是一个错误的操作。这种错误常常发生在程序跳转的时候。地址对准•在ARM中,通常把正确的地址入口称为地址对准(alignment)。它包括字对准、半字对准。即32位时地址后两位为0,16位半字时地址最后一位为0。•不但对于指令要注意地址对准问题,对于数据的操作也要注意地址对准问题。非对准情况下可能出现的结果•结果无法预测。•忽略非对准的地址地位。•在对存储器访问时,由存储器做如下处理:字访问忽略地址最后两位,半字访问忽略地址最后一位。•究竟产生哪一种结果取决于处理器所执行的指令,而不是哪款处理器有统一的处理结果。