问答题 阅读下列说明,回答问题1至问题3,将答案填入答题纸的对应栏内。【说明】 某公司承接了一个数据处理模块的项目,由沈工负责模块的方案设计,沈工的设计方案如图4-1所示。该数据处理模块以PowerPC处理器为核心,设计了存储器、以太网、温度传感器、调试接口等功能电路。 处理器外接FLASH存储器用于存储上电初始化程序和应用程序。处理器通过12C接口连接测温电路,监控模块的工作温度。以太网、串口、调试离散量等用于软件调试和状态显示。 测温电路选用ADT7461AR芯片,用于测试模块温度。ADT7461AR是一个双通道数字温度计,工作电压3v至5v,具有低/超温报警功能,采用IzC接口实现主机对远程/本地温度数据的采集,采集数据存储在高/低两个数据寄存器中,每个寄存器为16位,高寄存器表示整数值,低寄存器表示小数值。存储模块采用某公司的FLASH存储芯片。支持编程、擦除、复位等操作命令。该FLASH芯片的常用命令序列如表4-1所示。表中的地址和数据皆为16进制数。
问答题 ADT7461AR芯片支持两种测温模式,其中第一种模式为二进制模式,用0表示0度,测温范围为0℃~+127℃;第二种模式为偏移二进制模式,用64表示0度,测温范围为一55℃~+150℃,温度数据转换关系如表4-2所示。 请在(1)~(4)处写出对应温度的二进制数。
【正确答案】正确答案:(1)0011 0110 0000 0000 (2)0000 0000 0100 0000 (3)0100 0001 0000 0000 (4)0011 0010 0000 0000
【答案解析】解析:计算机模拟量是指变量在一定范围连续变化的量,也就是在一定范围(定义域)内可以取任意值(在值域内)。模拟量输入是指输入为连续变化的物理量。与之相对的是数字量,数字量是分立量,而不是连续变化量,只能取几个分立值,如二进制数字变量只能取两个值。 本题中采用的是ADT7461AR芯片,在工作时的电压信号就属于模拟信号,因为在任何情况下被测温度都不可能发生突跳,所以测得的电压信号无论在时间上还是在数量上都是连续的。而且,这个电压信号在连续变化过程中的任何一个取值都是具体的物理意义,即表示一个相应的温度。芯片采集模拟量输入信号,然后用二进制表示出来,由设备驱动程序通过读取芯片的寄存器,获取温度值。温度值的精度取决于芯片寄存器的位数,精度越高,位数越多,把这个模拟量表示的越细,结果也就越精准。 由题干得知,该芯片的采集数据存储在高/低两个数据寄存器中,高寄存器表示整数值,低寄存器表示小数值。 当芯片工作在第一种模式(即二进制模式时),由于测温范围为0℃至+127℃,则高8位寄存器从0到127,表示0℃~+127℃,而低8位寄存器表示小数值,每一位分别表示2 -1 ℃、2 -2 ℃、2 -3 ℃、2 -4 ℃、2 -5 ℃、2 -6 ℃、2 -7 ℃、2 -8 ℃,表示精度为2 -8 ℃。所以+0.25℃高位为0,低位为0100 0000;+50℃高位为0011 0010,低位为0。 当芯片工作在第二种模式,即偏移二进制模式时,用64表示0度。由于测温范围为一55℃~+150℃,则高8位寄存器从9(64-55)到214(64+150),表示一55℃~+150℃,而低8位寄存器表示小数值,表示含义和精度同第一种模式。所以一10℃高位为00110110,低位为0;+1℃高位为0100 0001,低位为0。
问答题 沈工用C语言实现对FLASH的操作,需按照表4-1中定义的命令序列顺序执行即可。仔细阅读下列代码,请在(1)~(4)处将对应的C语言代码补全。/*定义宏FLASH_BASE_ADDRESS为FLASH芯片的基地址*/: #define FLASH_BASE_ADDRESS XXXXXXXX(此处代码略) /*定义向FLASH空间写一个命令的宏*/ #de fine FLASH_WRITE_BYTE(addr,data)XXXXXXXX(此处代码略) /*Reset Flash*/ Void ResetFlash(VOid) { FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS,0xF0); return; } /*对FLASH的擦除是按扇区进行的,SectorErase函数每次可擦除一个扇区。假设某扇区的偏移地址为offset_addr,下面SectorErase函数体为擦除该扇区的命令序列*/ void SectorErase(int offset_addr) { FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS+0x555,0xAA); FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS+(1),0x55); FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS+0x555,(2)); FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS+0x555,0xAA); FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS+0x2AA,0x55); FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS+(3),(4)); return; }
【正确答案】正确答案:(1)0x2AA (2)0x80 (3)offset_addr (4)0x30
【答案解析】解析:本题中采用的FLASH芯片为NOR FLASH,NOR FLASH是很常见的一种存储芯片,数据掉电不会丢失。NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行)。因此,在嵌入式系统中,NOR FLASH很适合作为启动程序的存储介质。NOR FLASH的读取和RAM很类似(只要能够提供数据的地址,数据总线就能够正确的给出数据),但不可以直接进行写操作。对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。 FLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元,对有些大容量的FLASH,还分为不同的BANK,每个:BANK包括一定数目的SECTOR。FLASH的擦除操作一般都是以SECTOR、BANK或是整片FLASH为单位的。 在对FLASH进行写操作的时候,每个位可以通过编程由1变为0,但不可以由0修改为1。为了保证写操作的正确性,在执行写操作前,都要执行擦除操作,擦除操作会把FLASH的一个SECTOR、一个BANK或是整片FLASH的值全修改为0xFF,这样写操作就可以正确完成了。 FLASH芯片一般都支持编程、擦除、复位等操作命令,命令序列可参考芯片厂家提供的用户手册。本项目中根据芯片手册提供的常用命令序列表,可知SECTOR擦除操作共需要6个周期的总线写操作完成,命令序列如下: 1)将OxAA写到FLASH芯片地址0x555; 2)将0x55写到FLASH芯片地址0x2AA; 3)将0x80写到FLASH芯片地址0x555; 4)将OxAA写到FLASH芯片地址0x555; 5)将0x55写到FLASH芯片地址0x2AA; 6)将0x30写到要擦除的SECTOR对应的地址。
问答题 该嵌入式系统对处理的性能要求较高,沈工在完成软件设计后,需要对每一个函数的执行性能进行测试,检测其是否满足系统设计的要求。沈工通过PowerPC处理器内部的高精度时钟寄存器(TimeBase)进行计时,该寄存器由高低两个32位的寄存器组成,根据总线频率自动递增,当低32位寄存器递增到0xFFFFFFFF时,向高32位寄存器进位。计数值可以换算成时间值,精确到微秒级。 在功能函数functionlO的执行体前后,进行时间统计,最后计算出该函数的执行时间值,请在(1)~(2)处将对应的C语言代码补全。 S truct timeBase { uns igned int upper; unsigned int lower; };Void function1(Void) { struct timeBase tb0,tb1,tb2; long Value; /*获取TimeBase寄存器中的计数值*/ TimeBaseGet(&tb0.upper,&tb0.lower);/ /* 函数执行体…. */ /*再次获取TimeBase寄存器中的计数值*/ TimeBaseGet(&tb1.upper,&tbl.lower); tb2.upper=tb1.upper—tb0.upper; /*当低32位计数值未反转,则直接进行计算,否则需借用高位进行计算*/ if ( tb1.lower >= tb0.lower ) { tb2.lower=(1); } else { tb2.upper一=1; tb2.lower=(2); } /*根据总线频率,将时钟节拍转换为时间值*/ value=CountToUs (tb2); printf(”%s cost time%dus.\n”,__function__,Value); }
【正确答案】正确答案:(1)tb1.lower-tb0.lower (2)0xFFFFFFFF-tb0.lower+tb1.lower+1
【答案解析】解析:Power Architecture的处理器提供了一个名为Time Base(TB)的计数寄存器,它用来记录系统时间。TB寄存器会以一种依赖于实现的总线频率周期性地增加,这个频率可能不是恒定的。操作系统(OS)要负责确定更新频率是否发生了变化,以及对内部结构进行必要的调整,从而将计数值换算为绝对时间值。一般TB寄存器的计时精度可以达到微妙级。 本项目中用一个包含高低两个32位整型数的结构体来存储TB寄存器的值。当低32位寄存器发生溢出时,处理器会自动向高32寄存器加1。通过插桩的方式测量函数的执行时间时,需要在功能函数functionl()的执行体前后,分别两次获取TB寄存器的值,最后计算两次的差值,即为该函数的执行时间值。本题中tb0为函数进入时的TB值,tb1为函数退出前的TB值,tb2为tb1和tb0的差值,即函数的执行时间。 当tb1的低32位大于等于tb0的低32位时,tb2的高位等于tb1的高位与tb0的高位的差值,tb2的低位等于tb1的低位与tb0的低位的差值。 当tb1的低32位小于tb0的低32位时,则需借用高位进行计算。tb2的高位等于tb1高位与tb0高位的差值再减1,tb2的低位等于0xFFFFFFFF-tb0的低位+tb1的低位再加1。