今日调试某公司的PXA270的LCD实验代码。一个字,烂~代码可读性极差,程序结构混乱,还有一大堆垃圾代码和垃圾源文件。
对垃圾代码和垃圾源文件清除后,程序编译通过,并且能加载到SDRAM正确运行。
程序主要是在LCD上显示几个汉字,并变换背景色。
虽然可以加载到SDRAM中正确运行,但是如果设置-ro-base=0x00000000,-rw-base=0xa0000000,编译为二进制映像文件加载到FLASH中运行时,可以正常变换背景色,但不能正常显示汉字,显示汉字的区域变为黑白相间的方形块。
仔细检查程序以及对LCD的初始化、取数送数等操作,没有任何问题。
将程序加载到SDRAM中进行调试(设置-ro-base=0xa0000000),观察帧描述符、帧缓冲区域是否正确初始化,发现一切正常。另外检查了汉字数据的存储区域——在程序中,一个汉字被编码为一个数组,然后,函数从数组中读取数据,解码后对汉字区域逐个象素进行点亮(逐个对象素点亮的操作实际上是对相应坐标处的象素点送raw pixel data,因此也相当于从frame buffer中取数送LCD控制器)。这些数组是作为全局变量(数组值为常量)使用的。在AXD中的Low Level Symbols窗口中,可以找到汉字数组名符号对应的地址,就是该数据的存储地址(观察结果为0xa000064c)。在Memory窗口中观察相应存储地址的内容,发现与数组定义相吻合。
一切都没有破绽,那么为什么把程序烧到FLASH中就不能正常显示汉字呢?
后来终于想到,汉字数组如果作为全局常量,是作为RO DATA放到RO段的,而设置-ro-base=0x00000000后,这些数据实际上就被放到了FLASH中,是否因为这个原因使得从FLASH中读取数据的速度跟不上造成的呢?
于是,可以将汉字数组定义为局部变量,即把定义汉字数组的语句搬到使用它们的函数的内部,这样,数组名被作为一个指针变量处理,放到SDRAM的堆栈中,在进入该子函数时,数组的初始化值也被保存到栈区(SDRAM中)。重新编译下载到FLASH中,汉字显示正常。
这也直观地反映出FLASH的读取速度远远赶不上SDRAM,更不用提写数据的速度了。
当一个程序在SDRAM中调试通过或运行正常,而下载到FLASH中却运行异常时,自然就要从SDRAM与FLASH的差别上来考虑了。在硬件没有故障的情况下,软件上可以考虑以下几点:一是程序下载到FLASH后是否能正常启动,检查地址设置和启动代码;二是系统正常启动后观察程序运行症状分析问题,FLASH与SDRAM的特性差异尤其是存取速度必须要考虑进来。
阅读(2517) | 评论(1) | 转发(0) |