ARM随笔

来源:互联网 发布:mp3播放软件 编辑:程序博客网 时间:2024/06/06 08:47

ARM随笔

小生只是一个接触ARM23年经历的人。并不是什么高手,只是在上面编程

的时候遇到了很多跟x86不一样的东西,自己想记录一下,仅此而已。

数据访问

认识ARM是从Pocket PC开始的,那时候写的一个程序在模拟器上面跑得好好的,到了机器就不行。后来发现,我们的程序使用了pack(1),然后使用了一个pStt->usItem1= xxxx,然后程序就出了一个非法访问的错误。刚开始百思不得其解,后来发现那个成员是unsigned short类型的而他的头地址为基数,ARM架构里面,有一些编译器(如微软的编译器)是允许读地址为基数的unsigned short数据的,或者是地址不为4整除的32位数据,但是不允许写入地址为基数的unsigned short数据的,或者是地址不为4整除的32位数据。不过经典的ADS编译器和其他的一些编译器是也不允许读这样的数据。ADS编译器很奇怪,如果一个32位的数据,他的地址不被4整除,而你去读取他的时候,得到的值不是你想象中的那个值。如unsigned long ll=*((unsigned long *)2);这时候ll里面的实际值不是*((unsigned long *)2),而是*((unsigned long *)0)或者是*((unsigned long *)4),具体是哪个我记不清楚了,好像是*((unsigned long *)4)

更有甚者,gccARM编译器,他的结构体的大小是必须4整除的。记得我们有一次把我们的程序移植到一个linux上面,怎么跑都不对,后来发现有一个结构体

typedef struct __phrase{

    unsigned short index:15;

    unsigned short next:1

}PHRASE;

ADSVC计算的sizeof(PHRASE)都是2,而在gcc for ARM中为4。后来才知道gcc for ARM结构体的大小是必须4整除的,Symbian和嵌入式Linux一般都是使用gcc,所以在上面开发的人一定要注意。

还有一般来说对于全局的数据,链接器都会把它的头地址放在4整除或者8整除的地方,但是ADS有时候会把unsigned char数组的头地址放在基数开头的地址里面,估计是根据编译或者链接选项而定。如果你想在一个unsigned char 数组里面保存很多数据的话,那你就要小心了,如果你的数据里面包含unsigned long类型的数据,那你的数组最好保存为unsigned long类型,而不是unsigned char类型。

ROMRAM

ARM系列的程序中,数据和程序是分开,准确来说,ROMRAM的数据是分开存放的。ROM的数据包括代码和程序中const的数据,RAM主要是static变量、全局变量、堆和栈。

ARMCPU(其他的单片机也一样)跟X86不一样的是,他们的ROM数据一般是在Flash上面,CPU是可以直接访问Flash,而不需要把ROM里面的数据读入到RAM里面。而X86的机器,硬盘的东西是需要读入到内存里面才可以被CPU访问的。

对于用于手机的一些平台来说,ROM一般会比较大,目前普通手机一般使用的都是8MBFlash,也有4MB16MB的,而RAM则会比较紧张,小的是512KB,一般来说是2MB。所以对于程序里面的不可更改的数据,使用const修饰符就很重要了。

AXD

AXD是个非常好用的调试器,它跟MS的模拟器不一样的是,它直接模拟了一个CPU(VS2005的模拟器可能也是这样的),它直接运行ADS编译出来的二进制代码;不像Windows Mobile 2003的模拟器,模拟器的代码和Device上面的代码是不一样,调完了模拟器的代码还要到Device上面调试。所以一般来说,一些算法上面的问题可以直接AXD上面调试,当然初步的调试应该在MS的开发环境里面调试,代码移植到Device之后,应该到AXD上面运行一下,如果正常的话,再下载到Device上面。

我在AXD上面曾经遇到过一个问题,不知道怎么了,AXD上面的所有按钮和几乎所有的菜单都被disabled;卸载之后重新安装也没有解决问题,后来到Options里面的Configure Target弄了一下,选了ARMUL就好了。

      

原创粉丝点击